我正在编写一个Java应用程序(它正在监视磁盘上的一些文件,并根据更改将内容写入数据库),但我注意到它在垃圾收集上花费了相当多的时间。我的日志文件的片段如下;关于垃圾收集花费一秒钟的每一分钟,这是应用程序不应该做的非常多。我用
启动了Javajava -Xmx1024m -Xms256m -verbose:gc -jar myApplication.jar
并且日志文件以
的形式给出19:38:15 pong
[Full GC 905059K->593250K(1013632K), 0.9315089 secs]
19:38:28 pong
...
19:39:34 pong
[Full GC 864134K->595982K(1013632K), 0.9592708 secs]
19:39:47 pong
....
19:40:36 pong
[Full GC 875598K->623414K(1013632K), 1.2895245 secs]
19:40:39 pong
我可能会切换到一个更好的垃圾收集器,它不会暂停我的程序,但我更好奇为什么它花了这么多时间收集。编辑:我只收到主要的垃圾收集品,我没有看到次要的收藏品。
调试此问题的最佳方法是什么?
答案 0 :(得分:3)
我建议你使用内存分析器。
看来你有大量的静态内存,600 MB。完整的集合可能是创建大量对象的结果(太多而无法适应幸存者空间)如果使用内存分析器,它应该更加明显。
你可以做的一件事就是尝试增加年轻一代的空间。例如-ms800m -mx1200m -XX:NewSize = 500m。这可能会改变行为并使应用程序的分析更容易。