使用-XX:+ UseSerialGC和-XX:+ UseParallelGC运行Spring Boot应用程序

时间:2019-01-26 07:48:13

标签: spring-boot java-8 garbage-collection

我在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内存并提供最佳的垃圾回收?

1 个答案:

答案 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秒以内。

     

如果推荐的收集器未达到所需的性能,   第一次尝试调整堆和生成大小以满足   期望的目标。如果性能仍然不足,请尝试   不同的收集器:使用并发收集器以减少暂停   并使用并行收集器来提高整体吞吐量   多处理器硬件。