Java进程内存使用率远远超过Runtime.totalMemory等方法的使用率

Java进程内存使用率远远超过Runtime.totalMemory等方法的使用率,java,memory-management,embedded,Java,Memory Management,Embedded,我已经被这个问题困扰了很长时间,没有任何暗示。如果有人能帮忙,我会非常感激的 我正在使用ARMV7处理器的设备上运行Java应用程序,上面安装了Ubuntu。当使用“top”或“free-m”命令时,进程的内存使用量约为180 MB,这比Runtime.freemory等方法告诉我的要多得多 以下是我启动应用程序的方式: java-Xcheck:jni-XX:MaxPermSize=25m-Xmx65m -XX:ReservedCodeCacheSize=10m-jar MyAPP.jar my

我已经被这个问题困扰了很长时间,没有任何暗示。如果有人能帮忙,我会非常感激的

我正在使用ARMV7处理器的设备上运行Java应用程序,上面安装了Ubuntu。当使用“top”或“free-m”命令时,进程的内存使用量约为180 MB,这比Runtime.freemory等方法告诉我的要多得多

以下是我启动应用程序的方式:

java-Xcheck:jni-XX:MaxPermSize=25m-Xmx65m -XX:ReservedCodeCacheSize=10m-jar MyAPP.jar myconfig.xml

据我所知,此进程的总内存使用量不应超过
25+65+10=100 MB
。它可能会多一点(我不知道其他非堆空间)。但即使这样,我也不认为差别应该有这么大(80MB)

这是“运行时”命令在我的日志中告诉我的(我使用这些命令将使用情况信息打印为调试日志的一部分)

使用信息:可用处理器:JVM可用的2个可用内存:8474344,当前内存使用量:5943576,JVM允许使用的最大内存:66977792

“顶部”的输出:

“自由-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可能有一个bug)

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

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

另一点值得一提的是,我在ARM设备上使用的JavaVM是Oracle的JavaSE嵌入式版本

任何对这种内存使用差异有想法的人。很抱歉问这么长的问题:-)

更新:

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


-Sandeep

您观察到的是JVM与进程内存之间的差异

看看这些答案:


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

我知道堆空间在一定范围内。这是一个进程内存,我无法弄清楚它在哪里被使用。我正在寻找一种方法来找出谁在使用进程内存的哪一部分。我还查看了进程的/proc/id/smap输出。似乎有大约140MB的内存是匿名映射的,也就是说,没有实际的文件映射该内存。有没有办法找出谁负责匿名内存分配?
         total      used       free     shared    buffers     cached
Mem:      893        656        237          0         40        216
-/+ buffers/cache:   400        493
Swap:      0          0          0