2

我尝试在我的程序中使用 G1GC。程序用于具有各种内存大小的各种机器:具有 1Gb 内存(最小)的 VPS、具有 8Gb 内存的台式机、具有 32Gb 内存(最大)的 DS。我注意到即使有很多可用内存,G1GC 也不会保留更多内存(例如,G1GC 在我的机器上没有保留超过 3Gb,总共 8Gb / 4Gb 空闲)

PS我想要通用的解决方案。我无法为每种类型的机器创建单独的版本或单独的运行脚本。

4

1 回答 1

2

我认为您选择了错误的垃圾收集算法。Java 8 文档提供了以下指南:

选择收集器

除非您的应用程序有相当严格的暂停时间要求,否则首先运行您的应用程序并允许 VM 选择收集器。如有必要,调整堆大小以提高性能。如果性能仍未达到您的目标,则使用以下指南作为选择收集器的起点。

  • 如果应用程序有一个小数据集(最多大约 100 MB),则选择带有选项的串行收集器-XX:+UseSerialGC

  • 如果应用程序将在单个处理器上运行并且没有暂停时间要求,则让 VM 选择收集器,或者选择带有选项的串行收集器-XX:+UseSerialGC

  • 如果 (a) 峰值应用程序性能是第一优先级,并且 (b) 没有暂停时间要求或 1 秒或更长的暂停是可以接受的,那么让 VM 选择收集器,或者选择并行收集器-XX:+UseParallelGC

  • 如果响应时间比整体吞吐量更重要,并且垃圾收集暂停必须保持短于大约 1 秒,则使用 -XX:+UseConcMarkSweepGC或选择并发收集器-XX:+UseG1GC

来源:选择收藏家

根据您的评论,您的目标似乎是获得最佳性能;即最小化花费在 GC 和相关开销上的总时间。

这意味着您的最佳选择是:

  • 设置一些性能目标,让 JVM 来决定哪个收集器是最好的。有关性能目标机制的详细信息,请参阅基于行为的调优材料。
  • 如果您只有一个核心,请选择串行 GC。
  • 如果您有多个核心,请选择并行 GC。

如果您想要一个适用于所有硬件的万能脚本,那么性能目标方法是最好的,尽管这意味着您将无法使用特定于平台的设置来(可能)改进 JVM 的决策。

于 2016-03-06T11:25:18.887 回答