You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ignite.apache.org by "wjw465150 (JIRA)" <ji...@apache.org> on 2015/10/13 09:28:05 UTC

[jira] [Commented] (IGNITE-1661) memory leak

    [ https://issues.apache.org/jira/browse/IGNITE-1661?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14954542#comment-14954542 ] 

wjw465150 commented on IGNITE-1661:
-----------------------------------

test code:
package wjw.test.ignite.benchmark;

import java.util.Arrays;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import javax.cache.expiry.CreatedExpiryPolicy;
import javax.cache.expiry.Duration;

import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.Ignition;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;

public class GetBenchMarkMain {
	static final int COUNT = 100; //线程数
	static final int LOOP = 10000; //每个线程循环次数

	String serversURL = "127.0.0.1:47500..47509";
	String cacheName = "default";

	IgniteCache<String, String> cache1;

	class Worker implements Runnable {
		private CyclicBarrier barrier;
		private CountDownLatch doneSignal;
		private int pos;

		Worker(CyclicBarrier barrier, CountDownLatch doneSignal, int pos) {
			this.barrier = barrier;
			this.doneSignal = doneSignal;
			this.pos = pos;
		}

		public void run() {
			String data = "test(测试)Ignite";
			try {
				barrier.await();

				//System.out.println("线程:" + pos + ",开始调用get()");
				String msg;
				for (int i = 1; i <= LOOP; i++) {
					msg = cache1.get(pos + ":" + i);
					if ((data + ":" + pos + ":" + i).equals(msg) == false) {
						System.out.println("线程:" + pos + ",get错误:" + msg);
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				//System.out.println("线程:" + pos + ",结束调用get()");
				doneSignal.countDown();
			}

		}
	}

	public void doExecute(String[] args) {
		serversURL = args[0];

		IgniteConfiguration cfg = new IgniteConfiguration();
		cfg.setPeerClassLoadingEnabled(false);
		cfg.setClientMode(true);

		TcpDiscoverySpi discoverySpi = new TcpDiscoverySpi();
		{
			TcpDiscoveryVmIpFinder ipFinder = new TcpDiscoveryVmIpFinder();
			ipFinder.setAddresses(Arrays.asList(serversURL.split(",")));

			discoverySpi.setIpFinder(ipFinder);
			cfg.setDiscoverySpi(discoverySpi);
		}

		Ignite ignite = Ignition.start(cfg);

		IgniteCache<String, String> cacheDefault = ignite.cache("default");
		cache1 = cacheDefault.withExpiryPolicy(new CreatedExpiryPolicy(new Duration(TimeUnit.MINUTES, 30)));

		CyclicBarrier barrier = new CyclicBarrier(COUNT);
		CountDownLatch doneSignal = new CountDownLatch(COUNT);

		ExecutorService exec = Executors.newFixedThreadPool(COUNT);
		long currentTimeMillis = System.currentTimeMillis();
		for (int i = 0; i < COUNT; i++) {
			exec.submit(new Worker(barrier, doneSignal, i));
		}

		try {
			doneSignal.await(); //等待所有的线程完成工作
		} catch (InterruptedException ex) {
		}
		float ticket = System.currentTimeMillis() - currentTimeMillis;
		System.out.println((COUNT * LOOP) + "次用时" + secondToHMS((long) (ticket / 1000)));
		System.out.println("平均每次:" + (ticket / (COUNT * LOOP)) + "毫秒");
		System.out.println("平均每秒:" + ((COUNT * LOOP) / (ticket / 1000.00)) + "次");

		exec.shutdown();
		ignite.close();
	}

	public static String secondToHMS(long ticket) {
		long day1 = ticket / (24 * 3600);
		long hour1 = ticket % (24 * 3600) / 3600;
		long minute1 = ticket % 3600 / 60;
		long second1 = ticket % 60;

		StringBuilder sb = new StringBuilder();
		if (day1 > 0) {
			sb.append(day1 + "天");
		}
		if (hour1 > 0) {
			sb.append(hour1 + "小时");
		}
		if (minute1 > 0) {
			sb.append(minute1 + "分");
		}
		sb.append(second1 + "秒");

		return sb.toString();
	}

	public static void main(String[] args) {
		if (args.length < 1) {
			System.out
			    .println("用法:java -Xmx512m -cp ./classes:./lib/* wjw.test.ignite.benchmark.GetBenchMarkMain 服务器ip:服务器port1..服务器port2,服务器ip:服务器port1..服务器port2,...");
			System.out
			    .println("例如:java -Xmx512m -cp ./classes:./lib/* wjw.test.ignite.benchmark.GetBenchMarkMain T1:47500..47509,T2:47500..47509");
			System.exit(0);
		}

		GetBenchMarkMain testGet = new GetBenchMarkMain();
		testGet.doExecute(args);

		System.exit(0);
	}

}

> memory leak
> -----------
>
>                 Key: IGNITE-1661
>                 URL: https://issues.apache.org/jira/browse/IGNITE-1661
>             Project: Ignite
>          Issue Type: Bug
>          Components: cache
>    Affects Versions: ignite-1.4
>         Environment: centos 6.3
>            Reporter: wjw465150
>
> when use withExpiryPolicy cache,and CacheConfiguration.eagerTtl is set true, this will cause heap memory leak!
> code sample:
> 		IgniteCache<String, String> cacheDefault = ignite.cache("default");
> 		cache1 = cacheDefault.withExpiryPolicy(new CreatedExpiryPolicy(new Duration(TimeUnit.MINUTES, 30)));



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)