JVM内存泄漏跟踪

CMS 升级到G1遇到RSS内存泄漏问题 一、背景说明 伴随着JDK版本不断攀升,已逐步将项目中JDK由1.7升级到1.8,偶然发现G1 GC相比CMS加入了一些新特性,像并行独占式运算,指定停顿目标时间,减少空间碎片等。最终决定将项目中使用的CMS升级为G1,在升级过程中遇到RSS内存泄漏问题。 二、问题说明 在将项目的GC升级为G1后,yong GC可正常执行,各项指标正常,但是java进程的RSS随着... 阅读详情

 https://blog.youkuaiyun.com/chenchenQT/article/details/88776208

什么是内存泄漏: 无用的对象持续的占用内存或无用对象的内存得不到释放。(也可以说是: 一个对象已不再被任何程序逻辑所引用、需要, 但是还存在着跟对象GCRoots的引用)

内存泄漏的根本原因: 长生命周期的对象持有短生命周期的对象的引用, 尽管短生命周期的对象已经不在需要了, 但因为长生命周期持有它的引用而导致不可回收。

案例分析:

程序运行越来越慢, 或者出现OOM, 初步怀疑是出现了内存泄漏现象。

 

测试代码:

  1. package test;

  2.  
  3. import java.util.HashMap;

  4. import java.util.Map;

  5.  
  6.  
  7. public class demo {

  8. public static class TestMemory {

  9.  
  10. public byte[] M_64Array =new byte[64*1024];

  11. }

  12.  
  13.  
  14. //声明缓存对象

  15. private static final Map map = new HashMap();

  16. public static void main(String args[]){

  17. try {

  18. Thread.sleep(10000);//给打开visualvm时间

  19. } catch (InterruptedException e) {

  20. e.printStackTrace();

  21. }

  22. System.out.println("开始");

  23. //循环添加对象到缓存

  24. for(int i=0; i<100000;i++){

  25. System.out.println(i);

  26. TestMemory t = new TestMemory();

  27. map.put("key"+i,t);

  28. }

  29. System.out.println("first");

  30. //为dump出堆提供时间

  31. try {

  32. Thread.sleep(10000);

  33. } catch (InterruptedException e) {

  34. e.printStackTrace();

  35. }

  36. for(int i=0; i<100000;i++){

  37. System.out.println(i);

  38. TestMemory t = new TestMemory();

  39. map.put("key"+i,t);

  40. }

  41. System.out.println("second");

  42. try {

  43. Thread.sleep(10000);

  44. } catch (InterruptedException e) {

  45. e.printStackTrace();

  46. }

  47. for(int i=0; i<300000;i++){

  48. System.out.println(i);

  49. TestMemory t = new TestMemory();

  50. map.put("key"+i,t);

  51. }

  52. System.out.println("third");

  53. try {

  54. Thread.sleep(10000);

  55. } catch (InterruptedException e) {

  56. e.printStackTrace();

  57. }

  58. for(int i=0; i<400000;i++){

  59. System.out.println(i);

  60. TestMemory t = new TestMemory();

  61. map.put("key"+i,t);

  62. }

  63. System.out.println("forth");

  64. try {

  65. Thread.sleep(Integer.MAX_VALUE);

  66. } catch (InterruptedException e) {

  67. e.printStackTrace();

  68. }

  69. System.out.println("qqqq");

  70. }

  71. }

1.使用命令行排查

(1)使用jps指令, 查看虚拟机的当前进程

jps -l

得到进程的ID为 12592

 

(2)使用jstat指令查看该进程gc情况

jstat -gcutil 12592 250 7

发生Full GC的次数较多,共4次

 

(3)使用jmap指令, 查看各个类占用内存的状况

jmap -histo:live 12592

可以看出, 某个类占的内存特别大, 这很不正常, 接下来就是找到这个类

 

(4)生成heap dump文件

方法一: jmap -dump:format=b,file=heap.bin 12592 ( b代表文件格式为二进制, file代表文件名)

方法二: 使用JDK /bin目录下的jvisualvm 可视化工具生成

 

(5)使用MAT 对heap dump文件分析

蓝色代表被占用空间, 发现99%的空间被占用了, 继续往下追踪, 看看到底是哪个类

 

 

