javajna包装器与内存消耗
我有一个问题,使用JNA包装器的JVM进程如何显示内存消耗 例如,我运行使用OpenCV JNA包装器的Java应用程序。例如,Java应用程序本身消耗1GB的RAM,OpenCV本机库消耗3GB的RAM。javajna包装器与内存消耗,java,memory,memory-management,jvm,jna,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 您的ps输出将显示1GB的RSS(驻留集大小——分配给该进程的内存量以及内存大小)。Java进程不会直接显示使用的本机内存;但是,它将显示为VSZ的一部分(虚拟内存大小—进程可以
总的来说,当我找到合适的Java JVM进程时(通过
ps
命令),它将显示1GB的RAM或4GB(1+3)的RAM 您的ps
输出将显示1GB的RSS(驻留集大小——分配给该进程的内存量以及内存大小)。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
}
}
本机lib通常使用系统内存分配器分配内存,即crt/libc malloc/free。这些虚拟内存页不由JVM垃圾收集器管理,JVM垃圾收集器也从操作系统分配此内存-xms[256m]-xmx[1G]命令行选项限制此内存块的最小/最大值。换句话说-1+3=4GB。其中1GB-JVM管理内存和3G-手动管理内存。@VictorGubin感谢您的回答。需要明确的是,在我的问题-
ps
中描述的场景中,JVM进程的命令将显示4GB,对吗?没有必要,如果java或OpenCV目前使用的内存小于4GB,则可能小于4G。4GB应该是最大总值。谢谢你的回答,但是下面的文章“other mem”(也是JVM内存的一部分)包含JNI的内存如何?你问了ps
,我回答了ps
。内存确实显示在VSZ
中,但不在RSS
中,并且不受JVM堆大小-Xmx
开关的限制。谢谢!因此,为了查看JVM进程分配的内存(堆大小+JNI),我应该使用类似于ps-opid、rss、VSZ-p
的东西查看VSZ
?是的,这可能会起作用。。。请注意,VSZ的功能远不止这些,但它至少会给您一些可见性。还请注意,在我的循环中,本机内存似乎没有释放自己。最终分配的48TiB更接近前两次分配的总和(16+32 TiB)。此外,我只有16吉布的实际内存和一个500 GB的硬盘驱动器,所以我不知道它在哪里找到48吉布的内存分配!尽管如此。。。这就是你想要的
Native Memory RSS VSZ
1 byte 42.0 MiB 9.6 GiB
2 bytes 45.8 MiB 9.6 GiB
4 bytes 46.0 MiB 9.6 GiB
8 bytes 46.1 MiB 9.6 GiB
16 bytes 46.3 MiB 9.6 GiB
32 bytes 46.5 MiB 9.6 GiB
64 bytes 47.0 MiB 9.6 GiB
128 bytes 47.5 MiB 9.6 GiB
256 bytes 47.6 MiB 9.6 GiB
512 bytes 48.9 MiB 9.6 GiB
1 KiB 49.1 MiB 9.6 GiB
2 KiB 49.2 MiB 9.6 GiB
4 KiB 49.3 MiB 9.6 GiB
8 KiB 49.3 MiB 9.6 GiB
16 KiB 49.8 MiB 9.6 GiB
32 KiB 50.1 MiB 9.6 GiB
64 KiB 50.1 MiB 9.6 GiB
128 KiB 50.6 MiB 9.6 GiB
256 KiB 51.4 MiB 9.6 GiB
512 KiB 51.3 MiB 9.6 GiB
1 MiB 51.4 MiB 9.6 GiB
2 MiB 51.4 MiB 9.6 GiB
4 MiB 51.4 MiB 9.6 GiB
8 MiB 51.4 MiB 9.6 GiB
16 MiB 51.3 MiB 9.7 GiB
32 MiB 51.3 MiB 9.7 GiB
64 MiB 51.7 MiB 9.8 GiB
128 MiB 51.7 MiB 9.9 GiB
256 MiB 51.6 MiB 10.1 GiB
512 MiB 51.6 MiB 10.5 GiB
1 GiB 51.7 MiB 11.3 GiB
2 GiB 51.8 MiB 12.8 GiB
4 GiB 51.9 MiB 15.8 GiB
8 GiB 51.9 MiB 21.8 GiB
16 GiB 52.0 MiB 33.8 GiB
32 GiB 52.0 MiB 57.8 GiB
64 GiB 52.1 MiB 105.8 GiB
128 GiB 52.1 MiB 201.8 GiB
256 GiB 52.5 MiB 393.8 GiB
512 GiB 52.6 MiB 777.8 GiB
1 TiB 52.7 MiB 1.5 TiB
2 TiB 52.7 MiB 3.0 TiB
4 TiB 52.8 MiB 6.0 TiB
8 TiB 52.9 MiB 12.0 TiB
16 TiB 53.1 MiB 24.0 TiB
32 TiB 53.2 MiB 48.0 TiB
Exception in thread "main" java.lang.OutOfMemoryError: Cannot allocate 70368744177664 bytes