Ilya Kasnacheev created IGNITE-12837: ----------------------------------------
Summary: Make sure Ignite leaves nothing in static fields after node is stopped, write test Key: IGNITE-12837 URL: https://issues.apache.org/jira/browse/IGNITE-12837 Project: Ignite Issue Type: Improvement Components: general Reporter: Ilya Kasnacheev {code} There are at least two way link to IgniteKernal leaks to GC root and makes it unavailable for GC. 1. The first one: 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. 2. The second way: 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 {code} as reported on mailing list. I suggest we fix that (make sure Ignite node leaves nothing in static fields/GC roots after it is stopped). I also suggest we introduce a check, probably by using jmap and searching dump for IgniteKernal, etc. It would also be nice to check that if Ignite is loaded to non-root class loader, started and stopped, it would allow this class-loader to unload Ignite classes. -- This message was sent by Atlassian Jira (v8.3.4#803005)