[
https://issues.apache.org/jira/browse/IGNITE-12837?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Andrey Davydov updated IGNITE-12837:
------------------------------------
Attachment: IgniteWeakRefTracker.java
> 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
> Priority: Major
> Attachments: IgniteWeakRefTracker.java
>
>
> {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)