簡體   English   中英

如何正確限制 JVM 的內存使用量?

[英]How do I properly limit JVM's memory usage?

我已經被我的問題困住了很長一段時間。 為了給您提供一些上下文,我用 Java 編寫了一個機器人,並計划在 Raspberry Pi 3 Model A+ 24/7 上運行它。 令我驚訝的是,當我測試幾乎完成的程序時,它的內存消耗無限增加。

很快我意識到,我必須限制過去幾個月我在幾個網站上查找的內存使用量。 不幸的是,它們中的大多數已經過時(2013 年及更早),並且很少有較新的版本沒有涵蓋必須發生的重要更改,因為我無法弄清楚為什么我的問題仍在發生。

我在這么長的時間里嘗試了很多事情,我不確定我是否能夠總結到目前為止我嘗試過的所有事情,但如果我記得一些重要的細節,我會更新這篇文章。

請使用以下設置查看我上次測試的圖片:

java -Xmx4m -Xms4m -Xss64k -XX:MaxMetaspaceSize=8m -jar bot.jar

在此處輸入圖片說明

在此處輸入圖片說明

如您所見,內存不受限制,並且很快就達到了進程被終止的程度。 在我之前的一些測試中,我使用了一個空的 while(true) 循環,因為我認為我的程序中沒有內存泄漏。 奇怪的是,空循環也非常緩慢地增加了內存大小,但也沒有隨着時間的推移而減少。

在這一點上,我不確定 JVM 是否能夠具有指定的內存限制。 我的代碼使用 Robot 類來制作屏幕截圖並觸發嵌套 while 循環中的某些按鈕,這也提醒垃圾收集器使用 System.gc() 提示收集。 我是否還必須對 JVM 使用以下參數?

-XX:MaxDirectMemorySize

我也對 Java 的所有變化感到困惑。 我嘗試了幾種不同的 JDK,因為我認為這可能會解決問題。 最后一個測試是用 JDK 14 編譯並在 Java 11 上運行的。我是否需要在操作系統上配置一些東西來限制內存消耗?

也許你們也可以向我推薦一個分析器,我可以用它檢查什至分配內存的內容,以便找出需要通過參數限制的內容,但我肯定需要一些幫助,因為我以前從未使用過。

我感謝有關此主題的任何幫助! 如果您需要任何其他信息,請告訴我,我將盡我所能在一周內跟進。

也許您可以使用以下參數: -XX:+PrintGCDetails -Xloggc:/tmp/jvm-gc.log 它將在 /tmp/jvm-gc.log 中記錄 gc 詳細信息。

或者您可以使用以下命令檢查運行時堆的大小:

# get the pid
ps -aux | bot.jar

# show the heap info
jmap -heap <pid>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM