我正在用 Java 对服务器进程进行基准测试,看起来 Hotspot 并没有产生很多 GC,但是当它发生时,它的性能会大大提高。
我可以强制热点频繁地进行较小的 GC,而不是一些大规模的长 GC 吗?
我正在用 Java 对服务器进程进行基准测试,看起来 Hotspot 并没有产生很多 GC,但是当它发生时,它的性能会大大提高。
我可以强制热点频繁地进行较小的 GC,而不是一些大规模的长 GC 吗?
You can try changing the GC to parallel or concurrent. Here's a link to the documentation.
http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html
干扰 GC 的调用时间通常是个坏主意。如果 gc 的性能有问题,更好的方法是调整 eden、survivor 和 old space 的大小。
如果必须进行一次完整的扫描,那么它被调用的频率并不重要,速度总是相对较慢,唯一快速的 gc 调用是那些在伊甸园和幸存者空间中的调用。
因此增加伊甸园和幸存者空间可能会解决您的问题,但不幸的是,良好的内存分析相当耗时且执行起来很复杂。
http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html (从其他答案窃取的链接)还提供了有关如何在必要时进行配置的选项。-XX:NewRatio=2 或 -XX:NewRatio=3 可能会提高您的速度,但也可能会减慢速度。不幸的是,这非常依赖于应用程序。
您可以通过以下方式告诉 JVM 以编程方式进行垃圾收集:System.gc()。请注意,Javadoc 说这只是一个建议。您可以在进入不希望 GC 性能损失的关键部分之前尝试调用它。
您可以通过减少年轻/新大小或更频繁地调用 gc 来增加执行 GC 的频率。这并不意味着你会暂停更短的时间,只是它会经常发生。
减少 GC 影响的最佳方法是对应用程序进行内存分析并减少产生的垃圾量。这不仅会使您的代码更快,而且会减少每次 GC 发生的频率和持续时间。
在更极端的情况下,您可以将 GC 发生的频率减少到每天不到一次,将其作为一个问题一起消除。