Unreachable Memory not freed, Nashorn Demo
Poonam Bajaj Parhar
poonam.bajaj at oracle.com
Tue Feb 28 17:56:42 UTC 2017
Hello Thorsten,
I ran this test program with jdk9-ea and created a Heap Dump after the
first Full GC using -XX:+HeapDumpAfterFullGC. In that heap dump, I can
see 2 instances of LeakImpl:
Class Name | Objects | Shallow Heap | Retained Heap
----------------------------------------------------------
LeakDemo$LeakImpl| 2 | 32 |
----------------------------------------------------------
the first one is reachable as a local variable from the main thread
which is fine:
Class Name | Ref. Objects | Shallow
Heap | Ref. Shallow Heap | Retained Heap
----------------------------------------------------------------------------------------------------------------
java.lang.Thread @ 0x84f211f8 Thread | 1 |
120 | 16 | 736
'- <Java Local> LeakDemo$LeakImpl @ 0x850d89f0| 1 |
16 | 16 | 16
----------------------------------------------------------------------------------------------------------------
the other one is reachable through the referent
"jdk.nashorn.internal.objects.Global" of a WeakReference:
Class Name | Ref. Objects | Shallow Heap | Ref. Shallow
Heap | Retained Heap
-----------------------------------------------------------------------------------------------------------
class jdk.internal.loader.ClassLoaders @ 0x84f268f8 System
Class | 1 | 16
| 16 | 16
'- PLATFORM_LOADER jdk.internal.loader.ClassLoaders$PlatformClassLoader
@ 0x84f2a610 | 1 | 96
| 16 | 199,624
'- classes java.util.Vector @ 0x850b2b70 | 1 |
32 | 16 | 68,104
'- elementData java.lang.Object[640] @ 0x850b2b90 | 1
| 2,576 | 16 | 68,072
'- [196] class jdk.nashorn.internal.scripts.JD @
0x84f49960 | 1 | 8
| 16 | 4,560
'- map$ jdk.nashorn.internal.runtime.PropertyMap @
0x850d4a88 | 1 | 64
| 16 | 4,552
'- protoHistory java.util.WeakHashMap @
0x850d5418 | 1 |
48 | 16 | 2,208
'- table java.util.WeakHashMap$Entry[16] @
0x850d5448 | 1 | 80
| 16 | 2,112
*'- [10] java.util.WeakHashMap$Entry @
0x850d5498 | 1 | 40
| 16 | 2,032*
'- referent jdk.nashorn.internal.objects.Global
@ 0x85137a18 | 1 | 544 | 16 |
39,920
'- initscontext
javax.script.SimpleScriptContext @ 0x8515c910 | 1 |
32 | 16 | 280
'- engineScope LeakDemo$SimplestBindings
@ 0x8515c930 | 1 | 16 | 16
| 248
'- map java.util.HashMap @
0x8515c940 | 1 | 48
| 16 | 232
'- table java.util.HashMap$Node[16]
@ 0x8515c970 | 1 | 80 | 16
| 184
'- [9] java.util.HashMap$Node @
0x8515c9f8 | 1 | 32 | 16 | 48
'- value
LeakDemo$SimplestBindings$$Lambda$118 @ 0x8515ca18| 1
| 16 | 16 | 16
'- arg$1 LeakDemo$LeakImpl
@ 0x8515c600 | 1 | 16
| 16 | 1,073,741,856
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
From the GC logs, the referent is present in an old region:
[2.044s][info ][gc,metaspace ] GC(6) Metaspace: 13522K->13518K(1062912K)
[2.047s][info ][gc,start ] GC(6) Heap Dump (after full gc)
Dumping heap to java_pid20428.hprof ...
Heap dump file created [1081050745 bytes in 25.084 secs]
[27.137s][info ][gc ] GC(6) Heap Dump (after full gc)
25089.382ms
[27.137s][info ][gc ] GC(6) Pause Full (Allocation
Failure) 1028M->1028M(1970M) 25171.038ms
Also:
[10.651s][trace][gc,region] GC(6) G1HR POST-COMPACTION(OLD)
[0x0000000085100000, 0x0000000085161f20, 0x0000000085200000]
This Full GC didn't discover this WeakReference and didn't clear its
referent. It needs to be investigated if it gets cleared and collected
in the subsequent GCs.
Thanks,
Poonam
On 2/28/2017 9:06 AM, Jenny Zhang wrote:
> Thorsten
>
> Thanks very much for the micro. I have update it to
>
> https://bugs.openjdk.java.net/browse/JDK-8173594
>
> Thanks
> Jenny
>
> On 2/28/2017 4:45 AM, Thorsten Goetzke wrote:
>> Hello,
>>
>> Back in January i posted about Unreachable Objects not claimed by the
>> gc, i am finally able to produce a micro, see below. When I run the
>> class below using -Xmx4g and take a memory snaphsot (hprof or
>> yourkit, doesnt matter), I will see 2 LeakImpl Objects. These Objects
>> have no reported path to root, yet they won't be collected. If i
>> lower the heap space to -Xmx2g the Application throws
>> java.lang.OutOfMemoryError: Java heap space.
>> @Jenny Zhang should I create a new bugreport, or will you take care
>> of this?
>>
>> Best Regards,
>> Thorsten Goetzke
>>
>> package de.frei.demo;
>>
>> import jdk.nashorn.api.scripting.NashornScriptEngine;
>> import jdk.nashorn.api.scripting.NashornScriptEngineFactory;
>>
>> import javax.script.CompiledScript;
>> import javax.script.ScriptException;
>> import javax.script.SimpleBindings;
>> import java.util.function.Function;
>>
>>
>> public final class LeakDemo {
>>
>> private static NashornScriptEngine ENGINE =
>> getNashornScriptEngine();
>> private static CompiledScript SCRIPT;
>>
>> public static void main(String[] args) throws Exception {
>> simulateLoad();
>> simulateLoad();
>> System.gc();
>> Thread.sleep(1000000);
>>
>> }
>>
>> private static void simulateLoad() throws ScriptException {
>> final CompiledScript compiledScript = getCompiledScript(ENGINE);
>> compiledScript.eval(new SimplestBindings(new LeakImpl()));
>> }
>>
>> private static NashornScriptEngine getNashornScriptEngine() {
>> final NashornScriptEngineFactory factory = new
>> NashornScriptEngineFactory();
>> final NashornScriptEngine scriptEngine =
>> (NashornScriptEngine) factory.getScriptEngine();
>> return scriptEngine;
>> }
>>
>>
>>
>> private static CompiledScript getCompiledScript(final
>> NashornScriptEngine scriptEngine) throws ScriptException {
>> if (SCRIPT == null) {
>> SCRIPT = scriptEngine.compile(" var pivot =
>> getItem(\"pivot\");");
>> }
>> return SCRIPT;
>> }
>>
>> public interface Leak {
>>
>> LiveItem getItem(String id);
>> }
>>
>>
>> public static final class LeakImpl implements Leak {
>> private final byte[] payload = new byte[1024 * 1024 * 1024];
>>
>>
>> @Override
>> public LiveItem getItem(final String id) {
>> return new LiveItem() {
>> };
>> }
>>
>>
>> }
>>
>> public interface LiveItem {
>> }
>>
>> public static final class SimplestBindings extends SimpleBindings {
>> public SimplestBindings(Leak leak) {
>>
>> put("getItem",(Function< String, LiveItem>) leak::getItem);
>> }
>> }
>> }
>>
>> _______________________________________________
>> hotspot-gc-use mailing list
>> hotspot-gc-use at openjdk.java.net
>> http://mail.openjdk.java.net/mailman/listinfo/hotspot-gc-use
>
> _______________________________________________
> hotspot-gc-use mailing list
> hotspot-gc-use at openjdk.java.net
> http://mail.openjdk.java.net/mailman/listinfo/hotspot-gc-use
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/hotspot-gc-use/attachments/20170228/1cb3e47c/attachment.html>
More information about the hotspot-gc-use
mailing list