JVM(java虚拟机)--默背版

发布于:2025-08-29 ⋅ 阅读:(15) ⋅ 点赞:(0)

(二)类初始化和类加载

1.创建对象的过程?

类加载检查 、分配内存 、初始化零值、必要设置对象头、构造函数初始化

2.对象的生命周期?

创建、使用、销毁

3.类加载器有哪些?

启动类加载器、扩展类加载器、应用类加载器、用户自定义类加载器

4.双亲委派模型的作用

(1)保证类的唯一性
(2)安全
(3)支持隔离和层次划分
(3)简化加载的流程

5.类加载的过程

加载、连接(验证、准备、解析)、初始化、使用、卸载

6.类的加载和双亲委派原则

类的加载过程包括:加载、连接、初始化
(1)加载(Linking)
加载阶段,java将字节码数据从不同的数据源(这边的数据源可以包括不同形态,比如jar包、class文件、网络数据源等)读取到到jvm中,并映射成jvm认可的数据结构(.class对象)。如果数据结构不是ClassFile的结构,会抛出classFormatError。
加载阶段是用户可以参与的阶段,用户可以自定义加载类加载器,实现类的加载过程。
(2)连接(Linking)
1)验证(verifying):虚拟机安全保障。JVM需要核验字节信息是否符合jvm规范。不符合就是verifyError,防止恶意信息干扰JVM的运行。验证阶段会触发更多的类加载。
2)准备(preparing):创建类或接口的静态变量,并初始化静态变量的初始值。这边的初始化不同于显式的初始化阶段,主要是进行所需要的内存分配,而不执行jvm的进一步操作。
3)解析(Resolution):将常量池的符号引用直接转换成直接引用。
(3)初始化(initialization)
初始化静态字段的赋值操作,执行类定义的静态初始化块内的逻辑
初始化阶段在编辑器的编译期间就会整理好。
父类型初始化逻辑优于当前类型初始化逻辑。

双亲委培原则:使用双亲委培模型是为了防止重复加载java类型。
(三)垃圾回收

1.什么是java的垃圾回收?如何触发垃圾回收? 垃圾回收是?

垃圾回收是自动管理内存的一种方式,负责释放不被程序引用的对象的内存,可以有效的解决内存泄露和内存管理错误的问题。常见的自动触发垃圾回收的场景:
(1)内存不足:当JVM自动监测到内存不足,无法为新对象分配内存,自动触发垃圾回收机制。
(2)手动请求:垃圾回收是自动的,开发者通过system.gc()调用,或者runtime.getRunTime.gc()调用。
(3)JVM参数:-xmx(最大堆内存),-xms(初始化堆内存)。启动java应用的时候通过JVM参数来调整垃圾回收的行为。
(4)对象数量或内存达到阈值:垃圾回收器内部的一些策略,可以监测创建的对象数量和内存使用大小,达到阈值的时候自动触发垃圾回收。

2.判断垃圾的方法

判断对象是否为垃圾,如果该对象不再使用或者不被其他对象引用,就可以被垃圾回收器回收。
判断对象是否为垃圾的算法:计数法和可达性算法
(1)计数法:
1)原理:给对象分配一个引用计数器,当该对象被某个地方引用的时候,计数器加1。当对象引用失效的时候,计数器-1。当计数器为0的时候,说明该对象不被任何变量引用,此时就可以触发垃圾回收机制。
2)缺点:不能解决循环引用的问题。如果两个对象互相引用,但是不会背其他任何对象引用,此时计数器不为0,导致该对象无法回收。
(2)可达性算法:java虚拟机主要采用此算法来判断对象是否为垃圾。
有一组gc root(垃圾回收根),从GC root出发,向下溯源它们的引用对象,再找他们引用对象的引用对象。如果一个对象到GC root 没有任何链相连,说明GC root到这个对象不可达,可以被回收。
GC root的对象包括:虚拟机栈正在引用的对象(栈帧中的本地变量表),本地方法栈正在引用的对象(JNI:java native interface),静态属性引用的对象,方法区常量引用的对象。
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到