我目前正在开展一个大型软件项目。在某些时候,软件将停止执行主线程几秒钟,然后继续。我不确定这是由GC还是并发问题引起的。增加内存不会导致线程停止频率降低。
所以基本上我正在寻找一种方法来记录线程等待获取对象锁定的时间以及等待发生的位置。请注意这些延迟的时间。太慢,无法跟随他们VisualVM实时,所以我需要某种日志记录。
答案 0 :(得分:0)
我建议您启用GC日志记录,然后查看暂停是否与GC运行的时间相关。这应该告诉您这是GC问题还是锁争用问题。 (JVM选项为-Xloggc:filename
...其中filename
是您希望日志记录转到的位置。)
我不认为有办法记录"记录"等待锁定所花费的时间,但您可以使用专门的性能分析工具来完成此操作。 (尝试谷歌搜索" java锁争用分析"。)
<强>更新强>
我尝试了GC日志,似乎实际上GC阻止了主线程。
如果您使用的是默认收集器,则GC运行&#34;停止世界&#34;虽然它做了它的东西。如果你想避免这种情况(或者至少要减少暂停时间),你需要切换到&#34;低暂停&#34;收集器,如CMS收集器或G1收集器。有关更多信息,请参阅Oracle GC Tuning页面。