[9] RFR(M): 8029799: vm/mlvm/anonloader/stress/oome prints warning: CodeHeap: # of free blocks > 10000
Christian Thalinger
christian.thalinger at oracle.com
Thu Feb 6 13:29:01 PST 2014
On Feb 5, 2014, at 10:57 AM, Vladimir Kozlov <vladimir.kozlov at oracle.com> wrote:
> On 2/5/14 8:28 AM, Albert wrote:
>> Hi Vladimir,
>>
>> thanks for looking at this. I've done the proposed measurements. The
>> code which I used to
>> get the data is included in the following webrev:
>>
>> http://cr.openjdk.java.net/~anoll/8029799/webrev.01/
>
> Good.
>
>>
>> I think some people might be interested in getting that data, so we
>> might want to keep
>> that additional output. The exact output format can be changed later
>> (JDK-8005885).
>
> I agree that it is useful information.
>
>>
>> Here are the results:
>>
>> - failing test case:
>> - original: allocated in freelist: 2168kB, unused bytes in CodeBlob:
>> 818kB, max_used: 21983kB
>> - patch : alloacted in freelist: 1123kB, unused bytes in CodeBlob:
>> 2188kB, max_used: 17572kB
>> - nashorn:
>> - original : allocated in freelist: 2426kB, unused bytes in CodeBlob:
>> 1769kB, max_used: 201886kB
>> - patch : allocated in freelist: 1150kB, unused bytes in CodeBlob:
>> 3458kB, max_used: 202394kB
>> - SPECJVM2008: compiler.compiler:
>> - original : allocated in freelist: 168kB, unused bytes in
>> CodeBlob: 342kB, max_used: 19837kB
>> - patch : allocated in freelist: 873kB, unused bytes in
>> CodeBlob: 671kB, max_used: 21184kB
>>
>> The minimum size that can be allocated from the code cache is
>> platform-dependent.
>> I.e., the minimum size depends on CodeCacheSegmentSize and
>> CodeCacheMinBlockLength.
>> On x86, for example, the min. allocatable size from the code cache is
>> 64*4=256bytes.
>
> There is this comment in CodeHeap::search_freelist():
> // Don't leave anything on the freelist smaller than CodeCacheMinBlockLength.
>
> What happens if we scale down CodeCacheMinBlockLength when we increase CodeCacheSegmentSize to keep the same bytes size of minimum block?:
>
> + FLAG_SET_DEFAULT(CodeCacheSegmentSize, CodeCacheSegmentSize * 2);
> + FLAG_SET_DEFAULT(CodeCacheMinBlockLength, CodeCacheMinBlockLength/2);
>
> Based on your table below those small nmethods will use only 256 bytes blocks instead of 512 (128*4).
>
> Note for C1 in Client VM CodeCacheMinBlockLength is 1. I don't know why for C2 it is 4. Could you also try CodeCacheMinBlockLength = 1?
>
> All above is with CodeCacheSegmentSize 128 bytes.
>
>> The size of adapters ranges from 400b to 600b.
>> Here is the beginning of the nmethod size distribution of the failing
>> test case:
>>
>
> Is it possible it is in segments number and not in bytes? If it really bytes what such (32-48 bytes) nmethods look like?
This is just a guess but these methods could be method handle trampolines. They are very small.
>
> Thanks,
> Vladimir
>
>>
>> nmethod size distribution (non-zombie java)
>> -------------------------------------------------
>> 0-16 bytes 0[bytes]
>> 16-32 bytes 0
>> 32-48 bytes 45
>> 48-64 bytes 0
>> 64-80 bytes 41
>> 80-96 bytes 0
>> 96-112 bytes 6247
>> 112-128 bytes 0
>> 128-144 bytes 249
>> 144-160 bytes 0
>> 160-176 bytes 139
>> 176-192 bytes 0
>> 192-208 bytes 177
>> 208-224 bytes 0
>> 224-240 bytes 180
>> 240-256 bytes 0
>> ...
>>
>>
>> I do not see a problem for increasing the CodeCacheSegmentSize if tiered
>> compilation
>> is enabled.
>>
>> What do you think?
>>
>>
>> Best,
>> Albert
>>
>>
>> On 02/04/2014 05:52 PM, Vladimir Kozlov wrote:
>>> I think the suggestion is reasonable since we increase CodeCache *5
>>> for Tiered.
>>> Albert, is it possible to collect data how much space is wasted in %
>>> before and after this change: free space in which we can't allocate +
>>> unused bytes at the end of nmethods/adapters? Can we squeeze an
>>> adapter into 64 bytes?
>>>
>>> Thanks,
>>> Vladimir
>>>
>>> On 2/4/14 7:41 AM, Albert wrote:
>>>> Hi,
>>>>
>>>> could I get reviews for this patch (nightly failure)?
>>>>
>>>> webrev: http://cr.openjdk.java.net/~anoll/8029799/webrev.00/
>>>> bug: https://bugs.openjdk.java.net/browse/JDK-8029799
>>>>
>>>> problem: The freelist of the code cache exceeds 10'000 items, which
>>>> results in a VM warning.
>>>> The problem behind the warning is that the freelist
>>>> is populated by a large number
>>>> of small free blocks. For example, in failing test
>>>> case (see header), the freelist grows
>>>> up to more than 3500 items where the largest item on
>>>> the list is 9 segments (one segment
>>>> is 64 bytes). That experiment was done on my laptop.
>>>> Such a large freelist can indeed be
>>>> a performance problem, since we use a linear search
>>>> to traverse the freelist.
>>>> solution: One way to solve the problem is to increase the minimal
>>>> allocation size in the code cache.
>>>> This can be done by two means: we can increase
>>>> CodeCacheMinBlockLength and/or
>>>> CodeCacheSegmentSize. This patch follows the latter
>>>> approach, since increasing
>>>> CodeCacheSegmentSize decreases the size that is
>>>> required by the segment map. More
>>>> concretely, the patch doubles the
>>>> CodeCacheSegmentSize from 64 byte to 128 bytes
>>>> if tiered compilation is enabled.
>>>> The patch also contains an optimization in the
>>>> freelist search (stop searching if we found
>>>> the appropriate size) and contains some code cleanups.
>>>> testing: With the proposed change, the size of the freelist is
>>>> reduced to 200 items. There is only
>>>> a slight increase in memory required by code cache
>>>> by at most 3% (all data measured
>>>> for the failing test case on a Linux 64-bit system,
>>>> 4 cores).
>>>> To summarize, increasing the minimum allocation size
>>>> in the code cache results in
>>>> potentially more unused memory in the code cache due
>>>> to unused bits at the end of
>>>> an nmethod. The advantage is that we potentially
>>>> have less fragmentation.
>>>>
>>>> proposal: - I think we could remove CodeCacheMinBlockLength without
>>>> loss of generality or usability
>>>> and instead adapt the parameter
>>>> CodeCacheSegmentSize at Vm startup.
>>>> Any opinions?
>>>>
>>>> Many thanks in advance,
>>>> Albert
More information about the hotspot-compiler-dev
mailing list