记一次内存泄漏排查问题

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

原文链接: 链接

背景

     在使用JavaCV做图像处理时,发现程序运行起来之后,处理了百来次的时候,就报了outofmemory的错误。因为javacv底层就是调用opencv的native方法,判断是出现了内存泄漏问题,可能是调用了哪个方法之后没有正确释放资源。

1.用jconsole观察

     首先是需要在测试机器上修改启动命令,使得能够支持jconsole远程连接。

-Dcom.sun.management.jmxremote.port=8999 \  
-Dcom.sun.management.jmxremote.authenticate=false \  
-Dcom.sun.management.jmxremote.ssl=false  

     这样,启动本地java安装目录bin下的jconsole.exe启动界面,输入远程主机的IP和8999端口,就可以连接上了。

     这个图是正常的垃圾回收。当时的图是只有上升,没有下降的一个过程,然后到顶点就产生了outofmemory错误。

2.排查

     网上查询了一下内存泄漏的分析工具,给eclipse安装了MAT插件用于分析文件。为了生成hprof文件,在测试机器上多次调用方法,直到根据jconsole发现快到顶点了,运行以下命令:

jmap -dump:format=b,file=a.hprof  24957
//后面的24957是进程ID可用下面命令get
ps -ef|grep java
然后找到项目名对应的pid即可

     生成的文件直接用装了MAT插件的eclipse打开即可:

     可以看到图中很明显的第三方库的类名,就可以判断可能是在用该类的地方的资源没释放,然后对应地查找。当然MAT和jconsole还有更强大的功能等着大家去使用
     Objects : 类的对象的数量,这个对象被创建了多少个
     shallowHeap是指一个对象内存的消耗大小,不包含对其他对象的引用。
     Retained Heap :是shallow Heap的总和,也就是该对象被GC之后所能回收到内存的总和。
     该篇博客中具体介绍了shallowheap和retainedHeap:
http://bjyzxxds.iteye.com/blog/1532937
     这里说一句题外话,在使用这几个类的地方,发现用完之后已经调用了释放方法,很是奇怪,也没头绪。后面想到跟javacv给的sample code对比一下,发现网上流传的释放方法和样例中的并不一致,也可能是因为使用的版本不同导致的。改成样例中的方法之后,解决了该问题。得到的教训是如果第三方库有示例代码,还是得多参考示例代码。
     最终再用jconsole连接机器,观察内存回收,就得到了上面那个图。还有下面这个图:

     这里看到使用的回收算法是新生代是parNew,老年代是CMS。老年代算法中,CMS算是用的较多的算法,而新生代算法中,除了serial收集器,只有parNew能与CMS配合使用。parNew与serial相比,只是多线程,没有其他创新之处。顺势复习了一波垃圾回收算法,做了下面这样一个几种收集算法对比:
     链接:https://www.processon.com/view/587a409de4b098bf4ca43bf7

一次TheadLocal使用方式不正确导致内存泄漏问题排查和修复过程 ThreadLocal使用方式不对引起内存溢出的问题排查、分析和解决过程。 阅读详情

相关推荐

Java 分析并解决内存泄漏的实例

主要介绍了Java 分析并解决内存泄漏的实例,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下

javacv物理内存溢出

java.lang.OutOfMemoryError: Physical memory usage is too high: physicalBytes (602M) > maxPhysicalBytes (600M) at org.bytedeco.javacpp.Pointer.deallocator(Pointer.java:588) at org.bytedeco.javacpp.Pointer.init(Pointer.java:124) at org.bytedeco.javacpp

积累与备忘 3989

javacv&堆外内存

关于堆外内存的文章JVM——堆外内存详解 关于Java进程内存使用为什么Java进程使用的RAM比Heap Size大 javacv底层是jni,主要使用的是堆外内存。 javacv默认使用的堆外内存是两倍或者三倍于maxMemory。 即便不使用javacv,各个Java进程也会有不等量堆外内存占用,可以使用pmap查看具体使用情况,或者检测使用情况,分析堆外内存是否有溢出风险。 使用javacv可以不限制堆外内存占用,参数可以设置 org.bytedeco.javacpp.noPointerGC=tr

积累与备忘 2625

Deeplearning4j 实战(3):简介Nd4j中JavaCPP技术的应用

Eclipse Deeplearning4j GiChat课程:https://gitbook.cn/gitchat/column/5bfb6741ae0e5f436e35cd9fEclipse Deeplearning4j 系列博客:https://blog.csdn.net/wangongxiEclipse Deeplearning4j Github:https://github.com/ec...

万宫玺的专栏 6774

Java学习笔(三十):javacv关于内存泄漏问题

问题描述:最近用到了javacv处理图像,同事写的程序,我单独放在本地,通过run java application来跑是没问题的。 然后在本地部署到tomcat,通过接口访问,发现每访问一次,内存就蹭蹭的往上涨,任务管理器中java VM 内存一直在增加; 部署到linux远程服务器,运行几次,直接系统崩溃,tomcat关闭原因分析:因为涉及到多张图片的处理,而且处理完后没有进行释放,导致内存

汤圆学Java 4335

[Android进阶]Java、Android 内存泄漏总结

Java、Android 内存泄漏总结内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏问题内存泄漏大家都不陌生了,简单粗俗的讲,就是该被释放的对象没有释放,一直被某个或某些实例所持有却不再被使用导致 GC 不能回收。最近自己阅读了大量相关的文档资料,打算做个 总结 沉淀下来跟大家一起分享和学习,也给自己一个警示,以后 coding 时怎么避免这些情况,提高应用的体验和质量。我

