黑马JVM总结(二十)

文章探讨了GC调优中的CMS垃圾回收器问题,重点关注了如何通过调整新生代内存、避免浮动垃圾和优化CMS参数来减少FullGC。案例分析了内存紧张导致的GC频繁问题,以及如何通过调整元空间和新生代大小来优化老年代和减少重新标记时间。

(1)GC_调优老年代

CMS是低响应时间的,并发的一个垃圾回收器 ,有这样一个缺点,因为在垃圾回收的同时,其他的用户线程也在运行,就会产生新的垃圾这个新的垃圾称为浮动垃圾,如果浮动垃圾产生了又导致内存不足问题就大了就会造成CMSD并发失败,CMS的垃圾回收器就不能正常工作了,就会退化为串行SerialOld的老年代垃圾回收器,效率就低了

先不要尝试老年代调优,可能没有发生Full GC,即使发生了Full GC也要尝试先调试新生代大小,幸存区大小啊,幸存区的晋升阈值啊,容量等等等这些手段用了,还是经常发生Full GC再来看看老年代的调优

当老年代发生Full GC时我们观察老年代是由于多大的内存导致了Full GC的发生,可以在原有Full GC时内存的基础上调大四分之一到三分之一

下面的那个参数:控制老年代内存达到总内存多少的时候触发CMS垃圾回收,值越低触发垃圾回收的时机越早,一般设置为75-80%之间

(2)GC调优_案例1

案例1程序运行期间GC非常的频繁尤其是Minar GC gc特别频繁,说明控件紧张,如果是新生代空间紧张当业务的高峰期来了,大量的对象被创建,很快 新生代内存很快被占满了,造成幸存空间紧张了导致晋升阈值降低,生命周期很短的对象也会晋升到老年代去,这样情况进一步导致老年代存放很多大量生命周期很短的对象,容易触发老年代的Full GC

如果是新生代的内存设置小了,  内存优化从新生代开始,增大新生代的内存,增大了幸存区的空间以及晋升阈值这样尽可能把生命周期很短的对象留在新生代,不要晋升到老年代,就解决老年代的Full 的发生

(3)GC调优_案例2

第二个案例是采用的是CMS但是当发生了Full GC 暂停时间特别长,我们可以去查看GC日志,查看那个阶段耗费的时间较长,通过查看GC日志呢可以把每一阶段的耗费时间在GC日志了里找到,

可以看待重新标记阶段占用大量的时间

我们知道CMS的初始标记跟并发标记时间还是很快的,比较慢的是重新标记那一块,重新标记的时候需要扫描整个堆内存,不仅扫描老年代也要扫描新生代,如果高峰期的时候,新生代的对象比较多,那么扫描时间就会变得非常的多 ,那么在重新标记之前,把新生的对象先做一次垃圾回收,减少新生代对象的数量这样就可以减少重新标记的时间啊

需要设置下面的这个参数在重新标记之前对新生代做一次垃圾的清理,减少重新标记的时间

(4)GC调优_案例3

案例三也是采用CMS,但是它是在老年代相当充裕的情况下发生了Full GC ,CMS呢可能是由于空间不足导致并发失败或者空间碎片比较多都会产生Full GC,但是通过日志并没有发现并发失败或者碎片过多导致的错误提示说明了老年代的空间是充裕的,不是由于老年代的空间不足导致的Full 

GC,发现jdk是1.7,1.7的采用的是永久代作为方法区的实现,永久代的空间不足也会导致Full GC

1.8采用元空间,元空间就不是由java这边来控制了元空间采用操作系统的元空间,空间的容量是比较充裕的不会发生元空间的空间不足问题 

1.7呢如果元空间设置小了,就会触发整个堆的一次Full GC,这样就定位了是由于元空间的不足导致的Full GC,所以就可以增大元空间的初始值和最大值,保证Full GC的发生

 

 

### JVM学习笔记与资料整理 JVM(Java Virtual Machine)作为Java程序运行的核心组件,其学习对于中高级Java开发人员尤为重要[^2]。以下内容基于相关引用,总结了黑马程序员JVM学习笔记及相关资料的关键点。 #### 1. JVM基础知识 JVM是Java程序与底层操作系统之间的桥梁,它由三大部分组成:类加载器(ClassLoader)、运行时数据区和执行引擎[^3]。 - **类加载器(ClassLoader)**:负责将`.class`字节码文件加载到内存中,并验证其格式是否正确。 - **运行时数据区**:管理JVM的内存分配,包括方法区、堆、栈、本地方法栈和程序计数器等区域。 - **执行引擎**:将字节码解释为机器码并执行,同时通过即时编译器(JIT)优化性能。 #### 2. 黑马程序员JVM教程特点 黑马程序员的JVM教程被评价为理论与实战结合的良好入门课程[^1]。以下是该课程的主要特色: - 短时间内覆盖JVM的核心知识点。 - 提供实际案例帮助理解JVM的工作机制。 - 配套练习项目巩固所学内容。 #### 3. 进阶学习建议 在完成黑马程序员的JVM课程后,可以参考以下书籍进一步深入学习: - 《深入理解Java虚拟机(第二版)》:详细讲解了JVM的内部机制及优化技巧。 - 《实战Java虚拟机》:通过实际案例分析JVM调优及故障排查。 - 《深入Java虚拟机第二版》:涵盖JVM的最新特性和技术发展。 #### 4. JVM的应用场景 JVM不仅用于运行Java程序,还支持其他基于JVM的语言(如Kotlin、Scala等)。此外,字节码文件的应用场景广泛,例如: - 动态代理生成。 - 字节码增强技术(如AspectJ、ByteBuddy)。 - Java应用性能监控与调优工具开发。 #### 5. 示例代码 以下是一个简单的Java程序示例,展示JVM如何加载并运行代码: ```java public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } } ``` 编译与运行过程如下: ```bash D:\Java\mycode>javac HelloWorld.java D:\Java\mycode>java HelloWorld Hello World ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵俺第一专栏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值