我正在尝试为春季启动微服务调整生产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
答案 0 :(得分:1)
目前,我正在处理应用程序仅运行几秒钟甚至几分钟的情况,然后立即死亡,而Dropwizard指标中没有简单的日志和事件错误
一个进程不仅应该死,还应该具有异常或崩溃转储。如果您的计算机超载,您的进程可能会在Linux上被杀死以保护系统。如果发生这种情况,则应登录/var/log/messages
如果您的程序随机调用System.exit(int)
,则SecurityManager应该阻止它或至少将其记录下来。
所以目标是使内存优化的完全记录的jvm。
不幸的是,您提到的许多日志都已缓冲,因此,如果进程被杀死,则很可能会丢失最后几条记录,可能会丢失最后几分钟的记录。这些日志对于诊断性能问题很有用,但可能无法帮助确定进程意外终止的原因。
调整内存/ gc性能以避免oom
这是另一种问题。您需要尝试
鉴于内存便宜,而您的时间却不多,增加内存可能会更简单。也就是说,请记住您一天的时间可以购买多少内存。