memorySegment.asByteBuffer().duplicate() causes multi-MB allocations
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Wed Oct 26 09:18:56 UTC 2022
Uhm I don't have all that data that you seem to have in your image :-(
My memory view looks empty. There is no allocation, and if I explicitly
go and look I see 6-7 allocations in total :-)
Is the recording you shared the same you are looking at?
Maurizio
On 26/10/2022 10:11, Sebastian Stenzel wrote:
> Thanks for taking a look.
>
> Please note that I'm not looking for a memory leak here: The objects
> are short-living (within the scope of a method) and no two instances
> exist at the same time, hence no increase in heap size.
>
> Instead, what got me wondering was the mismatch between the amount of
> memory allocated for a rather small number of objects (740 MiB for 141
> DirectByteBuffers). At least the record only contains these 72
> allocations via `ByteBuffer.duplicate()` + 69
> `NativeMemorySegmentImpl.makeByteBuffer()`. I'm looking at this chart:
> https://static.cryptomator.org/tmp/before890035c.png
> <https://urldefense.com/v3/__https://static.cryptomator.org/tmp/before890035c.png__;!!ACWV5N9M2RV99hQ!JckaBSJm5So1bCqFKc-DKIJwby_3IL0NrwJF28uq06RV8KF5cODe9zClnOFenKodB7r-jU1KwoEwrH3lNJ9ee622dbMqw0eIuQ$>
>
> I have very limited experience with JFR and JMC and don't know if it
> is profiling of sampling allocations. But maybe the events are
> incomplete and I'm in fact dealing with thousands of instances?
>
>
>> On 26. Oct 2022, at 10:53, Maurizio Cimadamore
>> <maurizio.cimadamore at oracle.com> wrote:
>>
>> Looking at this recordings with JMC is inconclusive.
>>
>> All I see is that your app seems to be using up to 20MB heap, which
>> seems rather low.
>>
>> The number of live objects, at least according to the tool is a
>> handful (< 10).
>>
>> I don't see anything here indicating a problem? (but maybe I'm
>> looking in the wrong place?)
>>
>> Maurizio
>>
>> On 25/10/2022 15:15, Sebastian Stenzel wrote:
>>> Ok so here are the recordings:
>>>
>>> with duplicate():
>>> https://static.cryptomator.org/tmp/before890035c.jfr
>>> <https://urldefense.com/v3/__https://static.cryptomator.org/tmp/before890035c.jfr__;!!ACWV5N9M2RV99hQ!JDzHI5oiHSZJaLRKXbpqU6kqSKHSD0yZEIW8lQT4wRJq0M-_iS6Kz59xcSpcX_sMupZlUpzmv9uLpTNulFGUEIRVe93lmH_Uzw$>
>>> without: https://static.cryptomator.org/tmp/after890035c.jfr
>>> <https://urldefense.com/v3/__https://static.cryptomator.org/tmp/after890035c.jfr__;!!ACWV5N9M2RV99hQ!JDzHI5oiHSZJaLRKXbpqU6kqSKHSD0yZEIW8lQT4wRJq0M-_iS6Kz59xcSpcX_sMupZlUpzmv9uLpTNulFGUEIRVe93JaaOc7g$>
>>>
>>> This is the diff in code:
>>> https://github.com/cryptomator/jfuse/commit/890035c702489cdb2e094a1fc767e75b15b04891
>>> <https://urldefense.com/v3/__https://github.com/cryptomator/jfuse/commit/890035c702489cdb2e094a1fc767e75b15b04891__;!!ACWV5N9M2RV99hQ!JDzHI5oiHSZJaLRKXbpqU6kqSKHSD0yZEIW8lQT4wRJq0M-_iS6Kz59xcSpcX_sMupZlUpzmv9uLpTNulFGUEIRVe92yJr55Hg$>
>>>
>>> I was testing the `read` method in this class. `write` (with its
>>> `.asReadOnlyBuffer()`) did not draw my attention.
>>>
>>>> On 25. Oct 2022, at 15:03, Maurizio Cimadamore
>>>> <maurizio.cimadamore at oracle.com> wrote:
>>>>
>>>> No worries.
>>>>
>>>> I guess having a look at jfr file would be useful. But note that I
>>>> don't think you can send that to the mailing list - AFAIK,
>>>> attachments are dropped.
>>>>
>>>> Also, forgot to ask - is this something for which you saw a
>>>> difference between 18 and 19? Because that would be odd too.
>>>>
>>>> Maurizio
>>>>
>>>> On 25/10/2022 13:26, Sebastian Stenzel wrote:
>>>>> I can't reproduce it any longer. 😖
>>>>>
>>>>> I swear I would not have consulted the mailing list, if the
>>>>> observation had not been that spooky. Especially regarding said
>>>>> discrepency between `asReadOnlyBuffer()` and `duplicate()`.
>>>>>
>>>>> I still have the .jfr file, though. Is this of any use (other than
>>>>> proving I'm not seeing ghosts)?
>>>>>
>>>>>> On 25. Oct 2022, at 13:15, Maurizio Cimadamore
>>>>>> <maurizio.cimadamore at oracle.com> wrote:
>>>>>>
>>>>>>
>>>>>> On 25/10/2022 12:04, Maurizio Cimadamore wrote:
>>>>>>> ```
>>>>>>> public MappedByteBuffer duplicate() {
>>>>>>> return new DirectByteBuffer(this,
>>>>>>> this.markValue(),
>>>>>>> this.position(),
>>>>>>> this.limit(),
>>>>>>> this.capacity(),
>>>>>>> 0,
>>>>>>>
>>>>>>> fileDescriptor(),
>>>>>>> isSync(),
>>>>>>>
>>>>>>> segment);
>>>>>>> }
>>>>>>> ```
>>>>>> Btw, the implementation of `adReadOnlyBuffer` is virtually
>>>>>> identical to the above - the only difference is that
>>>>>> DirectBuffer::asReadOnlyBuffer creates a new DIrectBufferR (where
>>>>>> R stands for Read Only), not just another DirectBuffer. On
>>>>>> read-only direct buffers (DirectBufferR), asReadOnly buffer just
>>>>>> calls duplicate().
>>>>>>
>>>>>> So, I think it's very strange that one one of them misbehave,
>>>>>> since the implementation is so close.
>>>>>>
>>>>>> What do you use to monitor the allocations? One theory is that
>>>>>> perhaps one version of the code "escapes" better than the other,
>>>>>> so the numbers you see are skewed, and in some cases you see the
>>>>>> actual BB allocations on the heap, whereas in the other case you
>>>>>> don't see anything because the JVM scalarizes the BB views. But
>>>>>> again, the `duplicate` and `adreadOnlyBuffer` are so close to
>>>>>> each other that it's hard to imagine meaningful differences in
>>>>>> terms of escape analysis (even though escape analsyis can
>>>>>> sometimes act in surprising ways).
>>>>>>
>>>>>> Maurizio
>>>>>>
>>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/panama-dev/attachments/20221026/f9ab08fb/attachment-0001.htm>
More information about the panama-dev
mailing list