我注意到当代码处于紧密循环中时 jstack 不起作用。
例如在这段代码中:
private static void testAllocationNotOnHeap(){
long time = System.currentTimeMillis();
long result =0;
for (int j = 0; j < 20_000; j++) {
for (int i = 0; i < 100_000_000; i++) {
result += new TestObject(5,5).getResult();
}
}
System.out.println("Allocation not on heap took "
+ (System.currentTimeMillis()-time)
+ " with result " + result);
}
如果您运行 jstack,您会收到以下消息:
无法打开套接字文件:目标进程没有响应或HotSpot VM未加载当目标进程没有响应时可以使用-F选项
只要您允许代码“呼吸”,例如通过每隔几千次迭代添加一个 System.out,它就可以正常工作。
请注意,如果您想从 jmc 运行 jconsole 或飞行记录器,这也是一样的。
我想了解为什么会这样,以及是否有什么我可以做的,因为我想描述一个紧密的循环。