JVM内存模型&GC垃圾回收机制&类加载机制

2021-11-04  本文已影响0人  半罐子晃

整理有误烦请评论区提醒,及时改进~

一、JVM内存模型:

二、垃圾回收机制

※判断对象是否可回收的机制:
※主流的垃圾收集算法:
※JVM的垃圾回收策略:分代回收!合理划分内存区域并根据各个区域定制不同的回收算法。划分区域如下图:

分代回收机制流程:新创建的对象放入Eden区,当此区域的内存使用到达阈值时触发Young GC,然后将Eden区存活的对象复制到From区,下次再触发Young GC再将Eden区和From区存活的对象放入To区,From区和To区频繁的来回复制,存活次数过多的对象就会进入Old老年区。

※GC类型:Scavenge GC和Full GC两种类型。
※垃圾回收器:串行收集器、并行收集器、并发收集器,选用哪种JVM会根据当前系统配置进行判断:
※引用的回收:强>软>弱>虚

强引用:Object obj = new Object(); 创建的,只要强引用在就不回收。
软引用:SoftReference 类实现软引用。在系统要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行二次回收。
弱引用:WeakReference 类实现弱引用。对象只能生存到下一次垃圾收集之前。在垃圾收集器工作时,无论内存是否足够都会回收掉只被弱引用关联的对象。
虚引用:PhantomReference 类实现虚引用。无法通过虚引用获取一个对象的实例,为对象设置虚引用唯一目的就是能在这个对象被收集器回收时收到一个系统通知。

※GC优化:

GC算法触发时,因为线程不安全,除GC所需的线程外,所有线程都进入等待状态(native 方法可以继续执行但也不能跟JVM交互),直到GC任务完成,这个阶段叫做「stop-the-world」!所以GC优化尽可能减少GC的触发时机。
GC回收的区域位于「堆」和「方法区」内的对象。「栈」里的数据在超出作用域后会被JVM自动释放掉。

三、类加载机制

概述:JVM把.class字节码文件加载到虚拟机内存中的过程。
类加载过程:

类加载主要有三个过程:加载(loading)、连接(linking)、初始化(initializing)。其中连接又分三个步骤:校验、准备和解析。

双亲委派机制:

解释:当有一个类需要被加载时,首先要判断这个类是否已经被加载到内存,判断加载与否的过程是有顺序的,如果有自己定义的类加载器,会先到custom class loader 的cache(缓存)中去找是否已经加载,若已加载直接返回结果,否则到App的cache中查找,如果已经存在直接返回,如果不存在,到Extension中查找,存在直接返回,不存在继续向父加载器中寻找直到Bootstrap顶层,如果依然没找到,那就是没有加载器加载过这个类,需要委派对应的加载器来加载,先看看这个类是否在自己的加载范围内,如果是直接加载返回结果,若不是继续向下委派,以此类推直到最下级,如果最终也没能加载,就会直接抛异常 ClassNotFoundException,这就是双亲委派模式。如下图:


查找顺序图示
双亲委派图示
类加载顺序

父类的静态字段 -->父类的静态代码块 -->子类静态字段 -->子类静态代码块 -->父类成员变量(非静态字段) -->父类非静态代码块 -->父类构造器 -->子类成员变量 -->子类非静态代码块 -->子类构造器。

上一篇 下一篇

猜你喜欢

热点阅读