[
https://issues.apache.org/jira/browse/IGNITE-7319?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16389663#comment-16389663
]
Zbyszek B commented on IGNITE-7319:
-----------------------------------
{code:java}
// code placeholder
package p1;
import org.apache.ignite.*;
import org.apache.ignite.binary.BinaryObject;
import org.apache.ignite.cache.CacheMode;
import org.apache.ignite.cache.QueryEntity;
import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.configuration.IgniteConfiguration;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicLong;
public class Demo {
private final static Ignite ignite = createIgnite();
private final static AtomicLong localCacheCreateCount = new AtomicLong();
private final static AtomicLong localCacheDestroyCount = new AtomicLong();
private final static BlockingQueue<IgniteCache<String, BinaryObject>> queue =
new LinkedBlockingQueue<>(100);
public static void main(String[] args) throws Exception {
CompletableFuture.runAsync(Demo::runProducer);
CompletableFuture.runAsync(Demo::runProducer);
CompletableFuture.runAsync(Demo::runConsumer);
CompletableFuture.runAsync(Demo::runConsumer);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
do {
String input = br.readLine();
if ("q".equals(input)) {
System.out.println("Exit!");
System.exit(0);
} else {
System.out.println("Queue size: " + queue.size());
System.out.println("Caches created: " + localCacheCreateCount.longValue());
System.out.println("Caches destroyed: " + localCacheDestroyCount.longValue());
}
} while (true);
}
private static void runProducer() {
do {
try {
IgniteCache<String, BinaryObject> cache = createLocalCache();
queue.put(cache);
} catch (Exception e) {
throw new RuntimeException(e);
}
} while (true);
}
private static void runConsumer() {
do {
try {
IgniteCache<String, BinaryObject> cache = queue.take();
cache.close();
cache.destroy();
localCacheDestroyCount.incrementAndGet();
} catch (Exception e) {
throw new RuntimeException(e);
}
} while (true);
}
private static Ignite createIgnite() {
IgniteConfiguration iCfg = new IgniteConfiguration();
String workDirectory = System.getProperty("user.home") + File.separator +
"ignite";
iCfg.setWorkDirectory(workDirectory);
System.out.println();
System.out.println(String.format(">>> Starting Ignite on %s; work directory %s
...", "MyLeakingNode", workDirectory));
System.out.println();
final Ignite ignite = Ignition.start(iCfg);
ClusterNode localNode = ignite.cluster().localNode();
System.out.println();
System.out.println(String.format(">>> Ignite started on %s (%s) successfully!",
"MyLeakingNode", localNode.id()));
System.out.println();
return ignite;
}
private static IgniteCache<String, BinaryObject> createLocalCache() {
final String cacheName = "localCache" + localCacheCreateCount.incrementAndGet();
final CacheConfiguration<String, BinaryObject> cCfg = new
CacheConfiguration<>();
cCfg.setName(cacheName);
cCfg.setStoreKeepBinary(true);
cCfg.setCacheMode(CacheMode.LOCAL);
cCfg.setOnheapCacheEnabled(false);
cCfg.setCopyOnRead(false);
cCfg.setBackups(0);
cCfg.setWriteBehindEnabled(false);
cCfg.setReadThrough(false);
cCfg.setReadFromBackup(false);
cCfg.setQueryEntities(Collections.singletonList( new
QueryEntity(String.class.getTypeName(), "LocalEntity")));
ignite.destroyCache(cacheName); // local cache is not really local - reference
can be kept by other nodes if restart during the load happens
return ignite.createCache(cCfg).withKeepBinary();
}
}
{code}
> Memory leak during creating/destroying local cache
> --------------------------------------------------
>
> Key: IGNITE-7319
> URL: https://issues.apache.org/jira/browse/IGNITE-7319
> Project: Ignite
> Issue Type: Bug
> Components: cache
> Affects Versions: 2.3
> Reporter: Mikhail Cherkasov
> Assignee: Alexey Goncharuk
> Priority: Major
> Fix For: 2.5
>
>
> The following code creates local caches:
> {code}
> private IgniteCache<String, BinaryObject> createLocalCache(String name) {
> CacheConfiguration<String, BinaryObject> cCfg = new
> CacheConfiguration<>();
> cCfg.setName(name);
> cCfg.setGroupName("localCaches"); // without group leak is much
> bigger!
> cCfg.setStoreKeepBinary(true);
> cCfg.setCacheMode(CacheMode.LOCAL);
> cCfg.setOnheapCacheEnabled(false);
> cCfg.setCopyOnRead(false);
> cCfg.setBackups(0);
> cCfg.setWriteBehindEnabled(false);
> cCfg.setReadThrough(false);
> cCfg.setReadFromBackup(false);
> cCfg.setQueryEntities(<some basic query here>);
> return ignite.createCache(cCfg).withKeepBinary();
> }
> {code}
> The caches are placed in the queue and are picked up by the worker thread
> which just destroys them after removing from the queue.
> This setup seems to generate a memory leak of about 1GB per day.
> When looking at heap dump, I see all space is occupied by instances of
> java.util.concurrent.ConcurrentSkipListMap$Node.
> User list:
> http://apache-ignite-users.70518.x6.nabble.com/Memory-leak-in-GridCachePartitionExchangeManager-tt18995.html
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)