【发布时间】:2020-10-19 10:23:45
【问题描述】:
我有一个小型 Java 控制台应用程序,我想在内存使用方面进行优化。它在 Xmx 设置为仅 64MB 的情况下运行。根据不同的监控工具(htop、ps、pmap、Dynatrace),进程的整体内存使用情况显示值在 250MB 以上。我主要在 Ubuntu 18 上运行它(也在其他操作系统上测试过)。
我使用了 -XX:NativeMemoryTracking java param 和 Native Memory Tracking with jcmd 来找出为什么在堆外使用了这么多内存。
NMT 在汇总时显示的值或多或少与 htop 作为 Resident Memory 显示的值相同。
神经机器翻译:
Total: reserved=1518873KB, committed=255877KB
htop:
我使用了几个 JVM 参数来减少本机内存消耗(减少堆栈大小、将 GC 更改为串行、类数据共享等)。 根据 NMT(malloced 和 mmaped),保留和提交的内存指标都下降了约 50MB。
神经机器翻译:
Total: reserved=1475110KB, committed=209218KB
我使用的所有工具(htop、ps、pmap、Dynatrace)完全没有区别。该进程使用的总内存仍为 250MB。
- 问题是,为什么会这样?为什么减少 JVM 的本机内存使用量不会对 java 进程使用的常驻内存产生任何影响?它是否以某种方式预先保留而不发布?
- 有没有其他方法可以有效减少整个 java 进程的内存消耗(在已经优化并设置为仅 64MB 的堆之外)?
【问题讨论】:
-
谢谢@codinnvrends,但我还是不明白。我知道 JVM 在堆旁边使用内存。我可以通过 NMT 看到完整的细节,并且我正在寻求优化。我仍然不明白为什么即使 NMT 显示更少的内存消耗在操作系统级别上也没有区别
标签: java memory operating-system jvm