我有一个Spring boot应用程序,一旦部署到heroku 512 Mb dyno。在某些时候,应用程序初始化在 JPA EntityManager 初始化时随机开始面临“Java 堆空间”错误。我已将内存增加至 1 Gb,将测功机切换至 Standard-1。指标已启用,我意识到,在大多数时间里,我的内存占用量为 512 Mb,甚至占用率还稍高。因此,看起来 1 Gb 就足够了,因为之前它已经成功地在 512 Mb 下工作。令人惊讶的是,我仍然在部署中获得随机成功:有时我会遇到 Java 堆空间错误,有时则不会。成功后,内存占用当然超过了512Mb,但明显小于1Gb。Heroku自己指定了-Xmx,我无法配置它。java $JAVA_OPTS -Xmx256m -jar target/*.jar --spring.profiles.active=prod,heroku,no-liquibase --server.port=$PORT是启动应用程序的命令行。我可以将 $JAVA_OPTS 设置为 -Xmx900m,但它不会被拾取。此外,它通过其自身形成 JAVA_TOOLS_OPTIONS,为 1Gb Standard-1 heroku dyno 设置有关 -Xmx671m 的内容。我也无法用我自己的更大的 -Xmx 覆盖这个值我的问题有多个:1)我如何确定,在Spring-Boot启动时,JVM已经使用-Xmx671m,而不是-Xmx256m。一旦我尝试升级到 2 Gb dyno,但即使在它之下,我也遇到了 Java 堆空间错误,例如初始命令行调用的 -Xmx256m 仍然相同,即使对于 2Gb dyno 也是有意义的,而 -Xmx2Gb 设置当应用程序失败时,JAVA_TOOLS_OPTIONS 中的 for 实际上并不影响启动的那部分。2)如果 JAVA_TOOLS_OPTIONS 中的 -Xmx 实际上有意义,那么 Spring Boot 应用程序如何在启动时尝试占用比稍后工作期间使用的堆更多的堆,以及它如何每次占用随机卷?是否可以调整此行为(例如,识别未使用的 bean 并排除它们;添加一些 JVM 选项等)
1 回答
叮当猫咪
TA贡献1776条经验 获得超12个赞
确认实际Xmx
值的最佳方法是使用heroku java:jconsole
命令heroku ps:exec
或使用类似于然后jinfo
在进程中使用的命令。
您还可以包含heroku-javaagent 来记录内存统计信息或使用-XX:+PrintGC
. 这两个都会记录堆统计信息,您可以使用 查看它们heroku logs --tail
。
我不确定我是否理解你问题的第二部分,但我怀疑你看到 JVM 使用了大量的堆外内存。
添加回答
举报
0/150
提交
取消