最后发现是test.demo下的 HashMap中的类发生内存泄漏


 
  1. for(int i=0; i<10000;i++){

  2. System.out.println(i);

  3. TestMemory t = new TestMemory();

  4. map.put("key"+i,t);//此处对象发生内存泄漏

  5. }

 

 

不用命令行也可以用其他工具来判断是否发生内存泄漏, 如JDK /bin目录下的 可视化工具 jconsole和jvisualvm

堆内存使用情况:

 

Old区使用情况:

 

 

通过多次观察发现, 一般来说堆内存图像如上图所示(呈上升趋势折线图), 同时出现GC掉的对象越来越少的情况, 则很有可能发生了内存泄漏

 

 

内存泄漏带来的问题:

1.应用可用的内存减小, 增加了对内存的压力。

2.降低了应用的性能, 比如触发更频繁的GC。

3.严重的时候可能会导致内存溢出错误, 即OOM。

对于程序员来说, GC基本是透明的, 不可见的。 不同的JVM的实现可能使用不同的算法管理GC。通常, GC线程的优先级较低, JVM调用的GC策略也有很多种, 有的是内存使用达一定程度而GC, 也有的是定时执行, 有的是平缓执行, 还有中断式GC。

 

内存泄漏发生的场景:

1.静态集合类引发的内存泄漏


 
  1. static vector c=new vector(10);

  2. for(int i=0;i<100;i++){

  3. Object o=new Object();

  4. v.add(o);

  5. o=null; //即使将对象o置空, 但是对象依然被集合v所引用, 故对象不可回收, 发生内存泄漏

  6. }

解决办法, 将对象从集合v中移除, 或者直接将集合置空 v=null

 

2.当集合里的对象属性被修改(对象的hashcode()发生了改变)后, 在调用remove()方法无效


 
  1. public static void main(String[] args){

  2. Set<Person> set=new HashSet<Person>;

  3. Person p1=new Person("刘昊然",25);

  4. Person p2=new Person("李钟硕",27);

  5. Person p3=new Person("陈秋婷",20);

  6. set.add(p1);

  7. set.add(p2);

  8. System.out.println("共:"+set.size()+" 个元素!"); //结果:2

  9. p3.setAge(24); //修改p3的年龄,此时p3元素对应的hashcode值发生改变

  10.  
  11. set.remove(p3); //此时remove不掉,造成内存泄漏

  12.  
  13. set.add(p3); //重新添加,居然添加成功

  14. System.out.println("共:"+set.size()+" 个元素!"); //结果:4

  15. for (Person person : set)

  16. {

  17. System.out.println(person);

  18. }

  19. }

 

3.监听器, 开了没关闭

 

4.各种连接, 数据库连接, 网络连接等等, 打开了没关闭, 除非显式的调用了close()方法, 否则是不会被GC掉的

 

5. 单例模式

什么是单例模式?  确保一个类只有一个实例, 自行提供这个实例并向整个系统提供这个实例。

特点: (1) 一个类只能有一个实例

         (2) 自己创建这个实例

         (3) 整个系统都使用这个实例

注意: 不正确的使用单例模式是引起内存泄漏的常见问题, 单例对象在初始化后将在JVM的整个生命周期中存在; 比如单例中引用了外部对象;

以上是Java后台的

 

下面这些是安卓的(ps: 没整过安卓, 查资料看到安卓其实有好多种内存泄漏的方式, 但是我能理解并记住的就下面三种(T T))

1. 集合类泄漏

    集合类仅有添加元素, 而无删除元素; 集合类是全局性变量, 无删除机制;

2. 单例(单例的静态特性, 使其生命周期和应用的生命周期一样长)

    单例中调用了其他对象, 则其他对象的生命周期和应用的一样长;

3. 尽量避免使用static 成员变量

    如果成员变量被声明为static , 那我们都知道其生命周期与整个app 进程的生命周期一样; 如果你的app 进程设计上是长驻内 存,   那即使app切到后台, 这部分内存也不会被释放;

