JVM基础理解

1.类的加载全过程

loadClass类加载过程

        加载->验证->准备->解析->初始化->使用->卸载

加载:从硬盘查找,通过IO读取字节码文件,使用到类时加载。

验证:  验证字节码文件安全性。

准备: 给类常量变量分配内存,并赋予默认值。

解析: 将符号引用替换为直接引用

初始化: 给类的静态变量初始化指定值,执行静态代码块

2.双亲委派机制

类加载器:

        引导类加载器:加载支撑JVM核心库,lib目录下的核心类库

        扩展类加载器:加载支撑JVM扩展库,lib目录下ext目录下的jar包

        应用程序类加载器:负责加载classPath下的类包,自己程序

        自定义类加载器:加载自定义路径下的类包

双亲委派机制:

        先找父亲加载,找不到由儿子加载

        设计目的:沙箱安全机制,避免类重复加载

3.JVM架构和内存模型

4.垃圾清理算法

        标记复制算法:

                内存分为2份相同大小的块,将存活的内存块挪到另一边,再将使用的内存全部清理

        标记清除算法:

                分为2步,将活跃的内存块标记出来,清除未标记的内存。

        缺点: 效率不高,如果内存块过多,标记对象就过多

                     内存空间不够,标记清除后产生大量不连续的内存块

        标记整理算法:

                和标记清楚算法一样,但是标记后会将存活的对象块向一端移动

5.三色标记算法

        通过gc roots开始进行可达性分析,对是否访问过通过三种颜色标记

        白色:对象未被垃圾回收期扫描过。可达性分析开始前,所有对象都是白色,结束后依旧是白色的对象,代表对象不可达。

        黑色:对象已经被扫描过并且这个对象的所有引用也被扫描过。对象是安全存活的。

        灰色:对象被扫描过,但是这个对象的引用没被扫描完。

        增量更新

                当黑色对象插入新的引用时,会将这个新插入的引用关系保存下来,等并发扫描完后再将这些保存的引用关系再次扫描一遍。

        原始快照

        灰色对象要删除指向白色对象的引用关系时, 就将这个要删除的引用记录下来, 在并发扫描结束之后, 再将这些记录过的引用关系中的灰色对象为根, 重新扫描一次,这样就能扫描到白色的对象,将白色对象直接标记为黑色。

6.垃圾收集器

        1.Serial收集器

                串行垃圾收集器,垃圾收集时会STW.

                新生代采用复制算法,老年代采用标记-整理算法。

2.Parallel 收集器

        多线程垃圾收集器,JDK8默认采用这种收集模式

3.ParNew收集器

        parNew和Parallel一样,主要和CMS一起使用

4.CMS垃圾收集器

CMS收集器是一种以获取最短回收停顿时间为目标的收集器。它非常符合在注重用户体验的应用上使用,它是HotSpot虚拟机第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程(基本上)同时工作。
初始标记:暂停所有其他线程,STW,并记录下gc root直接引用对象,速度块
并发标记:并发向下查询,标记使用的对象
重新标记:处理漏标对象
并发清理:开启用户线程,同时GC线程开始对未标记的区域做清扫。
并发重置:重置本次GC过程中的标记数据。

5.G1垃圾收集器

        

分为2048个region,默认年龄带占5%;Humongous区域存储大对象(如果大小超过region大小的50%,被认为大对象),fullGC时也回收大对象。

回收流程

初始标记(STW):记录gc roots的直接引用对象

并发标记:根据直接引用往下寻找标记

最终标记(STW):修复漏标

筛选回收(STW):根据设置的GC回收停顿时间,来进行回收价值和成本排序。

6.ZGC垃圾收集器

        JDK11+新增的垃圾收集器,支持TB级别内存,最大GC时间小于10ms

不分代,使用了 读屏障、颜色指针 来实现标记-整理算法,以延迟为首要目标的一款垃圾收集器。

ZGC的Region分为大中小三类:

小型Region:固定大小2M,放置小于256K 的对象

中型Region:固定大小32M,放置大于256K小于4M的对象

大型Region:容量大小不固定,动态变化,必须是2M的倍数,存放4M以上的对象。

颜色指针:通过对象头位数划分

        

18位:预留给以后使用;
1位:Finalizable标识,此位与并发引用处理有关,它表示这个对象只能通过finalizer才能访问;
1位:Remapped标识,设置此位的值后,对象未指向relocation set中(relocation set表示需要GC的 Region集合);
1位:Marked1标识;
1位:Marked0标识,和上面的Marked1都是标记对象用于辅助GC;
42位:对象的地址(所以它可以支持2^42=4T内存)
第一次GC:使用Mark0, 周期结束所有引用对象标记为01
第二次GC:使用Mark1,期待的Mark标位10,所有引用都能被重新标记
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值