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