PCIe信号眼图总是不开?手把手教你调CTLE和DFE参数(附实测波形对比) 本文详细解析了PCIe信号眼图调试中CTLE和DFE参数的优化方法,帮助硬件工程师解决眼图无法张开的问题。通过实际案例和步骤指导,介绍了如何调整CTLE直流增益和DFE抽头系数,提升接收端均衡器性能,确保信号完整性。 阅读详情

相关推荐

YOLOv8缺陷检测可视化界面实战:PyQt5布局设计与代码实现

本文详细介绍了如何利用PyQt5为YOLOv8缺陷检测模型构建一个专业、易用的可视化界面。通过实战讲解PyQt5的布局管理器设计、信号槽机制与YOLOv8核心的集成,帮助开发者快速将AI模型部署为直观的桌面应用,提升工业质检等场景的落地效率。

redis7keeper的博客 758

【jvm】内存泄漏的8种情况

1.如果一个外部类的实例对象的方法返回了一个内部类的实例对象,这个内部类对象被长期引用了,即使外部类实例对象不再被使用,但由于内部类持有外部类的实例对象,外部类对象也不会被垃圾回收,这也会造成内存泄漏。1.在使用HashSet等基于哈希值的数据结构时,如果对象的哈希值在添加到集合后被改变(例如,修改了对象的某个字段,该字段参与哈希值的计算),那么将导致无法从集合中正确删除该对象,从而造成内存泄漏。2.如果单例对象持有外部对象的引用,那么这个外部对象也不会被回收,从而造成内存泄漏。

王佑辉的博客 1726

C#实战:如何用TSCLIB.dll实现TSC打印机的状态监控与异常处理(附完整代码)

本文详细介绍了如何利用C#和TSCLIB.dll构建企业级TSC打印机状态监控与智能异常处理系统。通过解析十六进制状态码、设计高可靠性的轮询引擎以及实现事件驱动的报警机制,开发者可以打造一个稳定、可观测的打印服务,有效保障物流仓储、生产制造等高频打印场景的业务连续性。

weixin_29227585的博客 64

记一次线上Zip文件操作导致JVM奔溃

又好久没有整理笔记了。这次疫情防控正好周末居家,就想着花点时间整理下自己工作中遇到一些疑难杂症,帮助自己更透彻的理解某些问题! 言归正传,问题的主要经过是这样的:生产上面运营人员导入一批表盘文件,系统直接挂了。运维人员找到我,整理错误日志,部分如下: hs.err.pid1.log文件部分如下 # A fatal error has been detected by the Java Runtime Environment: # # SIGBUS (0x7) at pc=0x00007f..

qq_34680444的博客 3507

优快云积分获取与管理全攻略

技术社区积分系统是知识共享生态的核心激励机制,通过量化用户贡献实现资源交换。其底层逻辑遵循Web2.0时代的UGC经济模型,用户通过内容创作、社区互动等行为积累虚拟资产。在开发者社区场景中,积分体系能有效促进技术文档、工具源码等资源的流通,优快云作为国内头部平台,其积分规则具有典型参考价值。掌握签到策略、内容互动技巧和资源上传规范等实操方法,可系统性提升积分获取效率。2023年新规强化了连续签到奖励和互动质量检测机制,结合GitHub等开源平台资源互补,能构建更高效的技术资源获取路径。

weixin_34233974的博客 218

Yolov5s可视化网络结构图

Yolov5共有四种网络结构,每种网络深度和宽度上都不相同。 (1) Yolov5s可视化网络结构图:点击查看 (2) Yolov5m可视化网络结构图:点击查看 (3) Yolov5l可视化网络结构图:点击查看 (4) Yolov5x可视化网络结构图:点击查看 ...

江南研习社 15万+

运维-JVM监控之内存泄漏

jmap -heap pid查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况 1、为什么会发生内存泄漏? 如果对象一直被应用,jvm无法对其进行回收,创建新的对象时,无法从Heap中获取足够的内存分配给对象,这时候就会导致内存溢出。 出现内存泄露的地方,一般是不断的往容器中存放对象,而容器没有相应的大小限制或清除机制。 2、内存泄漏的现象:程序中抛出OutOfM...

qq_29663071的博客 526

SAP BO系统启用邮件发送功能

