为什么本机库在使用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产生更多的开销.

相关文章

ArrayList简介:ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增...
一、进程与线程 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程...
本文为博客园作者所写: 一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 简单的一个类...
#############java面向对象详解#############1、面向对象基本概念2、类与对象3、类和对象的定义格式4、...
一、什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错。在java中,阻止当前方法或作用域...
Collection接口 Collection接口 Collection接口 Collection是最基本的集合接口,一个Collection代表一组...