我用C编写了一个库,它消耗了大量内存(数百万个小块).我写了一个使用这个库的程序.我写了一个使用相同库的
java程序.
Java程序是库周围非常薄的层.基本上只有一个被调用的本机方法,所有的工作和几个小时后返回.使用java调用接口,Java和本机库之间没有进一步的通信.也没有Java对象消耗了大量的内存.
所以c程序和Java程序非常相似.整个计算/内存分配发生在本机库中.仍然.执行时,c程序消耗3GB内存.但Java程序消耗4.3GB! (顶部报告的VIRT金额)
我检查了Java进程的内存映射(使用pmap).图书馆只使用40MB.因此,Java加载的其他库不是原因.
有没有人对这种行为有解释?
编辑:感谢您的答案到目前为止.为了使它更清晰一点:java代码除了调用本机库之外什么都不做! java堆是标准大小(可能是60MB)并且未使用(除了包含main方法的一个类和调用本机库的另一个类).
本机库方法是一个长期运行的方法,并且可以执行大量的malloc和frees.碎片化也是我自己想到的一种解释.但由于没有Java代码处于活动状态,因此Java程序和c程序的碎片行为应该相同.由于它不同,我还假设在c程序或Java程序中运行时使用的malloc实现是不同的.
解决方法
猜测:在JVM中运行时,您可能正在使用非默认的malloc实现,这种实现可以调整JVM的特定需求,并且比普通libc实现中的通用malloc产生更多的开销.