一、运行程序TestGC

二、用jps找出当前应用的进程号PID
 到jdk安装目录的bin目录下输入: jps -l
jvm系列六、windows用jdk自带工具jps、jstack找出性能最差的代码-LMLPHP

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线程
jvm系列六、windows用jdk自带工具jps、jstack找出性能最差的代码-LMLPHP

四、jtack工具收集该进程日志
1.命令输入:jstack 1264 >1264.out
jvm系列六、windows用jdk自带工具jps、jstack找出性能最差的代码-LMLPHP

2.bin目录发现,已经保存该日志文件了
jvm系列六、windows用jdk自带工具jps、jstack找出性能最差的代码-LMLPHP

3.打开1264.out看到线程运行情况,线程ID是十六进制的

jvm系列六、windows用jdk自带工具jps、jstack找出性能最差的代码-LMLPHP

4.把上面找到排名靠前的TID:10440,10308,转成16进制为:
jvm系列六、windows用jdk自带工具jps、jstack找出性能最差的代码-LMLPHP

5.在日志中搜索该TID,找到对应代码

jvm系列六、windows用jdk自带工具jps、jstack找出性能最差的代码-LMLPHP

大功告成!

测试类如下:

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();
}
}
05-06 13:37