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

我正在尝试为春季启动微服务调整生产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

最佳答案

目前,我正在处理应用仅工作几秒钟甚至几分钟的情况,并立即死亡,而Dropwizard Metrics中没有简单的日志和事件错误


进程不仅应该死,还应该具有异常或崩溃转储。如果您的计算机过载,则您的进程可能会在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,则很可能是这在消耗太多内存的地方。
最有可能的是,您没有足够的内存来执行任务。然后,我将使用诸如飞行记录器之类的探查器查看内存配置文件,以查看是否可以减少使用量。在某些时候,您要么通过减少使用量来解决问题,要么必须给该进程更多的内存。


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

本文翻译自 https://stackoverflow.com/questions/53296389/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

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


相关文章:

java - 根据布尔值对列表进行部分排序

java - 将时间设置为00:00:00

java - 如何基于Java中的输入数据顺序/名称动态调用不同的setter方法?

java - 用码头建造docker镜像-我什么时候应该建造?

java - 我的isPrime方法有什么问题?

java - 如何告诉Java 8使用我自己的库而不是内部库?

java - 春季靴找不到类型的豆

java - Spring MVC:将复杂对象作为参数

java - Elasticsearch集成测试和弹簧测试不能很好地配合使用-AccessControlException

java - 有些场景在maven构建后没有加载