春季启动,JVM太多还是足够的参数?

时间:2018-11-14 09:03:32

标签: java spring-boot java-8 jvm jvm-arguments

我正在尝试为春季启动微服务调整生产JVM,现在我列出了该列表

-XX:+UnlockExperimentalVMOptions 
-XX:+UseCGroupMemoryLimitForHeap 
-XX:MaxRAMFraction=2
-XX:+UseStringDeduplication 
-XX:+PrintStringDeduplicationStatistics 
-XX:+CrashOnOutOfMemoryError 
-XX:+HeapDumpOnOutOfMemoryError 
-XX:+UseG1GC 
-XX:+PrintGCDetails 
-XX:+PrintGCDateStamps 
-Xloggc:/tmp/gc.log 
-XX:+UseGCLogFileRotation 
-XX:NumberOfGCLogFiles=5 
-XX:GCLogFileSize=2000k 
-XX:HeapDumpPath='/var/log/heap_dump.log' 
-XX:+UseGCOverheadLimit
-XX:NativeMemoryTracking=summary
-XX:+UnlockDiagnosticVMOptions 
-XX:+PrintNMTStatistics

您怎么看,如果我发现其中没有一个人“复制”了他们的功能,但我仍然不是100%足够了,或者我可以添加/删除其中的一些而不必担心丢失信息。

我的目标是获取尽可能多的jvm中发生的信息,并调整内存/ gc性能以避免oom。 应用正在docker中运行。

一些细节:jdk 1.8 u152 弹簧靴:1.5.1

1 个答案:

答案 0 :(得分:1)

  

目前,我正在处理应用程序仅运行几秒钟甚至几分钟的情况,然后立即死亡,而Dropwizard指标中没有简单的日志和事件错误

一个进程不仅应该死,还应该具有异常或崩溃转储。如果您的计算机超载,您的进程可能会在Linux上被杀死以保护系统。如果发生这种情况,则应登录/var/log/messages

请参见https://unix.stackexchange.com/questions/136291/will-linux-start-killing-my-processes-without-asking-me-if-memory-gets-short

如果您的程序随机调用System.exit(int),则SecurityManager应该阻止它或至少将其记录下来。

  

所以目标是使内存优化的完全记录的jvm。

不幸的是,您提到的许多日志都已缓冲,因此,如果进程被杀死,则很可能会丢失最后几条记录,可能会丢失最后几分钟的记录。这些日志对于诊断性能问题很有用,但可能无法帮助确定进程意外终止的原因。

  

调整内存/ gc性能以避免oom

这是另一种问题。您需要尝试

  • 为该进程提供更多的内存,并查看该进程在何时不死。
  • 如果这可行,则您的进程需要更多的内存,如果您的进程随着时间的推移继续消耗内存,则可能会发生内存泄漏。
  • 如果您在代码的相似位置持续出现OutOfMemoryErrors,则很可能是这在消耗太多内存的地方。
  • 最有可能的是,您没有足够的内存来执行其任务。然后,我将使用诸如飞行记录器之类的分析器查看内存配置文件,以查看是否可以减少使用量。在某些时候,您要么通过减少使用量来解决问题,要么必须给该进程更多的内存。

鉴于内存便宜,而您的时间却不多,增加内存可能会更简单。也就是说,请记住您一天的时间可以购买多少内存。