jconsole查看线程池内部对象在jvm内存变化

来源:互联网 发布:淘宝代购订单管理系统 编辑:程序博客网 时间:2024/06/07 19:55

我们经常在使用线程时查看jvm的使用状况,以jconsole为例:
线程类MyRunnable :

public class MyRunnable implements Runnable {    @Override    public void run() {        System.out.println("run");    }    @Override    protected void finalize() throws Throwable {        // TODO Auto-generated method stub        super.finalize();        System.err.println(Thread.currentThread().getName()+"-"+this.hashCode()+"-finalize");    }}

线程池:

import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class MyRunnableThreadPool {    public static void main(String[] args) throws InterruptedException {        Thread.sleep(1500);        ExecutorService exe =  Executors.newFixedThreadPool(30);        for (int i = 0; i < 30; i++) {            exe.execute(new MyRunnable());        }        System.out.println("end");    }}

启动线程池,在之前加一个断点,留出时间打开jconsole:
这里写图片描述
打开C:\Program Files\Java\jdk1.7.0_79\bin目录下的jconsole.exe:
这里写图片描述
选择当前运行的线程。
放开断点,查看jconsole视图:
这里写图片描述

单击执行GC按钮:
这里写图片描述
可以看到执行GC之后线程池内部的MyRunnable对象被释放,调用了finalize,当对象被回收时此方法会被调用。
控制台打印:
这里写图片描述

0 0