我有一个疑问,带有JNA包装器的JVM处理如何显示内存消耗。
例如,我运行使用OpenCV JNA包装器的Java应用程序。 Java应用程序本身消耗例如1GB的RAM,而OpenCV本机库消耗3GB的RAM。
所以总的来说,当我找到合适的Java JVM进程时(通过ps
命令),它将显示1GB的RAM或4GB(1 + 3)的RAM?
答案 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