使用JNI时,JNI二进制文件是使用自己的内存还是使用JVM分配的内存的一部分?
细节
当您将-Xmx1024m
作为JVM选项指定时,JVM是否会将所有1024 MB的内存分配给Java对象?
它是否将其中一部分用于Java对象,另一部分用于JNI二进制文件,或者JNI二进制文件必须使用额外的内存?JVM如何在这种情况下分配/划分/管理内存的使用?
当您将-Xmx1024m
作为JVM选项指定时,JVM是否会将所有1024 MB的内存分配给Java对象?
它是否将其中一部分用于Java对象,另一部分用于JNI二进制文件,或者JNI二进制文件必须使用额外的内存?JVM如何在这种情况下分配/划分/管理内存的使用?
当我们在某些JNI代码中遇到内存泄漏时,我第一时间发现JNI二进制在JVM进程中使用自己的内存而不是任何JVM堆空间。我们看到Linux实际上杀死了JVM,因为整个JVM超过了3GB的虚拟内存限制。但我们使用了-Xmx384m
参数,而且只使用了大约40MB在Java对象方面的空间,这基本上证明JNI使用了JVM堆空间之外的内存。