我有一個Spring boot應用程序,一旦部署到heroku 512 Mb dyno。在某些時候,應用程序初始化在 JPA EntityManager 初始化時隨機開始面臨“Java 堆空間”錯誤。我已將內(nèi)存增加至 1 Gb,將測功機切換至 Standard-1。指標已啟用,我意識到,在大多數(shù)時間里,我的內(nèi)存占用量為 512 Mb,甚至占用率還稍高。因此,看起來 1 Gb 就足夠了,因為之前它已經(jīng)成功地在 512 Mb 下工作。令人驚訝的是,我仍然在部署中獲得隨機成功:有時我會遇到 Java 堆空間錯誤,有時則不會。成功后,內(nèi)存占用當然超過了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 的內(nèi)容。我也無法用我自己的更大的 -Xmx 覆蓋這個值我的問題有多個:1)我如何確定,在Spring-Boot啟動時,JVM已經(jīng)使用-Xmx671m,而不是-Xmx256m。一旦我嘗試升級到 2 Gb dyno,但即使在它之下,我也遇到了 Java 堆空間錯誤,例如初始命令行調(diào)用的 -Xmx256m 仍然相同,即使對于 2Gb dyno 也是有意義的,而 -Xmx2Gb 設置當應用程序失敗時,JAVA_TOOLS_OPTIONS 中的 for 實際上并不影響啟動的那部分。2)如果 JAVA_TOOLS_OPTIONS 中的 -Xmx 實際上有意義,那么 Spring Boot 應用程序如何在啟動時嘗試占用比稍后工作期間使用的堆更多的堆,以及它如何每次占用隨機卷?是否可以調(diào)整此行為(例如,識別未使用的 bean 并排除它們;添加一些 JVM 選項等)
1 回答

叮當貓咪
TA貢獻1776條經(jīng)驗 獲得超12個贊
確認實際Xmx
值的最佳方法是使用heroku java:jconsole
命令heroku ps:exec
或使用類似于然后jinfo
在進程中使用的命令。
您還可以包含heroku-javaagent 來記錄內(nèi)存統(tǒng)計信息或使用-XX:+PrintGC
.?這兩個都會記錄堆統(tǒng)計信息,您可以使用 查看它們heroku logs --tail
。
我不確定我是否理解你問題的第二部分,但我懷疑你看到 JVM 使用了大量的堆外內(nèi)存。
添加回答
舉報
0/150
提交
取消