八股文--JVM(2)

⭐️⭐️6.类加载

类加载器

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

1.启动类加载器 ----JAVA_HOME/jre/libC++编写加载的是JAVA_HOME/jre/lib

2.拓展类加载器 ----JAVA_HOME/jre/lib/ext

3.应用类加载器 ----ClassPath自己编写的java程序

4.自定义加载器 ----实现自定义加载

⭐⭐7.双亲委派机制

在加载类的时候,先委托上一级的加载器进行加载,如果上一级加载器也有上级,则会继续向上委托。如果上级加载器无法加载,子类加载器就会尝试加载该类

这样的作用:

1.通过双亲委派机制可以避免莫一个类被重复加载,当父类已经加载后则无需重复加载,保证唯一性

2.保证了类库API不会被修改

3. 简化了加载流程:通过委派,大部分类能够被正确的类加载器加载,减少了每个加载器需要处理的类的数量,简化了类的加载过程,提高了加载效率

️8.类装载的执行过程

加载通过类的全名 ,获取类的二进制数据流;解析类的二进制数据流为方法区的数据结构(Java类模型);创建Java.lang.Class对象,作为方法区这个类的各种数据的访问入口。

连接:验证,准备,解析

  • 验证:验证类是否符合JVM规范,安全性检查(文件格式,元数据,字节码,符号引用)
  • 准备:为类变量分配内存并设置类变量初始值
  • 解析:把类中的符号引用转换为直接引用。

符号引用:方法中调用其他方法,这个方法名就可以理解为符号引用;

直接引用就是指针直接指向方法;

初始化: 对类的静态变量,静态代码执行初始化操作

如果初始化一个类的时候,父类尚未初始化,则会优先初始化父类;

如果同时包含多个静态代码块和静态变量,则按照自上向下的顺序依次执行;

使用: 用类或者创建对象

卸载: 1.该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例。2.加载该类的ClassLoader已经被回收。3.类对应的Java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。

⭐️9.判断垃圾的方法

垃圾回收指的是堆中的对象。

垃圾指的是如果一个或多个对象没有任何的引用指向它了,那么这个对象现在就是垃圾。

引用计数法:

为每个对象分配一个引用计数器,每当有一个地方引用它时,计数器加1;当引用失效时,计数

器减1。当计数器为0时,表示对象不再被任何变量引用,可以被回收。

可达性分析算法:

一组称为GC Roots(垃圾收集根)的对象出发,向下追溯它们引用的对象,以及这些对象引用的其他对象,以此类推。如果一个对象到GC Roots没有任何引用链相连(即从GC Roots到这个对象不可达),那么这个对象就被认为是不可达的,可以被回收。

GC Roots对象包括:虚拟机栈(栈帧中的本地变量表)中引用的对象、方法区中类静态属性引用的对象、本地方法栈中JNl(Java NativeInterface)引用的对象、活跃线程的引l用等。

⭐️⭐️10.垃圾回收算法

垃圾回收机制的主要目标是自动检测和回收不再使用的对象,从而释放它们所占用的内存空间。这样可以避免 内存泄漏(一些对象被分配了内存却无法被释放,导致内存资源的浪费) 。同时,垃圾回收机制还可以防止 内存溢出(即程序需要的内存超过了可用内存的情况)

标记清除算法:

标记清除算法,是将垃圾回收分为俩个阶段: 标记 清除

1.根据可达性分析算法得出的垃圾进行标记

2.对这些标记为可回收的内容进行垃圾回收

优点:标记和清除速度较快

缺点:碎片化较为严重,内存不连贯

标记整理算法:

标记整理算法, 是将垃圾回收分为俩个阶段: 标记 整理在删除。 标记压缩算法是在标记清除算法的基础之上,做了优化改进的算法。和标记清除算法一样,也是从根节点开始,对对象的引用进行标记,在清理阶段,并不是简单的直接清理可回收对象,而是将存活对象都向内存另一端移动,然后清理边界以外的垃圾,从而解决了碎片化的问题

1.标记垃圾

2.需要清除的想右边走,不需要清除的向左边走

3.清除边界以外的垃圾

优缺点同标记清除算法,解决了标记清除算法的碎片化的问题,同时,标记压缩算法多了一步,对象移动内存位置

的步骤,其效率也有有一定的影响。

与复制算法对比:复制算法标记完就复制,但标记整理算法得等把所有存活对象都标记完毕,再进行整理

复制算法:

复制算法,将原有的内存空间一分为二,每次只用其中的一块,在垃圾回收时,将正在使用的对象复制到另一个内存空间中,然后将该内存空间清空,交换两个内存的角色,完成垃圾的回收

优点:在垃圾多的情况,效率较高;清理之后内存没有碎片。

缺点:分配了两块内存空间,同一个时刻只能使用一半,内存使用率较低

