簡體   English   中英

Java進程內存使用量遠遠超過Runtime.totalMemory等方法所說的

[英]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

您觀察到的是JVM與進程內存之間的區別。

看看這些答案:

進程內存與堆 - JVM

JVM進程與JVM堆內存使用情況

由於您在每個系統上使用不同的JVM實現,因此可能具有不同的內存行為。

暫無
暫無

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

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