我们知道在Java中,一次完整的GC可能会导致JVM挂起,这也被称为STOP-THE-WORLD。在许多应用程序中,如果JVM挂起时间过长,将会引起很多问题。我想知道如何减少GC中STOP-THE-WORLD的时间?减少STOP-THE-WORLD时间可能会带来哪些潜在的缺点?(不考虑没有stop-the-world行为的JVM)
有许多方法可以采用: 减少垃圾产生。使用内存分析器可帮助实现此目标。 减少堆使用。使用分析器可降低内存使用率。 使用离堆内存。有许多库可用于存储离堆数据,例如Chronicle。 增加内存,这样垃圾收集发生的次数会更少,当发生时可能会更少影响性能。如果您使用的堆小于32 GB,则可能是一种快速解决方案。 使用完全并发的收集器,例如Azul的Zing。它没有STW收集器。 我建议从使用内存分析器减少垃圾和堆使用开始,并调整GC。
如果您的对象生命周期很长,可以尝试使用 New I/O 包中的 DirectBuffers。它们的创建和回收比基于堆的非直接缓冲区更昂贵,因为直接缓冲区使用特定于操作系统的本机代码进行管理。这种额外的管理成本使得直接缓冲区不适合单次使用或不经常使用的情况。直接缓冲区也不在 Java 的垃圾回收范围之内。