Java JNA包装器和内存消耗

时间:2019-04-23 10:11:12

标签: java memory memory-management jvm jna

我有一个疑问,带有JNA包装器的JVM处理如何显示内存消耗。

例如,我运行使用OpenCV JNA包装器的Java应用程序。 Java应用程序本身消耗例如1GB的RAM,而OpenCV本机库消耗3GB的RAM。 所以总的来说,当我找到合适的Java JVM进程时(通过ps命令),它将显示1GB的RAM或4GB(1 + 3)的RAM?

1 个答案:

答案 0 :(得分:2)

您的ps输出将为RSS显示1GB(“驻留集大小-分配给该进程的多少内存,并在RAM中。”)Java进程不会直接显示已使用的本机内存;但是,它将显示为VSZ的一部分(虚拟内存大小-进程可以访问的所有内存,包括换出的内存,已分配但未使用的内存以及来自共享库的内存。)

例如,我编写了以下代码:

import com.sun.jna.Memory;

public class TinyJavaBigC {
    public static void main(String[] args) {
        // Grab 1 GiB of memory
        Memory buf = new Memory(1 << 30);
        // Sleep long enough to grab ps
    }
}

无论使用new Memory(bytes)(有效调用malloc)保留的本机内存量如何,Java应用程序始终在RSS中使用相同数量的内存,并使用{{1}来限制Java堆大小}没有阻止超出此限制的本机内存分配。但是,本机内存的1 GiB显然已从操作系统的“可用”内存中消失了。

我将上面的代码放在循环中以增加左移值进行分配,并使用-Xmx运行了该代码,应该将JVM堆限制为512 MiB。 RSS(包括所有JVM堆栈和堆内存)保持在大约50 MiB范围内。分配的内存确实显示在与该进程关联的-Xmx512m中。由于这还包括其他类型的内存,因此这不是直接的衡量标准,并且大大超出了可用RAM和交换文件大小的限制,但至少确实显示出分配增加的某些迹象。

VSZ