Hello, There are at least two way link to IgniteKernal leaks to GC root and makes it unavailable for GC.
this - value: org.apache.ignite.internal.IgniteKernal #1 <- grid - class: org.apache.ignite.internal.GridKernalContextImpl, value: org.apache.ignite.internal.IgniteKernal #1 <- ctx - class: org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing, value: org.apache.ignite.internal.GridKernalContextImpl #2 <- this$0 - class: org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing$10, value: org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing #2 <- serializer - class: org.h2.util.JdbcUtils, value: org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing$10 #1 <- [5395] - class: java.lang.Object[], value: org.h2.util.JdbcUtils class JdbcUtils <- elementData - class: java.util.Vector, value: java.lang.Object[] #37309 <- classes - class: sun.misc.Launcher$AppClassLoader, value: java.util.Vector #31 <- contextClassLoader (thread object) - class: java.lang.Thread, value: sun.misc.Launcher$AppClassLoader #1 org.h2.util.JdbcUtils has static field JavaObjectSerializer serializer, which see IgniteKernal via IgniteH2Indexing. It make closed and stopped IgniteKernal non collectable by GC. If some Ignites run in same JVM, JdbcUtils will always use only one, and it can cause some races.
this - value: org.apache.ignite.internal.IgniteKernal #2 <- grid - class: org.apache.ignite.internal.GridKernalContextImpl, value: org.apache.ignite.internal.IgniteKernal #2 <- ctx - class: org.apache.ignite.internal.processors.cache.GridCacheContext, value: org.apache.ignite.internal.GridKernalContextImpl #1 <- cctx - class: org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtCacheEntry, value: org.apache.ignite.internal.processors.cache.GridCacheContext #24 <- parent - class: org.apache.ignite.internal.processors.cache.GridCacheMvccCandidate, value: org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtCacheEntry #4 <- [0] - class: java.lang.Object[], value: org.apache.ignite.internal.processors.cache.GridCacheMvccCandidate #1 <- elements - class: java.util.ArrayDeque, value: java.lang.Object[] #43259 <- value - class: java.lang.ThreadLocal$ThreadLocalMap$Entry, value: java.util.ArrayDeque #816 <- [119] - class: java.lang.ThreadLocal$ThreadLocalMap$Entry[], value: java.lang.ThreadLocal$ThreadLocalMap$Entry #51 <- table - class: java.lang.ThreadLocal$ThreadLocalMap, value: java.lang.ThreadLocal$ThreadLocalMap$Entry[] #21 <- threadLocals (thread object) - class: java.lang.Thread, value: java.lang.ThreadLocal$ThreadLocalMap #2 Link to IgniteKernal leaks to ThreadLocal variable, so when we start/stop many instances of Ignite in same jvm during testing, we got many stopped “zomby” ignites on ThreadLocal context of main test thread and it cause OutOfMemory after some dozens of tests. Andrey. |
- Ignite memory leaks in 2.8.0 Andrey Davydov
- Re: Ignite memory leaks in 2.8.0 Ilya Kasnacheev
- Re: Ignite memory leaks in 2.8.0 Ilya Kasnacheev
- RE: Re: Ignite memory leaks in 2.8.0 Andrey Davydov
- RE: Ignite memory leaks in 2.8.0 Andrey Davydov
- Re: Ignite memory leaks in 2.8.0 Andrey Davydov
- Re: Ignite memory leaks in 2.8.0 Taras Ledkov
- Re: Ignite memory leaks in 2.8.0 Andrey Davydov
- Re: Ignite memory leaks in 2.8.0 Taras Ledkov
- RE: Re: Ignite memory leaks in 2.8.0 Andrey Davydov
- Re: Ignite memory leaks in 2.8.0 Ilya Kasnacheev