java深度调试【第三章内存分析和堆内存设置】

2025-12-12 0 880

前言

内存泄露分析和堆内存设置

这一章节主要介绍了垃圾回收器的基础知识,然后再举出内存泄漏的案例让我们能够轻松的理解内存泄露的原理。
接着又介绍了内存泄露的症状以及定位和分析的手段,然后就是介绍了内存泄露的方法。

最后也是重点讲解了 java内存和垃圾回收的设置原则和关键参数。

内存泄露

首先肯定要明白的是什么是内存泄露?

在Java中,内存泄露指的是程序在运行过程中,已经不再需要的对象无法被垃圾回收器正常回收,导致这些对象持续占用内存空间的现象。随着时间推移,泄露的内存不断累积,最终可能导致内存耗尽和程序崩溃。

回收机制

Java的垃圾回收(GC)采用可达性分析算法,通过GC Roots对象作为起点,构建引用链。只有与GC Roots存在引用链的对象才会被认为是存活对象,其余对象则被标记为可回收。

GC Roots包括:

  • 虚拟机栈中引用的对象
  • 方法区中静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中JNI引用的对象

重要注意事项:将对象设置为null并不能避免内存泄露
这是一个常见的误解。将引用设置为null只是解除了一个引用关系,如果对象仍然被其他活跃引用持有,它依然无法被GC回收。

public class NullAssignmentMyth {
    private static Map globalCache = new HashMap();
    
    public void commonMistake() {
        Object expensiveObject = new byte[10 * 1024 * 1024]; // 10MB对象
        globalCache.put(\"key\", expensiveObject);
        
        // 错误认知:认为设置为null就能释放内存
        expensiveObject = null;
        
        // 实际上,对象仍然被globalCache引用,无法被GC回收
    }
    
    public void correctApproach() {
        Object expensiveObject = new byte[10 * 1024 * 1024];
        globalCache.put(\"key\", expensiveObject);
        
        // 正确的释放方式
        globalCache.remove(\"key\");  // 先从集合中移除引用
        expensiveObject = null;     // 再设置为null
    }
}

如何定位内存泄露

首先要知道内存泄露的特征有哪些,在发生崩溃之前提前定位原因。

内存泄露的特征

系统越来越慢,并伴随着内存的使用率过高,因为内存不足 GC频率增高(Full GC频率增加,回收前后可能内存五无明显变化),GC操作是CPU密集型操作,所以存在内存泄露的场合最后必然CPU使用率100%。或者出现OutOfMemory了。简单概括就下面几点:

  • Minor GC/Full GC越来越频繁
  • 每次GC后堆内存使用率不下降或持续上升
  • GC暂停时间逐渐变长
  • 老年代使用率持续增长
  • 最后就系统崩溃OOM

定位内存泄漏

通过内存泄漏的特征也可以看到,GC回收的频率和效果 是内存泄漏的重要特征,也是关乎系统性能的重要指标(如果GC频率高,效果差 对系统性能的影响是非常大的,特别是FULL GC)。

不管是定位内存泄漏问题,还是保障系统的稳定运行这两个步都是必不可少的。第一步 GC日志的打印及分析,第二步 导出堆转储文件。

打印GC日志:命令各垃圾回收均有点区别,jdk 17 G1 GC日志打印 -Xlog:gc*,g1*:file=/path/to/gc.log:time,level,tags,输出结果如下:

[2025-10-25T21:35:17.927+0800][info] GC(3838) Pause Young (Normal) (G1 Evacuation Pause) 4043M->4043M(4044M) 0.445ms
//-- FULL GC 回收前4043 回收后 4043 总内存4044M ,回收时间为12.924ms
[2025-10-25T21:35:17.940+0800][info] GC(3839) Pause Full (G1 Compaction Pause) 4043M->4043M(4044M) 12.924ms
[2025-10-25T21:35:17.956+0800][info] GC(3840) Pause Full (G1 Compaction Pause) 4043M->4043M(4044M) 15.300ms
[2025-10-25T21:35:17.957+0800][info] GC(3841) Pause Young (Concurrent Start) (G1 Evacuation Pause) 4043M->4043M(4044M) 0.647ms
[2025-10-25T21:35:17.957+0800][info] GC(3843) Concurrent Mark Cycle
[2025-10-25T21:35:17.974+0800][info] GC(3842) Pause Full (G1 Compaction Pause) 4043M->4043M(4044M) 16.871ms
[2025-10-25T21:35:17.991+0800][info] GC(3844) Pause Full (G1 Compaction Pause) 4043M->4043M(4044M) 17.143ms
[2025-10-25T21:35:17.991+0800][info] GC(3843) Concurrent Mark Cycle 34.722ms

通过上面的GC日志发现,FULL GC 前后的内存空间没有发生变化,因此多半是内存泄露。

导出堆转储文件,用工具打开就行了,下图也是之前解决OOM时候记录JProfiler打开的图片,很清晰的能看到各对象的大小,以及对象的GC ROOT 我们去排查各大对象对应的代码就行了:

image.png

分享一个OOM 和 FULL GC 的案例:

总结

java 深度调试技术 第3章 【内存泄露分析和堆内存设置】讲了还是很多基础的理论,比如GC回收的机制,详细解释了内存泄露的原理,内存和垃圾回收设置等。本篇文章只是把其中最核心的知识提取出来。比如内存泄露的特征,GC日志的打印分析,堆文件的打印分析这些基础掌握之后就在实际开发中解决问题了。但是对于java堆内存模型,垃圾回收算法这些本篇文章就没过多的描述了(推荐深入理解java虚拟机)。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 编程相关 java深度调试【第三章内存分析和堆内存设置】 https://www.zuozi.net/35745.html

常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务