分代回收算法

分代收集是将内存划分成了新生代和老年代。分配的依据是对象的生存周期,或者说经历过的 GC 次数。对象创建时,一般在新生代申请内存,当经历一次 GC 之后如果对还存活,那么对象的年龄 +1。当年龄超过一定值(默认是 15,可以通过参数 -XX:MaxTenuringThreshold 来设定)后,如果对象还存活,那么该对象会进入老年代。

⭐️11.垃圾回收器

串行垃圾回收器

Serial:作用于 新生代,采用复制算法

Serial Old:作用与 老年代,采用标记-整理算法

垃圾回收时,只有一个线程在工作,并且java应用所有线程都要暂停,等待垃圾回收完成

并行垃圾回收器

Parallel New:作用于 新生代,采用复制算法

parallel Old:作用与 老年代,采用标记-整理算法

垃圾回收时,只有多个线程在工作,并且java应用所有线程都要暂停,等待垃圾回收完成

CMS(并发)垃圾回收器

CMS全称 Concurrent Mark Sweep,是一款并发 的、使用标记-清除 算法的垃圾回收器,该回收器是针对老年代垃圾 回收的,是一款以获取最短回收停顿时间为目标的收集器,停顿时间短,用户体验就好。其最大特点是在进行垃圾回收时,应用仍然能正常运行

G1垃圾回收器

(Garbage First)收集器 (标记-整理算法):Java堆并行收集器 ,G1收集器是JDK1.7提供的一个新收集器,G1收集器基于"标记-整理" 算法实现,也就是说不会产生内存碎片。此外,G1收集器不同于之前的收集器的一个重要特点是:G1回收的范围是整个Java堆(包括新生代,老年代) ,而前六种收集器回收的范围仅限于新生代或老年代

1.应用与新生代和老年代,JDK之后默认使用

2.划分成多个区域,每个区域都可以充当Eden,survivor,old,humongous,其中humongous是为大对象准备。

3.采用复制算法,标记-整理算法,分代回收算法

4.分为三个阶段:新生代回收,并发标记,混合收集

5.如果并发失败(回收的速度赶不上创建对象的速度),会触发Full GC

Young Collection(年轻代垃圾回收)

1.初始时,所有区域都处于空闲状态

2.创建了一些对象,挑出一些空闲区域作为Eden(伊甸园区)区存储这些对象

3.当Eden(伊甸园区)需要垃圾回收时,挑出一个空闲区域作为S(幸存区)区,用复制算法复制存活对象,这时候处于STW(线程暂停)

4.随着数据流逝,Eden(伊甸园区)内存又有不足

5.将Eden(伊甸园区)以及之前幸存区中的存活对象,采用复制算法,复制到新的S(幸存区),其中较老的对象晋身老年代

Young Collection + Councurrent Mark(年轻代垃圾回收 + 并发标记)

当老年代占用超过阈值(45%)后,触发并发标记,这时无需暂停用户线程

  • 并发标记之后,会有重新标记阶段解决漏标问题,此时需要暂停用户线程。
  • 这些都完成后就知道了老年代有哪些存活对象,随后进入混合收集阶段。此时不会对所有老年代区域进行回收,而是根据暂停时间目标优先回收价值高(存活对象少)的区域(这也是 Gabage First 名称的由来)

Mixed Collection (混合垃圾回收)

复制完成,内存得到释放。进入下一轮的新生代回收、并发标记、混合收集

相关推荐
伍六星39 分钟前
基于JDBC的信息管理系统,那么什么是JDBC呢?
java·数据库·后端·jdbc·数据库连接
互联网行者2 小时前
java云原生实战之graalvm 环境安装
java·开发语言·云原生
LinuxSuRen4 小时前
Docker Compose Provider 服务介绍
java·运维·docker·容器·eureka
sg_knight5 小时前
Docker网络全景解析:Overlay与Macvlan深度实践,直通Service Mesh集成核心
java·网络·spring boot·spring cloud·docker·容器·service_mesh
鬣主任6 小时前
JavaSenderMail发送邮件(QQ及OFFICE365)
java·spring boot·smtp/imap/tls
找不到、了7 小时前
关于ReadWriteLock读写锁的介绍
java·开发语言·jvm
汉得数字平台7 小时前
集星獭 | 重塑集成体验:新版编排重构仿真电商订单数据入库
java·重构·idea·paas·源代码管理
亲爱的马哥7 小时前
TDuckX 2.6 正式发布|API 能力开放,核心表单逻辑重构,多项实用功能上线。
java·服务器·前端
Themberfue7 小时前
RabbitMQ ⑤-顺序性保障 || 消息积压 || 幂等性
java·分布式·消息队列·rabbitmq
白开水不加冰8 小时前
Spring的BeanFactory和FactoryBean的区别
java·后端·spring