【问题标题】:G1GC: How to use all free memory?G1GC:如何使用所有空闲内存?
【发布时间】:2016-03-06 08:08:17
【问题描述】:

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

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

【问题讨论】:

  • 想要保留更多内存的原因是什么(假设您想要更大的堆)? G1 具有较小堆的原因是因为它通常比并行收集器更快地收集垃圾(例如,收集发生得更快并且垃圾被识别得更快)。
  • @Jire 所有保留的内存都已被使用,无法被 GC 回收。 G1GC 尝试收集垃圾而不是保留更多内存。所以,我的应用做 GC 而不是真正的工作。
  • 也许 G1GC 不是您应用的正确选择。如果可能,您是否考虑过尝试减少应用程序热点中的垃圾创建?
  • @Jire 是的,看起来 G1GC 对我的应用程序来说不是一个好选择(我在 SerialGC 和额外的应用内内存检查方面有更好的性能)。在当前情况下:所有保留的内存都用于存储永久对象。而且我想存储更多永久对象。
  • @Xupypr MV:你能发布你的 G1GC 参数吗?通过微调相关参数,我使用 G1GC 得到了很好的结果。看看:stackoverflow.com/questions/8111310/…

标签: java garbage-collection g1gc


【解决方案1】:

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

选择收集器

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

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

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

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

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

来源:Selecting a Collector

根据您的 cmets,您的目标似乎是获得最佳性能;即尽量减少花费在 GC 和相关开销上的总时间。

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

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

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

【讨论】:

  • 因此,如果不设置-Xmx 键,G1GC 无法使用所有可用内存。我说的对吗?
  • 如果您没有指定-Xmx 选项(它不是“键”),那么 JVM 使用的默认堆大小不会是所有可用内存。阅读适用于您平台的 Java 手册条目,了解默认值如何计算 g
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多