JVM实战(23)——内存碎片优化

这篇具有很好参考价值的文章主要介绍了JVM实战(23)——内存碎片优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

学习必须往深处挖,挖的越深,基础越扎实!

阶段1、深入多线程

阶段2、深入多线程设计模式

阶段3、深入juc源码解析

阶段4、深入jdk其余源码解析

阶段5、深入jvm源码解析

一、案例背景

本案例的背景是一个高峰期每秒十万QPS的社交APP,这类APP流量最大的模块就是个人主页模块,会有大量的用户在一个集中的时间段内(比如晚上)频繁访问各种个人主页数据,而且个人主页的数据量通常比较大,在几MB左右:

JVM实战(23)——内存碎片优化,jvm专题,jvm

1.1 存在问题

上述案例,由于高峰期的每秒并发量太高,所以新生代的Eden区会被迅速占满,频发触发Young GC。而在Young GC的时候,下一秒的请求又来了,导致很多请求是还没来得及处理完的,导致每次Young GC的时候很多对象需要存活下来,因此在高峰期经常会出现存活对象太多,导致Survivor区放不下的问题:

JVM实战(23)——内存碎片优化,jvm专题,jvm

所以,此时就会有大量对象频繁进入老年代,从而频繁触发老年代的GC:

JVM实战(23)——内存碎片优化,jvm专题,jvm

二、内存碎片

2.1 优化前

我们先来看下系统优化前的一些关键JVM参数:
-XX:UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=5

上述采用CMS对老年代进行垃圾回收,默认为标记-清除算法,所以每次GC后都会出现许多内存碎片。
我们来看下整个流程,首先老年代中有许多垃圾对象:

JVM实战(23)——内存碎片优化,jvm专题,jvm

CMS回收掉一些垃圾对象后,就会出现内存碎片,由于-XX:CMSFullGCsBeforeCompaction=5,所以5次Full GC之后才会进行内存碎片整理:

JVM实战(23)——内存碎片优化,jvm专题,jvm

但是,大家考虑一个场景,一次Full GC之后,老年代中有一部分内存里都是大量的内存碎片,只有部分可用的连续空间。这时候,随着大量对象进入老年代,一旦连续可用空间不足以容纳这些对象,就会导致立马触发下一次Full GC。

这样,随着一次次Full GC,导致老年代产生更多的内存碎片,触发下一次Full GC的速度也会越来越快,直到5次Full GC之后才会去整理内存碎片。

2.2 优化后

这个案例的优化,其实非常简单。首先,可以用jstat分析下JVM的运行情况,判断出每次Young GC后存活对象的大小,然后增加Survivor区的大小,避免存活对象频繁进入老年代。

另外,优化后部分对象还是慢慢会进入老年代,毕竟系统的负载很高,所以调优后每小时还是会有一次Full GC。

所以,第二个优化点就是 针对CMS内存碎片问题进行优化 。在降低了Full GC的频率后,务必设置以下参数,使得每次Full GC后都进行内存碎片整理:
-XX:UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0

这样虽然每次Full GC的内存碎片整理需要消耗更多的时间,但是跟频繁Full GC的时间消耗相比,效率会提升很多。

三、总结

本章,我们通过示例分析了频繁Full GC导致的内存碎片问题,通过参数-XX:CMSFullGCsBeforeCompaction可以配置内存碎片整理的次数,从而提升系统的运行效率。文章来源地址https://www.toymoban.com/news/detail-801278.html

到了这里,关于JVM实战(23)——内存碎片优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JVM实战(30)——模拟堆内存溢出

    作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 学习必须往深处挖,挖的越深,基础越扎实! 阶段1、深入多线程 阶段2、深入多线程设计模式 阶段3、深入juc源码解析

    2024年01月25日
    浏览(51)
  • JVM实战(31)——内存溢出之请求超时

    本章,我们将通过实际案例讲解一个Web应用的内存溢出问题,该内存溢出问题的排查涉及Tomcat的一些底层原理,最终排查发现是由于请求超时问题导致,我们先来看下系统的背景。 1.1 系统背景 生产环境的一个系统发生告警,拿到生产日志后出现如下字样: Exception in thread

    2024年01月25日
    浏览(38)
  • JVM实战(28)——模拟Metaspace内存溢出

    作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 学习必须往深处挖,挖的越深,基础越扎实! 阶段1、深入多线程 阶段2、深入多线程设计模式 阶段3、深入juc源码解析

    2024年01月18日
    浏览(40)
  • JVM工作原理与实战(二十一):内存管理

    JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、不同语言的内存管理 1.C/C++的内存管理 2.Java的内存管理 二、垃圾回收的对比 1.自动垃圾回收与手动垃圾回收的对比 2.优点与缺点 总结 JVM作为Java程序的运行环境,其负责解释和执行字节码,管理

    2024年01月21日
    浏览(45)
  • JVM实战(24)——大对象优化

    作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 学习必须往深处挖,挖的越深,基础越扎实! 阶段1、深入多线程 阶段2、深入多线程设计模式 阶段3、深入juc源码解析

    2024年01月17日
    浏览(38)
  • JVM逃逸分析原理解析:优化Java程序性能和内存利用效率

    在Java开发中,性能和内存利用效率一直是开发者关注的焦点。为了提高Java程序的执行效率,JVM引入了逃逸分析技术。本文将详细解析JVM逃逸分析的原理,帮助读者深入理解其工作机制。 逃逸分析是一种用于确定对象在方法的生命周期内是否逃逸出方法外部范围的技术。在

    2024年01月20日
    浏览(62)
  • JVM实战(25)——元数据区优化

    作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 学习必须往深处挖,挖的越深,基础越扎实! 阶段1、深入多线程 阶段2、深入多线程设计模式 阶段3、深入juc源码解析

    2024年01月22日
    浏览(34)
  • JVM零基础到高级实战之Java内存区域本地方法栈

    JVM零基础到高级实战之Java内存区域本地方法栈 JVM零基础到高级实战之Java内存区域本地方法栈 本地方法栈是什么? 用于作用域本地方法执行的一块Java内存区域 为什么要有本地方法栈? 与Java虚拟机栈相同,每个方法在执行的同时都会创建一个栈帧(Stack Framel)用于存储局部

    2024年02月09日
    浏览(41)
  • 深度剖析JVM调优法则,神器Arthas从CPU/内存出发轻松掌握调优实战技巧

    场景一、CPU过高 CPU占用过高排查思路: step1:进行arthas step2:输入deashboard 如何不记得命令可以在控制台输入help step3:查看线程栈信息 从线程栈信息中定位到具体的java代码。 场景二、内存占用过高 内存占用过高排查思路: step1:进行arthas step2:输入deashboard 在dashboard页面中

    2024年02月06日
    浏览(46)
  • 【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍

    本文主要针对于综合层面上进行分析JVM优化方案总结和列举调优参数计划。主要包含: 调优之逃逸分析(栈上分配) 调优之线程局部缓存(TLAB) 调优之G1回收器 -XX:+DoEscapeAnalysis 逃逸分析(Escape Analysis) 逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法中被定

    2024年01月25日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包