关于垃圾回收机制我有三个问题
>
我正在研究我的应用程序中的垃圾收集,我可以注意到已经发生了完整的GC。通过研究GC日志,我可以发现旧gen甚至没有使用分配给它的一半内存。那么为什么会发生完全GC呢。JVM是否使用了其他算法来释放内存,即使旧的gen没有完全利用?
可以称之为良好的GC趋势。我的意思是,如果每10-15分钟发生一次完整的GC,我可以调用应用程序使其处于良好状态。我想知道一个应用程序的理想GC应该是什么。我知道这在很大程度上取决于应用程序,但应该有一些东西可以称为理想。
一个主要的收集可能有几个原因,在大多数情况下,您可以使用jstat-gccause查看原因。
如果从您的应用程序或您使用并依赖于此调用的任何其他代码调用,则很少有原因是-System.gc()。-当达到旧的空间占用分数时-当发生PermGen集合时-根据收集器,您使用的CMS增量模式似乎会导致旧一代限制之前的主要集合。
最有可能的系统。gc()是导致意外的主要集合的原因,请尝试使用标志-XX:DisableExcplicitGC,看看您是否仍然得到它们。
--
没有任何趋势可以描述所有用法。这应该基于您的需要。GC的工作方式是否会影响应用程序/服务的性能。你有没有长时间的停顿会降低你的吞吐量?你想要实现什么?最重要的是你产生的垃圾是什么?尝试分析堆转储,看看是否可以在优化收集器之前以某种方式减少数量。
--
这取决于您使用的标志、JVM的版本、您的操作系统等......在一般的GC人体工程学中,更具体地说,选项-XX: UseAdaptiveSizePolicy将负责您几代人的大小。