我有一个小的Java控制台应用程序,希望在内存使用方面进行优化。它运行时Xmx设置为仅64MB。根据不同的监控工具(htop,ps,pmap,Dynatrace)显示的进程的整体内存使用量超过250MB。我主要在Ubuntu 18上运行它(也在其他操作系统上进行了测试)。
我使用了-XX:NativeMemoryTracking java参数和jcmd的本地内存跟踪来查找为什么会在堆之外使用如此多的内存。
当汇总NMT显示的值时,与htop显示的Resident Memory几乎相同。
NMT:
Total: reserved=1518873KB, committed=255877KB
htop:
我使用了几个JVM参数来减少本地内存消耗(降低堆栈大小,将GC更改为串行,类数据共享等)。根据NMT,保留和已提交的内存指标(malloc和mmaped)总体上都下降了约50MB。
NMT:
Total: reserved=1475110KB, committed=209218KB
我使用的所有工具(htop, ps, pmap, Dynatrace)都没有显示出任何区别。进程使用的总内存仍然是250MB。
- 问题是为什么?为什么将JVM使用的本地内存减少并没有对Java进程使用的驻留内存产生任何影响?它是否在预先保留某种方式并且不会被释放?
- 除了堆以外(已经优化并设置为64MB) ,还有其他有效降低整个Java进程内存消耗的方法吗?