[9] RFR(M): 8029799: vm/mlvm/anonloader/stress/oome prints warning: CodeHeap: # of free blocks > 10000
Vladimir Kozlov
vladimir.kozlov at oracle.com
Wed Feb 5 10:57:06 PST 2014
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?
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