一、運行程序TestGC
二、用jps找出當前應用的進程號PID
到jdk安裝目錄的bin目錄下輸入: jps -l
PID為1264
三、啟動Process Explorer(下載地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/process-explorer)
1.找到PID為1264的進程,右鍵properties
2.看到該進程的所有線程的性能排序
3.找到名字為javaw.exe(eclipse啟動)的兩個線程,線程TID:10440,10308,其他為jvm線程可能是GC線程
四、jtack工具收集該進程日志
1.命令輸入:jstack 1264 >1264.out
2.bin目錄發現,已經保存該日志文件了
3.打開1264.out看到線程運行情況,線程ID是十六進制的
4.把上面找到排名靠前的TID:10440,10308,轉成16進制為:
5.在日志中搜索該TID,找到對應代碼
大功告成!
測試類如下:
package main.sort; import java.util.ArrayList; import javax.print.attribute.standard.MediaName; public class TestGC { public static void main(String[] args) { byte[] array=new byte[1024*64]; ArrayList<byte[]> list=new ArrayList<byte[]>(); new Thread(new MyThread()).start(); while(true){ list.add(array); try { Thread.sleep(200); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
package main.sort; public class MyThread implements Runnable{ @Override public void run() { // TODO Auto-generated method stub testStack(); } public void testStack(){ try { Thread.sleep(200); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } testStack(); } }