java重点学习-JVM类加载器+垃圾回收

12.7类加载器

JVM只会运行二进制文件,类加载器的作用就是将字节码文件加载到JVM中,从而让Java程序能够启动起来。

类加载器有哪些

  • 启动类加载器(BootStrap ClassLoader):加载JAVA HOME/jre/lib目录下的库
  • 扩展类加载器(ExtClassLoader):主要加载JAVA HOME/jre/lib/ext目录中的类
  • 应用类加载器(AppClassLoader):用于加载classPath下的类
  • 自定义类加载器(CustomizeClassLoader):自定义类继承ClassLoader,实现自定义类加载规则。使用的少
1.什么是双亲委派模型?

加载某一个类,先委托上一级的加载器进行加载,如果上级加载器也有上级,则会继续向上委托,如果该类委托上级没有被加载,子加载器尝试加载该类

2.JVM为什么采用双亲委派机制?
  • 通过双亲委派机制可以避免某一个类被重复加载,当父类已经加载后则无需重复加载,保证唯一性。
  • 为了安全,保证类库API不会被修改

12.8类加载的执行流程

类从加载到虚拟机中开始,直到卸载为止,它的整个生命周期包括了:加载、验证、准备、解析、初始化、使用和卸载这7个阶段。其中,验证、准备和解析这三个部分统称为连接(linking)

  • 加载:查找和导入class文件
  • 验证:保证加载类的准确性
  • 准备:为类变量分配内存并设置类变量初始值
  • 解析:把类中的符号引用转换为直接引用
  • 初始化:对类的静态变量,静态代码块执行初始化操作
  • 使用:JVM 开始从入口方法开始执行用户的程序代码
  • 卸载:当用户程序代码执行完毕后,JVM便开始销毁创建的Class对象

验证

准备

解析

初始化

使用

12.9 对象什么时候可以被垃圾器回收

如果一个或多个对象没有任何的引用指向它了,那么这个对象现在就是垃圾如果定位了垃圾,则有可能会被垃圾回收器回收

定位垃圾的方式有两种

  • 引用计数法
  • 可达性分析算法

12.10 JVM垃圾回收算法有哪些

使用少 老年代 年轻代

  • 标记清除算法:垃圾回收分为2个阶段,分别是标记和清除,效率高,有磁盘碎片,内存不连续使用少
  • 标记整理算法:标记清除算法一样,将存活对象都向内存另一端移动,然后清理边界以外的垃圾,无碎片,对象需要移动,效率低。 老年代
  • 复制算法:将原有的内存空间一分为二,每次只用其中的一块,正在使用的对象复制到另一个内存空间中,然后将该内存空间清空,交换两个内存的角色,完成垃圾的回收:无碎片,内存使用率低。年轻代

标记清除算法,是将垃圾回收分为2个阶段,分别是标记和清除

  • 1.根据可达性分析算法得出的垃圾进行标记
  • 2.对这些标记为可回收的内容进行垃圾回收

12.11 说一下JVM中的分代回收

一、堆的区域划分

  • 1.堆被分为了两份:新生代和老年代【1:2】
  • 2.对于新生代,内部又被分为了三个区域。Eden区,幸存者区survivor(分成from和to)【8:1:1】

二、对象回收分代回收策略

  • 1.新创建的对象,都会先分配到eden区
  • 2.当伊甸园内存不足,标记伊甸园与 from(现阶段没有)的存活对象
  • 3.将存活对象采用复制算法复制到to中,复制完毕后,伊甸园和from 内存都得到释放
  • 4.经过一段时间后伊甸园的内存又出现不足,标记eden区域to区存活的对象,将其复制到from区
  • 5.当幸存区对象熬过几次回收(最多15次),晋升到老年代(幸存区内存不足或大对象会提前晋升)

三、MinorGC、Mixed Gc、FullGC的区别是什么

  • MinorGC【young GC】发生在新生代的垃圾回收,暂停时间短(STW)
  • Mixed GC 新生代+老年代部分区域的垃圾回收,G1 收集器特有
  • FullGC:新生代+老年代完整垃圾回收,暂停时间长(STW),应力避免

12.12 说一下 JM 有哪些垃圾回收器?

在jvm中,实现了多种垃圾收集器,包括:

  • 串行垃圾收集器:Serial GC、Serial OldGC
  • 并行垃圾收集器:Parallel Old GC、ParNew GC
  • CMS(并发)垃圾收集器:CMS GC,作用在老年代
  • G1垃圾收集器,作用在新生代和老年代

12.13 G1垃圾回收期

12.14 强引用、软引用、弱引用、虚引用的区别

  • 强引用:只要所有 GC Roots 能找到,就不会被回收
  • 软引用:需要配合SoftReference使用,当垃圾多次回收,内存依然不够的时候会回收软引用对象
  • 弱引用:需要配合WeakReference使用,只要进行了垃圾回收,就会把弱引用对象回收
  • 虚引用:必须配合引用队列使用,被引用对象回收时,会将虚引用入队由 Reference Handler 线程调用虚引用相关方法释放直接内存
相关推荐
XuanXu14 分钟前
Java AQS原理以及应用
java
风象南3 小时前
SpringBoot中6种自定义starter开发方法
java·spring boot·后端
mghio12 小时前
Dubbo 中的集群容错
java·微服务·dubbo
咖啡教室17 小时前
java日常开发笔记和开发问题记录
java
咖啡教室17 小时前
java练习项目记录笔记
java
鱼樱前端17 小时前
maven的基础安装和使用--mac/window版本
java·后端
RainbowSea18 小时前
6. RabbitMQ 死信队列的详细操作编写
java·消息队列·rabbitmq
RainbowSea18 小时前
5. RabbitMQ 消息队列中 Exchanges(交换机) 的详细说明
java·消息队列·rabbitmq
李少兄20 小时前
Unirest:优雅的Java HTTP客户端库
java·开发语言·http