RFR: 8064909: FragmentMetaspace.java got OutOfMemoryError

Michail Chernov michail.chernov at oracle.com
Thu Nov 27 13:28:49 UTC 2014


Hi,

CC'ed hotspot-runtime-dev.

Here is not test failure - test works as expected. OOME is occurred in 
compiler instance.

private JavaCompiler javac;
...
         javac = ToolProvider.getSystemJavaCompiler();
...
         int exitcode = javac.run(null, null, null, 
file.getCanonicalPath());
         if (exitcode != 0) {
             throw new RuntimeException("javac failure when compiling: " +
         file.getCanonicalPath());

Here is 2 ways - rewrite getGeneratedClass 
(runtime/testlibrary/GeneratedClassLoader.java) to allow them to throw 
not only RuntimeException, or to catch RuntimeException and check 
exception message comparing with "javac failure when compiling:". Both 
ways seem to me are not as clear as expected for this simple test. More 
- javac does not throw anything - it just returns exitcode (non-zero) 
and writes its messages to System.err.

Also I can add comment to code like "OOME with message 
"java.lang.OutOfMemoryError: Java heap space" doesn't mean that 
something wrong with metaspace - need just to increase -Xmx".

Thanks,
Michail

On 27.11.2014 2:00, Jon Masamitsu wrote:
> Dima,
>
> If this test fails with an OOME in the future, I would like it to be
> obvious that the failure is not that an OOME occurred.   I cannot
> tell that from looking at the test.    Can the test be changed so
> I don't have to spend time figuring out that the OOME is not
> a failure mode  of the test?
>
> Jon
>
>
> On 11/26/2014 12:51 PM, Dmitry Fazunenko wrote:
>> Hi Jon,
>>
>> The original version of test worked for 80 seconds trying to perform 
>> as many iterations as possible. The number of iterations performed 
>> depended on how fast is the machine. With each next iteration the 
>> size of generated and loaded classes is growing, so on fast enough 
>> machines 80 seconds is enough to run out of heap while generating a 
>> class.
>>
>> The fix not only sets the heap, but limits iterations.  300m heap is 
>> enough for 200 iterations.
>>
>> Your approach, with catching OOME(heap) and passing will also work, 
>> but it will reduce the test readability (and potentially could bring 
>> more problems).
>>
>> An alternative approach would be to limit metaspace and heap 
>> accordingly and load classes until we don't run out metaspace... But 
>> this might take awhile.
>>
>> So, I hope that Michael's fix is good.
>>
>> Thanks for looking and expressing comments.
>> Dima
>>
>>
>>
>>
>> On 26.11.2014 22:04, Jon Masamitsu wrote:
>>> Michail,
>>>
>>> Your change makes this test pass but it seems like at
>>> some future date 300m might not be big enough
>>> (for whatever reason).  Could the test be make to
>>> caught an OOME, print out a message saying that
>>> an OOME doesn't mean the test failed  but that
>>> the test needs a larger heap?  Then pass an
>>> exception up (maybe some type of Runtime
>>> exception - sorry if that is vague but I don't
>>> what type of exception would make sense).  That
>>> would mean we wouldn't have to spend time
>>> diagnosing what the OOME means again.
>>>
>>> Jon
>>>
>>> On 11/26/2014 5:36 AM, Michail Chernov wrote:
>>>> Hi,
>>>>
>>>> Please review this simple fix for nightly test failure:
>>>>
>>>> Webrev:
>>>> http://cr.openjdk.java.net/~eistepan/~mchernov/8064909/webrev.00/
>>>> Bug:
>>>> https://bugs.openjdk.java.net/browse/JDK-8064909
>>>>
>>>> Problem: test fails because of OOME (not enough heap size).
>>>> Solution: heap size were increased.
>>>>
>>>> Testing:
>>>> jtreg
>>>>
>>>> Thanks,
>>>> Michail
>>>
>>
>
>
>



More information about the hotspot-gc-dev mailing list