我的应用程序有很多垃圾回收,我想分析一下。
我想要看到的是哪些对象被垃圾回收了。我认为这会让我知道在哪里寻找优化(添加缓存或其他操作)。
是否有选项可以打印详细的GC信息,包括每个类中垃圾回收了多少个对象?
我正在使用G1GC,如果这很重要的话。
谢谢!
我的应用程序有很多垃圾回收,我想分析一下。
我想要看到的是哪些对象被垃圾回收了。我认为这会让我知道在哪里寻找优化(添加缓存或其他操作)。
是否有选项可以打印详细的GC信息,包括每个类中垃圾回收了多少个对象?
我正在使用G1GC,如果这很重要的话。
谢谢!
Oracle的JFR(Java Flight Recorder或Java Mission Control)是一种非常好的工具,可以帮助进行此任务 - 它显示每个对象的GC负载 - 这意味着每个类别生成了多少个对象(这与被收集的对象相对应)。强烈推荐使用。
-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails
我不确定G1GC,但通常我发现VisualVM工具包非常有帮助。它是一个良好特性、足够深入的对象分析以及良好速度(早期很多GC工具在这方面都很糟糕)的不错组合。而且它还是一个免费工具。
要跟踪垃圾回收活动,请使用此命令:
-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails
我会稍微有所不同地处理这个问题 - 你想知道的不是哪些对象被收集了,而是哪些对象占用了堆空间(但在下一次GC后被收集了)。
有许多工具可以让你检查堆中来自哪些对象和类,如Alex Suo提到的VisualVM,JProfiler(一个不错但需要付费的应用程序),YourKit(同样需要付费)或jmap。使用其中任何一个工具,我会定期记录堆状态,以便与详细的垃圾回收日志进行交叉参考。
根据你的应用程序,你还可以结合应用程序的活动日志(哪些活动导致堆出现明显跳跃,特别是在稍后发生GC时有类似的减少)来使用详细的垃圾回收日志,从而取得相当大的进展。即使你使用上述工具,你的活动日志也可能是识别内存使用情况的关键。