目录 背景 维护邮件目标 启用邮件功能 背景 为了将BO报表或BO预警信息发送给特定的收件人,需要启用SAP BO系统的邮件发送功能。 维护邮件目标 1. 登录BO系统的中央管理控制台(CMC): http://<bo server name>:<port>/BOE/CMC 2. 点击“Organize”底下的“Servers”按钮进入BO服务器界面: 3. 点击“Servers List”进入服务器列表界面,右键点击JobServer&lt.

guowenming001的博客 1963

JVM内存泄露讲解

内存泄漏是指应用程序中的某部分内存由于错误的管理而无法被垃圾回收器回收,最终导致可用内存减少,程序性能下降,甚至可能导致应用崩溃。在JVM中,内存泄漏通常是由于程序员未正确释放不再使用的对象引用导致的。

jakelihua 1594

【雷达仿真 | FMCW TDMA-MIMO毫米波雷达信号处理仿真(可修改为DDMA-MIMO)】

1、FMCW叫做调频连续波,调频连续波有步进调频连续波(SFMCW)、线性调频连续波(LFMCW),以及其他非线性调频连续波。LFMCW有锯齿波和三角波等等;锯齿波有恒定调制周期的锯齿波和非恒定周期的锯齿波。Introduction to mmwave sensing:FMCW radars.pdf和The fundamentals of millimeter wave sensors。2、MIMO是多输入多输出(Multiple input Multiple output),也就是多发多收。

【调皮连续波】雷达技术领域知识博主 1万+

STM32 HAL 模拟I2C从机实战:软件实现与多设备通信优化

本文详细介绍了STM32 HAL库下软件模拟I2C从机的实现方法,包括GPIO开漏配置、基础信号实现、数据收发函数编写和多设备通信优化策略。通过灵活的软件模拟方案,解决了硬件I2C接口数量限制和稳定性问题,为多传感器数据采集等应用提供了可靠的通信保障。

motor的博客 924

JVM本地内存的使用监控情况

JVM本地内存的使用监控情况

有问题的请私信或关注v【技术印记】留言 1408

【Q1/论文复现】:利用 CHARLS 数据库考察抗高血压药物依从性和认知衰退

摘要: 北京大学团队基于CHARLS数据(2011-2018)的纵向研究发现,抗高血压药物高依从性能显著延缓中国45岁及以上社区中老年人的认知衰退。研究表明,坚持服药者7年内全局认知衰退速度降低0.014SD/年,记忆功能衰退减缓0.023SD/年,效果接近正常血压人群水平。研究还提示社会经济地位(SES)可能通过影响用药依从性间接调控认知衰老进程。该成果为高血压管理对认知保护提供了人群级证据,发表于《BMC Medicine》(DOI:10.1186/s12916-025-03949-8)。

dingdianbangni的博客 809

【jvm】内存泄漏与内存溢出的区别

2.在程序运行时,无用的对象仍然被保留在内存中,导致内存占用不断增加,最终耗尽可用内存。3.内存泄漏是指程序中存在某些对象无法被垃圾收集器回收,因为这些对象仍然被引用,但实际上这些引用已经不再被使用。这种情况会导致内存持续占用,随着时间的推移逐渐耗尽可用内存。

王佑辉的博客 802

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

JVM内存泄漏检测与处理

