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个参数。