java - Spring boot,JVM参数太多还是刚好够用?

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

我正在尝试为 Spring Boot 微服务调整生产 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 spring-boot(s): 1.5.1

最佳答案

Currently i'am dealing with situations that app is just working few seconds or even minutes and immediately die without simple log and event error in 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应该阻止它或者至少记录它。

So goal is to have memory optimized fully logged jvm.

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

tune memory/gc performance to avoid oom

这是不同类型的问题。你需要尝试

  • 给进程更多的内存,看看进程在什么时候不会终止。
  • 如果这有效,您的进程需要更多内存,如果您的进程随着时间的推移继续消耗内存,则可能会出现内存泄漏。
  • 如果您在代码中的类似位置不断收到 OutOfMemoryErrors,则这很可能是消耗过多内存的地方。
  • 很可能,您没有足够的内存来执行它正在执行的任务。然后,我会使用分析器(例如飞行记录器)查看内存配置文件,看看是否可以减少使用量。在某些时候,您要么通过减少使用来解决问题,要么必须为进程提供更多内存。

考虑到内存很便宜,而你的时间却不便宜,增加内存可能会更简单。即记住您一天可以购买多少内存。

关于java - Spring boot,JVM参数太多还是刚好够用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53296389/

相关文章:

java - 如何跟踪 Firestore 读/写操作?

java - 如何使用 Hibernate 和 Spring Boot 配置和监控 HikariCP

spring - 在IDE中运行Spring Boot时找不到JSP,但手动运行时可以工作

spring-boot - spring boot - 每个开发人员的应用程序 yml

Java 8 lambda Void 参数

java - 不使用 Java Matcher 和 Pattern API 删除特殊字符

java - Univocity - 如何在没有原始数组的情况下正确写入一行

java - 通过服务器运行Java

java - 使用Callable代替Supplier,反之亦然

java-8 - javadoc 不是用 jdk 1.9 生成的,而是用 jdk 1.8 生成的