GC
使用jvisualvm工具,并在该工具中安装visualgc插件。运行idea中的java工程,即能模拟以下gc情况,如图。


上述设计不合理,会有碎片问题。

怎么知道对象的年龄呢? 对象头中会有记录的(见前文的图片)
young存满了,又会young gc,又有碎片问题。




young会gc,没有eden或S0 S1 gc的概念。

一旦 OLD区都没有空间了,就会OOM。


算法:

【标记-清除】 会扫描整个堆,比较耗时。会产生大量不连续的空间。

【标记-整理】:比较耗时

【标记-复制】像s0,s1那样,分出一半空间,将活的复制到另外一半。



上边的英文告诉了怎么选择GC种类。内存比较少<100M或单核就用serial。CMS和G1停顿时间最少。
适用于young和old的收集器的可以的选择如下图:



CMS和G1很重要,理解下
CMS适用于老年代。G1适用于新生和老年。
serial收集示例,要暂停其他线程。stop the world 即STW。垃圾回收线程暂停课用户线程。

serial算法是对【标记-复制】算法的落地。



cms:

【初始标记】为什么要stw呢?因为要确定根节点,所以暂停业务代码。单线程即可,非常快的过程。
【并发标记】只是增量标记。
【重新标记】又会stw。为什么多线程呢?因为前一步多线程的线程池已经开了,开销已经在了。
G1:现在主流在用。能设置停顿时间。G1是jdk7引入的。
解决CMS不能解决的。


G1的区域是逻辑划分的。old去可能变eden,eden也可能变eden。并发标记。
【并发标记算法】:三色指针。 标记垃圾,解决错标、漏标问题。 CMS采用的就是这个。


G1是加入了写屏障。
另外:jdk11中新增了 ZGC回收器。
缺点:java任何GC都会stop the world即停顿。

【生产环境如何选择GC呢】

为什么公司一般不调呢?因为一般加机器内存了~~。
命令截图版
arthas


工具:arthas


进入arthas后,几个常用命令:
- help
- dashboard 概览
- jvm 对应jinfo命令
- thread 或 thread 对应jstack
- thread -b 查看阻塞线程或者死锁
arthas其他高级命令:
- jad your_classname 看某个类的源码,反编译某个类。可以查看当前线上版本的原代码。
- redefine your_class 热更新class,不用重启线上服务,直接将编译好的某个类换掉。




1.怎么改线程池名称?
必须要自定义线程工厂。线程工厂有7个参数。
本文深入探讨了GC算法原理,包括标记-清除、标记-整理和标记-复制等,重点介绍了CMS和G1收集器的特点及应用场景。同时,文章提供了Arthas工具的使用指南,涵盖基本命令如dashboard、jvm、thread等,以及高级功能如jadyour_classname和redefine,帮助读者掌握Java应用的性能调优和代码热更新。

被折叠的 条评论
为什么被折叠?



