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

针对 Javacv 启动使用时报错的问题,以下是一些常见的解决办法: ### 依赖包过大及启动报错问题(如引用中提到的 800M 以上) - **按需引入依赖**:`javacv-platform` 是一个全平台的综合依赖包,包含了大量不同平台的库文件,导致打包后的 jar 包过大。可以根据实际使用的平台和功能,只引入特定平台和必要的依赖。例如,如果只在 Linux 平台使用,可引入以下依赖: ```xml <dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv&lt;/artifactId> <version>${javacv-version}</version> </dependency> <dependency> <groupId>org.bytedeco</groupId> <artifactId>opencv-platform-linux-x86_64</artifactId> <version>${opencv-version}</version> </dependency> ``` ### 缺少本地库文件 - **检查本地库路径**:Javacv 依赖于一些本地库文件(如 OpenCV、FFmpeg 等),确保这些本地库文件的路径正确配置。可以通过设置系统属性 `java.library.path` 来指定本地库的位置。示例代码如下: ```java System.setProperty("java.library.path", "/path/to/native/libs"); ``` ### 版本不兼容问题 - **检查版本兼容性**:确保 Javacv 及其相关依赖的版本相互兼容。不同版本的 Javacv 可能对底层库(如 OpenCV、FFmpeg)有不同的要求,建议查阅官方文档来选择合适的版本。 ### 权限问题 - **检查文件权限**:如果使用的本地库文件或相关资源文件没有足够的权限,可能会导致启动报错。确保这些文件具有正确的读写权限。 ### 内存不足问题 - **增加 JVM 内存**:如果启动时出现内存不足的错误,可以尝试增加 JVM 的堆内存大小。可以通过在启动命令中添加 `-Xmx` 和 `-Xms` 参数来调整堆内存的最大值和初始值。例如: ```sh java -Xmx2048m -Xms1024m -jar your-app.jar ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值