![](/img/trans.png)
[英]Java: on the cost of calling Runtime.freeMemory(), Runtime.totalMemory() and Runtime.maxMemory()
[英]Java process memory usage much more than what Runtime.totalMemory et al methods are telling
我一直堅持這個問題很久沒有任何暗示。 如果有人能提供幫助,我們真的很感
我正在使用ARM v7處理器在設備上運行Java應用程序。它上面安裝了Ubuntu。 使用“top”或“free -m”命令看到的進程的內存使用量大約為180 MB,遠遠超過Runtime.freeMemory等方法告訴我的內存。
這就是我開始申請的方式:
java -Xcheck:jni -XX:MaxPermSize = 25m -Xmx65m -XX:ReservedCodeCacheSize = 10m -jar MyAPP.jar myconfig.xml
據我了解,此進程的總內存使用量不應超過25 + 65 + 10 = 100 MB
。 它可能會更多(我不知道的其他非堆空間)。 但即便如此,我也不認為差異應該是這么多(80 MB)。
這就是“運行時”命令似乎在我的日志中告訴我的內容(我使用這些命令來打印使用信息作為我的調試日志的一部分)。
使用信息:Avaialable處理器:2個可用於JVM的可用內存:8474344,當前內存使用量:5943576,允許使用的最大內存JVM:66977792
“頂部”輸出:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3926 linaro 20 0 266m 188m 3636 S 1.0 21.1 0:37.81 java
“free -m”的輸出:
當Java進程運行時:
total used free shared buffers cached
Mem: 893 842 51 0 40 216
-/+ buffers/cache: 585 308
Swap: 0 0 0
當進程停止時:
total used free shared buffers cached
Mem: 893 656 237 0 40 216
-/+ buffers/cache: 400 493
Swap: 0 0 0
正如我們所看到的,493 - 308 = 185,匹配“頂級”關於此進程的內存使用情況的說法(之前我認為可能在此計算機上安裝了頂級錯誤)。
我也對這個進程進行了遠程監控,它顯示了大約14M的“已提交”堆空間和大約20M的非堆。 至少堆空間與我從“運行時”命令獲得的空間相匹配。 因此,即使遠程監控工具似乎也說內存使用量遠低於180M。
最奇怪的部分是,當我在筆記本電腦(MacBook Pro)或基於標准Intel的Linux機箱(不是ARM)上運行時,同樣的罐子似乎到位。 進程只使用大約60 MB的空間,這是我所期望的。
值得一提的另一點是我在ARM設備上使用的Java VM是Oracle的Java SE Embedded版本。
任何人都知道這種內存使用上的差異。 很抱歉問這么長的問題:-)。
更新:
在對可以消耗內存的Java進程的各個部分進行一些研究之后,我將本機代碼交互(JNI)歸結為一體。 這是唯一一個我們無法通過命令實時參數限制內存消耗的人。 在我的程序中,我使用sqlite-jdbc驅動程序來訪問數據庫。 我評論了數據庫訪問部分和內存使用量降至24MB! 所以我猜這個內存差異與這個sqlite jdbc訪問有關,雖然還不確定它是什么。 隨着我取得一些進展,將繼續更新。
-Sandeep
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.