javacv&堆外内存

关于堆外内存的文章JVM——堆外内存详解
关于Java进程内存使用为什么Java进程使用的RAM比Heap Size大

javacv底层是jni,主要使用的是堆外内存。
在这里插入图片描述
javacv默认使用的堆外内存是两倍或者三倍于maxMemory

即便不使用javacv,各个Java进程也会有不等量堆外内存占用,可以使用pmap查看具体使用情况,或者检测使用情况,分析堆外内存是否有溢出风险。

使用javacv可以不限制堆外内存占用,参数可以设置

org.bytedeco.javacpp.noPointerGC=true

或者

-Dorg.bytedeco.javacpp.maxPhysicalBytes=0 
-Dorg.bytedeco.javacpp.maxBytes=0

或者设置为一个适当的数量

-Dorg.bytedeco.javacpp.maxPhysicalBytes=8g 
-Dorg.bytedeco.javacpp.maxBytes=8g

给javacv分配多少堆外内存?可以通过pmap监控进程堆外内存使用情况。

pmap -x 2060331

2060331:   java -XX:+UseG1GC -Xms300m -Xmx300m -XX:+PrintGC -Dorg.bytedeco.javacpp.maxPhysicalBytes=400m -Dorg.bytedeco.javacpp.maxBytes=400m -Dorg.bytedeco.javacpp.noPointerGC=false -Dorg.bytedeco.javacpp.logger.debug=true -Dorg.bytedeco.javacpp.logger=slf4j -jar opencv-release.jar --spring.profiles.active=test
Address           Kbytes     RSS   Dirty Mode  Mapping
0000000000400000       4       0       0 r-x-- java
ffffffffff600000       4       0       0 r-x--   [ anon ]
---------------- ------- ------- ------- 
total kB         2659000  436508  416156

2060331进程日志

java.lang.OutOfMemoryError: Cannot allocate new PointerPointer(8): totalBytes = 40, physicalBytes = 416M] with root cause

java.lang.OutOfMemoryError: Physical memory usage is too high: physicalBytes (416M) > maxPhysicalBytes (400M)

可以看出设置与实际使用是一致的。

通过org.bytedeco.javacpp.noPointerGC=true-Dorg.bytedeco.javacpp.maxPhysicalBytes=800m -Dorg.bytedeco.javacpp.maxBytes=800m参数启动不同进程对比运行情况,长时间服务运行,分析出这个进程使用堆外内存稳定在600MB的水平。

云服务器上的进程情况

20171:   java -XX:+UseG1GC -Xms512m -Xmx512m  -jar socket-1.0.41-eureka.jar --spring.profiles.active=develop
Address           Kbytes     RSS   Dirty Mode  Mapping
---------------- ------- ------- ------- 
total kB         4488964  995640  981756

这个服务堆外内存使用也是接近临近值呀,一不留神就会FullGC,甚至oom-killer

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值