Edu*_*rch 7 java linux memory native
我用C编写了一个库,它消耗了大量内存(数百万个小块).我写了一个使用这个库的ac程序.我写了一个使用相同库的java程序.Java程序是库周围非常薄的层.基本上只有一个本地方法被调用,所有的工作都会在几个小时之后完成.使用java调用接口,Java和本机库之间没有进一步的通信.也没有Java对象占用了大量的内存.
所以c程序和Java程序非常相似.整个计算/内存分配发生在本机库中.仍然.执行时,c程序消耗3GB内存.但Java程序消耗4.3GB!(顶部报告的VIRT金额)
我检查了Java进程的内存映射(使用pmap).图书馆只使用40MB.因此,Java加载的其他库不是原因.
有没有人对这种行为有解释?
编辑:感谢您的答案到目前为止.为了让多一点更清晰:Java代码什么也不做,但调用本地库ONCE!java堆是标准大小(可能是60MB)并且未使用(除了包含main方法的一个类和调用本机库的另一个类).
本机库方法是一个长期运行的方法,并且可以执行大量的malloc和frees.碎片化也是我自己想到的一种解释.但由于没有Java代码处于活动状态,因此Java程序和c程序的碎片行为应该相同.由于它不同,我还假设在c程序或Java程序中运行时使用的malloc实现是不同的.
对不起大家。错误的假设。
我已经习惯了 Sun Java 实现使用 64MB 作为默认最大堆大小。但我使用openjdk 1.6进行测试。如果未显式指定最大堆大小,Openjdk 将使用一小部分物理内存。就我而言,是四分之一。我用的是4GB的机器。因此四分之一是 1GB。这就是C和Java之间的区别。
遗憾的是这种行为没有任何记录。查看openjdk的源码发现是这样的(arguments.cpp):
// If the maximum heap size has not been set with -Xmx,
// then set it as fraction of the size of physical memory,
// respecting the maximum and minimum sizes of the heap.
Run Code Online (Sandbox Code Playgroud)