陶程的博客 5300

一次Golang中一次内存泄漏问题排查

Golang的内存泄漏问题,我排查了两周的时间!

qq_42362240的博客 2738

一次内存泄漏问题排查经历

源宝导读:随着系统越来越庞大,越来越复杂,疑难杂症问题也越来越多。本文将介绍明源研发协同平台团队针对一次内存泄露问题排查过程和技术探索。 一、背景 内存泄漏,一个说大不大说下不小的瑕疵。作为开发者,我们都很清楚内存泄漏是我们代码问题导致的。但是话说回来,泄漏后果会很严重嘛?这不好说,如果对服务器内存的影响只有几个百分点,又或者对应用没有什么致命影响,那么修补内存泄漏就像鸡肋一样,...

勇往直前的专栏 1020

一次内存泄漏问题排查

内存泄漏排查

weixin_45614626的博客 1247

一次线上内存泄漏问题排查过程

近期需要对公司的接口做线上的巡查监控,需要写一个脚本放到服务器上,定时运行脚本监测线上接口是否正常。 测试的接口不是HTTP协议,而是公司基于TCP协议开发的私有协议,因此不能直接用现成的一些接口测试工具,需要自己写代码来调用接口。 由于是私有协议,为了方便各业务项目进行通信,开发部门统一提供了一个TClient的jar包,底层使用了netty框架进行通信。调用方只需要按照协议的格式组装二进制的包...

Testfan_zhou的博客 927

一次linux排查jvm内存泄漏问题

jvm outofMemory问题初步定位

A1163511759的博客 1011

一次内存泄漏问题排查

现象:容器运行1-2小时后,内存逐渐上升到100%,主进程被os kill, 随后容器被重新拉起, 内存再次上升... 配置信息, 容器设置的最大内存8G 分析过程: 1. jinfo pid打印出进程的配置信息, 进程堆内存设置为4G 2. jmap -heap pid 打印出堆内内存情况 jmap -histo:live pid > tmp.txt打印每个class的实例数目,内存占用,类全名信息.VM的内部类名字开头会加上前缀”*”.如果live子参数加上后,只统计活的...

atarik@163.com 529

一次JVM内存泄漏问题排查、分析过程

背景 项目使用框架为springboot + akka(想要了解akka框架的同学可自行查看),JDK版本1.8 使用的垃圾回收器为1.8默认的UseParallelGC 工具说明 压测工具使用的是jmeter脚本 性能监测工具使用的是jdk自带工具,jconsole、jvisualvm,一般第一个基本可以满足监测需求 分析工具使用的是IBM的工具,ha450.jar(分析dump文件)、jca450.jar(分析线程信息) 分析dump文件也可以使用 JProfile和mat(两个都为可视化分析工具)

li_csdn_的博客 1147

一次线上排查内存泄漏问题

事件描述:系统task任务隔断时间经常无缘无故停止执行。 事件分析:1.单线程task由于线程阻塞,导致无法执行下一个task调度任务。每次都是通过重启应用进行解决。 但是阻塞的话有一个特店,一般情况下只会导致某个任务停止,不可能所有的task都会不执行,因此此点排除。 2.那会是什么原因?还会有什么情况会导致这个问题?因此想起了还有一种情况会导致这样的问题发生。那就是java虚拟机在执行f...

zhaoquanwei2018的博客 661

一次线上内存泄漏问题排查

一 故障描述 管理后台发现部分接口长时间无响应,此问题出现多次,每次都需重启项目就可以解决。查看日志发现多次出现java.lang.OutOfMemoryError: GC overhead limit exceeded,目前项目堆大小为固定2G,后台为内部人员使用,量不大。 二 处理过程 1 经过日志分析是GC问题,根据查资料确切的说于JVM花费太长时间执行GC且只能回收很少的堆内存时抛出的。根据Oracle官方文档,默认情况下,如果Java进程花费98%以上的时间执行GC,并且每次只有不到2%的堆被恢复

qq_39644692的博客 656

一次现网内存泄漏问题排查和分析

但是为什么会内存溢出呢?按说访问量也不是很高,于是进行了下面的排查和分析。

mf97532的博客 575

gtk 控件内存回收_一次线上内存泄漏问题排查过程

近期需要对公司的接口做线上的巡查监控,需要写一个脚本放到服务器上,定时运行脚本监测线上接口是否正常。测试的接口不是HTTP协议,而是公司基于TCP协议开发的私有协议,因此不能直接用现成的一些接口测试工具,需要自己写代码来调用接口。由于是私有协议,为了方便各业务项目进行通信,开发部门统一提供了一个TClient的jar包,底层使用了netty框架进行通信。调用方只需要按照协议的格式组装二进制的包,然...

weixin_39772652的博客 299

linux 一个jar包正常多少内存_一次线上内存泄漏问题排查过程

近期需要对公司的接口做线上的巡查监控,需要写一个脚本放到服务器上,定时运行脚本监测线上接口是否正常。测试的接口不是HTTP协议,而是公司基于TCP协议开发的私有协议,因此不能直接用现成的一些接口测试工具,需要自己写代码来调用接口。由于是私有协议,为了方便各业务项目进行通信,开发部门统一提供了一个TClient的jar包,底层使用了netty框架进行通信。调用方只需要按照协议的格式组装二进制的包,然...

weixin_42203796的博客 995
上一篇: 使用Apache commons-net包的ftp时中文文件名乱码的问题
下一篇: redis实现分布式锁
foolishAndStupid
博客等级 码龄11年 53粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值