为什么本机库在使用java时使用的内存比在Linux下使用C-Programm时多1.5倍?

前端之家收集整理的这篇文章主要介绍了为什么本机库在使用java时使用的内存比在Linux下使用C-Programm时多1.5倍?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我用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产生更多的开销.

猜你在找的Java相关文章