3 回答

TA貢獻1803條經驗 獲得超3個贊
取決于您的 JVM 使用的是哪種 GC。如果它是 JDK9,那么它可能是 G1,它在內存消耗方面是“貪婪的”,因此根據您檢查內存使用的方式,它可能看起來好像占用了大量內存(其中正在保留它并動態/按需使用/釋放。
您可以使用
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html
檢查內存消耗。
至于 GC 和內存消耗分析,請查看以下內容: G1 垃圾收集器的高內存使用問題 + https://www.javacodegeeks.com/2017/11/minimize-java-memory-usage-right-garbage-collector.html

TA貢獻1891條經驗 獲得超3個贊
未使用的內存是浪費的內存。
為什么要顯式調用System.gc()
. 恕我直言,您永遠不應該調用它并讓 JVM 來決定何時運行 GC。(如果您是新手,JVM 可以做出比您更好的決定。System.gc()
只有在您真正知道自己在做什么時才調用。)調用System.gc()
.
System.gc()
只是對 JVM 運行 GC 的請求/提示。這絕不意味著 GC 肯定會運行。
您可以在 Java 中出現內存泄漏,但這肯定不是您需要考慮的問題,因為正如您在調用時提到的那樣,System.gc()
您可以看到一些內存被釋放。(所以不是你仍然持有未使用對象的引用,這會阻止 GC 清理這些對象。)
為什么你認為你的代碼有問題?可能不需要更多內存,或者如果需要內存,你已經有足夠的內存了(用外行的話來說,GC 不會釋放內存,因為程序還有很多東西可以運行 -那么GC為什么要清理內存呢?)。

TA貢獻1828條經驗 獲得超4個贊
沒有辦法強制JVM釋放內存,System.gc()
只是一個提示。由 GC 來管理內存(請注意有各種類型的內存,例如堆、元空間、堆外)。每個 GC 算法都有多個可以調整的配置參數,但它們都不會給您提供按需釋放內存的選項。
JVM 在啟動時保留內存并從操作系統請求額外的內存,直到達到配置的任何限制。它以塊增量的方式進行,一次請求 MB 或更多內存,因為從操作系統逐字節請求內存效率非常低。
添加回答
舉報