jconsole观察jvm中线程及GC情况

闲来无事,写了一个小demo来观察jvm中的线程和GC过程,代码如下

public class MyExecutor {

	public static void main(String[] args) {
		try {
			Thread.sleep(15000);//留点时间连接jconsole
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		ExecutorService executorService = Executors.newFixedThreadPool(1);
		for (int i = 0; i < 10; i++) {
			executorService.execute(new MyRunnable());
		}
	}
}
public class MyRunnable implements Runnable {

	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName() + "-" + this.hashCode() +  ":run");
	}
	
	@Override
	protected void finalize() throws Throwable {
		super.finalize();
		System.err.println(Thread.currentThread().getName() + "-" + this.hashCode() +  ":finalize");
	}
}

jvm中的对象在被回收之前会执行finalize()方法。运行以上代码中的main方法,启动jconsole并连接到对应的jvm。

eclipse中的执行情况如下图

由图可见,线程池中只新创建了一个线程,for循环中创建了10个MyRunnable对象。线程执行完任务之后,10个对象并没有立即被回收。此时在jconsole中观察内存使用情况发现内存充足,于是在jconsole中手动触发一次GC,如下图

可见一次GC之后,堆内存使用量明显减少,之后又逐渐上升。此时eclipse控制台打印出了finalize()方法中的内容,如下图:

可见,之前10个未被回收的对象在此次GC中被回收了。

 

转载于:https://www.cnblogs.com/umgsai/p/6812789.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值