我知道很多关于应该从gc.logs中看到的内容,比如
这些是我正在研究的一些要点,当我查看gc日志时,我很想知道还应该注意什么。
仅供参考,我已经完成了以下线程......
答案 0 :(得分:2)
首先,你需要知道GC对你的程序有什么不对。根据您用于终身的收集器的类型,GC日志的旧内容可能会有所不同。但总而言之,我们需要从gc日志中得出的所有基线推断主要集中在以下方面:
大多数程序都有一个非常频繁的次要集合,占据了大约90-95%的堆,并将其余部分传递给Survivor空间。随后的收集再次将幸存者清理了大约80%,实际上只有2%到4%的实际次要收集使其成为旧的gen和tis循环,无论你使用哪个收集器,它都会继续运行。
现在痛苦的地方是每个应用程序请求或线程有数百个小型小型集合,当它们相加时,它们会花费相当大的时间,大多数是两位数秒。因为在现代收藏家中,轻微的传球和扫射并不能阻挡世界的情况,所以有些事情是可以忍受的。随着老一代的问题,收藏家运行时会出现问题,但不会收回任何重大问题。例如:通常收集器在旧的大约80-85%满时运行。这可能是世界插曲的停止,因为新数据无法保存在堆上,除非堆有更多空间,这可能是这里的情况。因此暂停应用程序线程以让GC线程首先清理空间。但是一旦收集器完成,堆填充率就不会下降到应有的程度。一个好的尺寸应该一次减少你的堆超过40%。如果不是这意味着您需要更多堆来保存长寿命对象。
因此,实质上GC分析不是“基于一组预定义步骤做事”。它更多的是hti和试验分析。更多的实验是您设置初始大小和设置,然后记录或监控GC活动并记录结果。然后在说8-10次运行后,你比较笔记,看看哪些适用于你的应用程序,什么不适用。这真的是一项有趣的艰苦工作。