JNI代码内存统计与JVM内存限制相关技术咨询
问题解答
1. Runtime内存计算是否包含JNI分配的内存?
Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory() 的结果仅统计Java堆中已使用的内存,也就是Java对象占用的内存,完全不包含JNI代码通过malloc、new等方式分配的本地(Native)内存。
原因如下:
totalMemory()返回的是JVM当前从操作系统申请的Java堆内存总量freeMemory()返回的是Java堆中尚未被使用的内存部分
两者的差值自然只反映堆内已被Java对象占用的空间,和JNI分配的本地内存没有关系。JNI分配的内存属于进程的本地内存区域,不在JVM堆的管辖范围内。
2. C++代码是否需要适配JVM的内存空间?
通过JNI调用的C++代码,其分配的内存是独立于JVM堆内存空间的,不需要适配JVM的内存分配规则。
C++代码使用的是进程的本地内存区域,由操作系统直接管理,和JVM堆是两个完全分离的内存空间。不过需要注意两点:
- JVM本身运行在同一个进程里,整个进程的总内存受操作系统限制,若C++代码占用过多本地内存,可能导致进程内存耗尽,间接引发JVM的OOM错误
- C++代码分配的内存需要自行负责释放,JVM不会自动回收这部分内存,内存泄漏会直接影响进程稳定性
内容的提问来源于stack exchange,提问作者Green 绿色
相关产品推荐
相关产品推荐

