我尝试在我的程序中使用 G1GC。程序用于具有各种内存大小的各种机器:具有 1Gb 内存(最小)的 VPS、具有 8Gb 内存的台式机、具有 32Gb 内存(最大)的 DS。我注意到即使有很多可用内存,G1GC 也不会保留更多内存(例如,G1GC 在我的机器上没有保留超过 3Gb,总共 8Gb / 4Gb 空闲)
PS我想要通用的解决方案。我无法为每种类型的机器创建单独的版本或单独的运行脚本。
我尝试在我的程序中使用 G1GC。程序用于具有各种内存大小的各种机器:具有 1Gb 内存(最小)的 VPS、具有 8Gb 内存的台式机、具有 32Gb 内存(最大)的 DS。我注意到即使有很多可用内存,G1GC 也不会保留更多内存(例如,G1GC 在我的机器上没有保留超过 3Gb,总共 8Gb / 4Gb 空闲)
PS我想要通用的解决方案。我无法为每种类型的机器创建单独的版本或单独的运行脚本。
我认为您选择了错误的垃圾收集算法。Java 8 文档提供了以下指南:
选择收集器
除非您的应用程序有相当严格的暂停时间要求,否则首先运行您的应用程序并允许 VM 选择收集器。如有必要,调整堆大小以提高性能。如果性能仍未达到您的目标,则使用以下指南作为选择收集器的起点。
如果应用程序有一个小数据集(最多大约 100 MB),则选择带有选项的串行收集器
-XX:+UseSerialGC
。如果应用程序将在单个处理器上运行并且没有暂停时间要求,则让 VM 选择收集器,或者选择带有选项的串行收集器
-XX:+UseSerialGC
。如果 (a) 峰值应用程序性能是第一优先级,并且 (b) 没有暂停时间要求或 1 秒或更长的暂停是可以接受的,那么让 VM 选择收集器,或者选择并行收集器
-XX:+UseParallelGC
。如果响应时间比整体吞吐量更重要,并且垃圾收集暂停必须保持短于大约 1 秒,则使用
-XX:+UseConcMarkSweepGC
或选择并发收集器-XX:+UseG1GC
。
来源:选择收藏家
根据您的评论,您的目标似乎是获得最佳性能;即最小化花费在 GC 和相关开销上的总时间。
这意味着您的最佳选择是:
如果您想要一个适用于所有硬件的万能脚本,那么性能目标方法是最好的,尽管这意味着您将无法使用特定于平台的设置来(可能)改进 JVM 的决策。