G1GC:如何使用所有可用内存?

时间:2016-03-06 08:08:17

标签: java garbage-collection g1gc

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

P.S。我希望有通用的解决方案。我不能为每种类型的机器创建单独的版本或单独的运行脚本。

1 个答案:

答案 0 :(得分:2)

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

  

选择收集器

     

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

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

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

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

  •   
  • 如果响应时间比总吞吐量更重要,则垃圾收集暂停时间必须小于约1   第二,然后选择并发收集器   -XX:+UseConcMarkSweepGC-XX:+UseG1GC

  •   

来源:Selecting a Collector

根据您的评论,您的目标似乎是获得最佳效果;即最大限度地减少在GC和相关费用上花费的总时间。

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

  • 设置一些性能目标,让JVM决定哪个收集器最好。有关性能目标机制的详细信息,请参阅Behavior-based Tuning材料。
  • 如果您只有一个核心,请选择Serial GC。
  • 如果您有多个核心,请选择并行GC。

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