javajna包装器与内存消耗

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的一部分(虚拟内存大小—进程可以

我有一个问题,使用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的一部分(虚拟内存大小—进程可以访问的所有内存,包括被调出的内存、已分配但未使用的内存以及来自共享库的内存)

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

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