JVM内存泄漏检测与处理(JVM Memory Leak detection and handling) JVM垃圾回收机制的原则和方法 JVM垃圾回收中一个基本原则是对象没有被引用或则引用其它对象,换句话说当一个对象在heap 中是隔离(isolation)状态的时候,垃圾回收器就会自动回收分配给这个对象的堆内存空间。区分 活动对象的两个基本方法是引用计数器(...

weixin_34049032的博客 76

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

JVM —— 内存泄漏排查及jps、jstat、jstack、jmap、jprofiler的使用

java内存调优,问题排查,jps、jstat、jstack、jmap、jprofiler

Genius only means hard-working all one's life. 2273

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

消除内存泄漏

http://dev2dev.bea.com.cn/techdoc/05092102.html摘要   虽然Java虚拟机(JVM)及其垃圾收集器(garbage collector,GC)负责管理大多数的内存任务,Java软件程序中还是有可能出现内存泄漏。实际上,这在大型项目中是一个常见的问题。避免内存泄漏的第一步是要弄清楚它是如何发生的。本文介绍了编写Java代码的一些常见的内存泄漏陷阱,以...

weixin_30752699的博客 589

如何有效监控JVM环境,保障应用性能

JVM 监控是对 Java 虚拟机(Java Virtual Machine)的运行状态、资源使用情况和性能指标进行实时监测和分析的过程。通过监控 JVM,可以及时发现和解决应用程序在运行中出现的性能瓶颈、内存泄漏、线程异常等问题,确保 Java 应用的高效、稳定运行。

ITmoster的博客 1332

JVM 问题排查-可视化工具

jconsole jvisualvm arthas MAT heaphero GCViewer gceasy gcplot

杨宇昌的博客 1654

认知jvm的内存泄漏和溢出

1,内存泄漏 public class Test { public static void main(String[] args) { ArrayList list=new ArrayList(); for (int i=0;i<100;i++){ //栈中有一个内存地址,指向Users对象 Users user = new Users(); list.add(user);

chen_ke_java的博客 186

【死磕JVM】用Arthas排查JVM内存 真爽,java程序编译原理

下载地址:https://arthas.gitee.io/download.html 你可以下载zip的包我下载的是arthas-packaging-3.5.0-bin.zip 或者通过命令去下载 wget https://alibaba.github.io/arthas/arthas-boot.jar 使用手册 1. 快速启动 当我们下载好之后,我们直接通过命令启动就可以java -jar arthas-boot.jar,但是在此之前我们需要通过检测的代码来挂靠到Arthas上面 import java

m0_64867293的博客 1035

JVM工具

JDK 自带多种监控工具,主要位于 bin 目录下。常用工具包括: jps:查看 Java 进程状态 jstat:监控 JVM 内存、GC 等运行数据,可检测 OOM 和内存泄漏 jstack:生成线程快照,定位死锁、死循环等问题 jmap/jhat:分析堆内存对象分布 JConsole 和 VisualVM:图形化监控工具 这些工具可帮助开发者诊断内存泄漏、GC 问题、线程阻塞等常见性能问题,是 Java 性能调优的重要辅助工具。

Jonariguez 吾本优秀 678

JVM 性能排查--查看哪个对象占用内存大

JVM 性能排查--查看哪个对象占用内存大 参考:http://blog.youkuaiyun.com/chenleixing/article/details/44227327/     1.  在IE地址栏中输入:http://localhost/test/init1.jsp,执行一次,我们可以在内存视图中看到cn.test.TestBean对象被创建...

6952

WebSphere 诊断工具 使用分析

WebSphere 诊断工具 Verbose Garbage Collection(verboseGC) 日志也许是最常见的 JVM 诊断类型 线程转储也是一种极为常见的 JVM 诊断类型 堆转储是也可由 JVM 生成的另一种形式的转储 Dump Analyzer

1040

JVM内存排查

方法一 jmap -histo:live 18311 | head -20  用jmap查看存活的对象情况 定位到代码 现在已经知道了是HashTable的问题,那么就要定位出什么代码引起的 接下来自然要看看是什么代码往HashTable里疯狂的put数据,于是用神器btrace跟踪Hashtable.put调用的堆栈。 首先写btrace脚本TracingHashTable.java...

yejinfu的专栏 628

自带的jvm监控不准_Java-100天知识进阶-JVM调优工具-JDK自带工具-知识铺(八)

JVM 监控分析工具一、JDK 自带工具1. jconsole JDK/bin 目录下, jconsole.exe 双击打开, 自动搜索本机运行的虚拟机进程。选择其中一个进程即可,开始进行JVM监控1.1 基本介绍 JConsole 基本包括以下基本功能:概述、内存、线程、类、VM概要、MBean。1.2 内存监控1.2.1 内存视图中可选,7中内存类型监控1.2.2 内存视图右下角有实时 堆与非...

weixin_30676505的博客 106
上一篇: Spring中的@Transactional(rollbackFor = Exception.class)属性详解
下一篇: @Transactional(rollbackFor=Exception.class)的使用
It_BeeCoder
博客等级 码龄10年 967粉丝 238原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值