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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: JavaCVJava平台的计算机视觉库,提供了一系列用于图像和视频处理的Java接口和类。JavaCV基于另外两个开源计算机视觉库OpenCV和FFmpeg。 与其他Java CV平台相比,JavaCV具有以下区别: 1. JavaCV是基于OpenCV和FFmpeg的开源计算机视觉库,而其他Java CV平台有些是基于自己研发的计算机视觉算法。 2. JavaCV提供了丰富的接口和类,可以用于在Java平台上进行图像和视频处理,相对来说较为全面。其他Java CV平台也提供了类似的功能,但是可能不如JavaCV所提供的全面。 3. JavaCV支持Java和Android平台,与其他Java CV平台相比,JavaCV的应用范围更加广泛。 4. JavaCV能够在OpenCV和FFmpeg的基础上提供更高的性能和更好的效率。 总的来说,JavaCV是一个全面的Java计算机视觉库,与其他Java CV平台相比拥有更多的优势。 ### 回答2: Java CV(Java Computer Vision Library)是一个基于Java编写的计算机视觉库,它可以用于数字图像和视频处理、目标检测和跟踪等任务。Java CV使用OpenCV库作为它底层的计算机视觉算法实现,然而,除了Java CV还有其他的java cv平台,下面就来探讨一下Java CV和其他Java CV平台之间的区别。 1. OpenCV for Java OpenCV for Java是基于Java的OpenCV接口,提供了与OpenCV相同的功能,并且也使用了OpenCV库作为计算机视觉算法底层实现。与Java CV不同的是,OpenCV for Java使用C++和Java的混合编程方式,因此有更高的性能和更丰富的功能。 2. BoofCV BoofCV是一款专门为计算机视觉和机器人开发的Java库,它提供了很多用于处理传感器数据的算法。与Java CV相比,BoofCV的算法库更加专注于视觉几何和机器人视觉问题,同时它还支持运动估计、SLAM(Simultaneous Localization and Mapping)、图像处理和机器学习等方面的应用。 3. ImageJ ImageJ是一种Java编写的图片处理软件,它提供了非常丰富的图形和图像处理插件。Java CV和ImageJ都提供了图像处理、数字图像分析、图像处理等功能,但ImageJ更适合于图形图像处理方面的应用。 4. JavaFX JavaFX是一个用于创建富客户端应用程序的Java平台,它提供了很多用于图形渲染和交互式用户界面的库。与Java CV相比,JavaFX更加注重UI和交互,而Java CV更加侧重于计算机视觉应用,在功能上有很大的不同。 总之,Java CV是一款比较全面的计算机视觉库,主要用于数字图像和视频处理、目标检测和跟踪等任务。虽然其他Java CV平台也提供了一些图像处理和计算机视觉相关的功能,但在很多方面和Java CV相比还有很大的差距,用户需要根据自己的需求来选择最适合自己的平台。 ### 回答3: JavaCV 是一个基于 Java 语言的计算机视觉库,它允许开发人员在 Java 平台上使用各种计算机视觉库。JavaCV 库提供了一个全部用 Java 编写的接口,以便开发人员能够使用各种计算机视觉库,比如 OpenCV、FFmpeg 等。JavaCV 是一个免费、开源的计算机视觉库,是一个特别强大的工具。 JavaCV 相比其他 JavaCV 平台,有以下几个不同点: 1. 功能强大:JavaCV 可以访问多种计算机视觉库,包括 OpenCV、FFmpeg 等,这使得开发人员可以使用他们最擅长和最熟悉的工具。 2. 免费、开源:JavaCV 是一款免费、开源的计算机视觉库,不需要任何费用。这个特点使得它成为许多开发人员的首选,并且拥有庞大的开发者社区。 3. 跨平台:JavaCV 支持跨平台开发。 因为 JavaCV 是用 Java 语言编写的,所以它可以在不同的操作系统上运行,包括 Windows、Linux、Mac OS X 等。 4. 良好的支持:JavaCV 拥有一个庞大的开发者社区,这使得开发人员可以在开发过程中得到良好的支持。同时,JavaCV 官方也提供了详细的文档和示例来帮助开发者使用 JavaCV
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值