1

我正在用 Java 对服务器进程进行基准测试,看起来 Hotspot 并没有产生很多 GC,但是当它发生时,它的性能会大大提高。

我可以强制热点频繁地进行较小的 GC,而不是一些大规模的长 GC 吗?

4

4 回答 4

1

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

于 2012-04-04T12:07:36.393 回答
1

干扰 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 可能会提高您的速度,但也可能会减慢速度。不幸的是,这非常依赖于应用程序。

于 2012-04-04T12:18:23.667 回答
0

您可以通过以下方式告诉 JVM 以编程方式进行垃圾收集:System.gc()。请注意,Javadoc 说这只是一个建议。您可以在进入不希望 GC 性能损失的关键部分之前尝试调用它。

于 2012-04-04T12:16:45.273 回答
0

您可以通过减少年轻/新大小或更频繁地调用 gc 来增加执行 GC 的频率。这并不意味着你会暂停更短的时间,只是它会经常发生。

减少 GC 影响的最佳方法是对应用程序进行内存分析并减少产生的垃圾量。这不仅会使您的代码更快,而且会减少每次 GC 发生的频率和持续时间。

在更极端的情况下,您可以将 GC 发生的频率减少到每天不到一次,将其作为一个问题一起消除。

于 2012-04-04T12:51:33.327 回答