gpt4 book ai didi

Java 进程内存使用量远远超过 Runtime.totalMemory 等方法所告诉的

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:13:32 27 4
gpt4 key购买 nike

我一直被这个问题困住了很长时间,没有任何提示。如果有人可以提供帮助,将不胜感激。

我在配备 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)。

这就是“运行时”命令似乎在我的日志中告诉我的(我使用这些命令来打印使用信息作为我的调试日志的一部分)。

使用信息:可用处理器: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,与“top”关于此进程内存使用情况的说法相匹配(之前我认为这台机器上安装的 top 可能存在错误)。

我也对这个进程进行了远程监控,它显示“已提交”的堆空间约为 14M,非堆空间约为 20M。至少堆空间与我从“运行时”命令中获得的相匹配。所以即使远程监控工具似乎也说内存使用量远低于 180M。

最奇怪的是,当我在笔记本电脑 (MacBook Pro) 或标准的基于 Intel 的 Linux 机器(不是 ARM)上运行时,同一个 jar 似乎一切正常。进程仅使用大约 60 MB 的空间,这符合我的预期。

另外值得一提的是,我在ARM设备上使用的Java VM是Oracle的Java SE Embedded版本。

任何知道这种内存使用差异的人。抱歉问这么长的问题:-)。

更新:

在对 Java 进程中可能消耗内存的各个部分进行了一些研究之后,我将注意力集中在 native 代码交互 (JNI) 上。这是唯一一个我们无法通过命令实时参数限制其内存消耗的人。在我的程序中,我使用 sqlite-jdbc 驱动程序来访问数据库。我评论了数据库访问部分,内存使用量下降到 24MB!!!所以我猜测这个内存差异与这个 sqlite jdbc 访问有关,尽管还不确定它是什么。会随着我的进步不断更新。

-桑迪普

最佳答案

您观察到的是 JVM 与进程内存之间的区别。

看看这些答案:

Process Memory Vs Heap -- JVM

JVM Process vs JVM Heap memory usage

由于您在每个系统上使用不同的 JVM 实现,因此您可能会有不同的内存行为。

关于Java 进程内存使用量远远超过 Runtime.totalMemory 等方法所告诉的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10329546/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com