我有一個(gè)Spring boot應(yīng)用程序,一旦部署到heroku 512 Mb dyno。在某些時(shí)候,應(yīng)用程序初始化在 JPA EntityManager 初始化時(shí)隨機(jī)開(kāi)始面臨“Java 堆空間”錯(cuò)誤。我已將內(nèi)存增加至 1 Gb,將測(cè)功機(jī)切換至 Standard-1。指標(biāo)已啟用,我意識(shí)到,在大多數(shù)時(shí)間里,我的內(nèi)存占用量為 512 Mb,甚至占用率還稍高。因此,看起來(lái) 1 Gb 就足夠了,因?yàn)橹八呀?jīng)成功地在 512 Mb 下工作。令人驚訝的是,我仍然在部署中獲得隨機(jī)成功:有時(shí)我會(huì)遇到 Java 堆空間錯(cuò)誤,有時(shí)則不會(huì)。成功后,內(nèi)存占用當(dāng)然超過(guò)了512Mb,但明顯小于1Gb。Heroku自己指定了-Xmx,我無(wú)法配置它。java $JAVA_OPTS -Xmx256m -jar target/*.jar --spring.profiles.active=prod,heroku,no-liquibase --server.port=$PORT是啟動(dòng)應(yīng)用程序的命令行。我可以將 $JAVA_OPTS 設(shè)置為 -Xmx900m,但它不會(huì)被拾取。此外,它通過(guò)其自身形成 JAVA_TOOLS_OPTIONS,為 1Gb Standard-1 heroku dyno 設(shè)置有關(guān) -Xmx671m 的內(nèi)容。我也無(wú)法用我自己的更大的 -Xmx 覆蓋這個(gè)值我的問(wèn)題有多個(gè):1)我如何確定,在Spring-Boot啟動(dòng)時(shí),JVM已經(jīng)使用-Xmx671m,而不是-Xmx256m。一旦我嘗試升級(jí)到 2 Gb dyno,但即使在它之下,我也遇到了 Java 堆空間錯(cuò)誤,例如初始命令行調(diào)用的 -Xmx256m 仍然相同,即使對(duì)于 2Gb dyno 也是有意義的,而 -Xmx2Gb 設(shè)置當(dāng)應(yīng)用程序失敗時(shí),JAVA_TOOLS_OPTIONS 中的 for 實(shí)際上并不影響啟動(dòng)的那部分。2)如果 JAVA_TOOLS_OPTIONS 中的 -Xmx 實(shí)際上有意義,那么 Spring Boot 應(yīng)用程序如何在啟動(dòng)時(shí)嘗試占用比稍后工作期間使用的堆更多的堆,以及它如何每次占用隨機(jī)卷?是否可以調(diào)整此行為(例如,識(shí)別未使用的 bean 并排除它們;添加一些 JVM 選項(xiàng)等)
1 回答

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