2

我注意到当代码处于紧密循环中时 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 或飞行记录器,这也是一样的。

我想了解为什么会这样,以及是否有什么我可以做的,因为我想描述一个紧密的循环。

4

0 回答 0