应该在gc.logs中检查什么

时间:2014-12-07 08:29:09

标签: java performance garbage-collection jvm

我知道很多关于应该从gc.logs中看到的内容,比如

  • 您应该检查“Full GC”运行的频率,如果它经常运行,则表示存在问题
  • 你还应该检查“Full GC”在完成时能够回收多少内存,如果不是那么多又是问题的迹象,因为它会强制“Full GC”再次运行
  • 如果“Full GC”经常运行,您应该重新访问为java进程分配的堆空间。

这些是我正在研究的一些要点,当我查看gc日志时,我很想知道还应该注意什么。

仅供参考,我已经完成了以下线程......

1 个答案:

答案 0 :(得分:2)

首先,你需要知道GC对你的程序有什么不对。根据您用于终身的收集器的类型,GC日志的旧内容可能会有所不同。但总而言之,我们需要从gc日志中得出的所有基线推断主要集中在以下方面:

  • 小型藏品需要多长时间?
  • 主要藏品需要多长时间?
  • 次要藏品的频率是多少?
  • 主要馆藏的频率是多少?
  • 未成年人收集的费用是多少?
  • 主要收藏品的回收量是多少?
  • 以上的组合

大多数程序都有一个非常频繁的次要集合,占据了大约90-95%的堆,并将其余部分传递给Survivor空间。随后的收集再次将幸存者清理了大约80%,实际上只有2%到4%的实际次要收集使其成为旧的gen和tis循环,无论你使用哪个收集器,它都会继续运行。

现在痛苦的地方是每个应用程序请求或线程有数百个小型小型集合,当它们相加时,它们会花费相当大的时间,大多数是两位数秒。因为在现代收藏家中,轻微的传球和扫射并不能阻挡世界的情况,所以有些事情是可以忍受的。随着老一代的问题,收藏家运行时会出现问题,但不会收回任何重大问题。例如:通常收集器在旧的大约80-85%满时运行。这可能是世界插曲的停止,因为新数据无法保存在堆上,除非堆有更多空间,这可能是这里的情况。因此暂停应用程序线程以让GC线程首先清理空间。但是一旦收集器完成,堆填充率就不会下降到应有的程度。一个好的尺寸应该一次减少你的堆超过40%。如果不是这意味着您需要更多堆来保存长寿命对象。

因此,实质上GC分析不是“基于一组预定义步骤做事”。它更多的是hti和试验分析。更多的实验是您设置初始大小和设置,然后记录或监控GC活动并记录结果。然后在说8-10次运行后,你比较笔记,看看哪些适用于你的应用程序,什么不适用。这真的是一项有趣的艰苦工作。