我在ubuntu服务器上运行了没有任何垃圾回收命令行选项的Spring Boot应用程序。
java版本“ 1.8.0_151” Java(TM)SE运行时环境(内部版本1.8.0_151-b12) Java HotSpot(TM)64位服务器VM(内部版本25.151-b12,混合模式)
它需要更多的RAM内存,大约> 500MB +
当我检查google和SO时,得到-XX:+ UseSerialGC 使用此命令行选项,它仅占用200-300MB的RAM内存。
后来听说,与-XX:+ UseSerialGC相比,使用-XX:+ UseParallelGC最佳选择
所以我用了它,但是它只占用了超过500MB +。
什么是最好的命令行选项,以占用更少的RAM内存并提供最佳的垃圾回收?
答案 0 :(得分:0)
与往常一样,“什么最适合...”问题的答案是:“取决于”
经过测试,在硬件和环境设置上,未定义显式收集器,它看起来像是自动选择了并行收集器。
也许它只是根据可用的CPU线程来选择它,但是无论如何,它更多地取决于应用程序的行为。通常,它将需要多少内存,它将运行哪种类型的批处理内存密集型进程以及运行的频率,或者是否正在执行许多并发的小任务。
Oracle的documentation为您提供了以下准则和基础选择:
除非您的应用有相当严格的暂停时间要求, 首先运行您的应用程序,并允许VM选择收集器。如果 必要时,调整堆大小以提高性能。如果 性能仍然无法达到您的目标,然后使用以下方法 准则作为选择收藏家的起点。
如果应用程序的数据集较小(最大约100 MB), 然后
使用选项-XX:+ UseSerialGC选择串行收集器。
如果应用程序将在单个处理器上运行,并且没有 暂停时间要求,然后让VM选择收集器,或者 选择带有选项-XX:+ UseSerialGC的串行收集器。
如果(a)最佳应用性能是第一要务,并且(b) 没有暂停时间要求或暂停时间为1秒或更长时间 是可以接受的,然后让VM选择收集器,或选择 带有-XX:+ UseParallelGC的并行收集器。
如果响应时间比整体吞吐量和垃圾更重要 收集暂停时间必须保持小于1秒, 然后使用-XX:+ UseConcMarkSweepGC选择并发收集器,或者 -XX:+ UseG1GC。
这些准则仅提供了选择 收集器,因为性能取决于堆的大小, 应用程序维护的实时数据量以及数量 和可用处理器的速度。暂停时间特别多 对这些因素敏感,因此提到了1秒的阈值 以前只是近似值:并行收集器将遇到 在许多数据大小和硬件上,暂停时间超过1秒 组合相反,并发收集器可能无法 在某些组合上将暂停时间控制在1秒以内。
如果推荐的收集器未达到所需的性能, 第一次尝试调整堆和生成大小以满足 期望的目标。如果性能仍然不足,请尝试 不同的收集器:使用并发收集器以减少暂停 并使用并行收集器来提高整体吞吐量 多处理器硬件。