目录
G1垃圾收集器的步骤
1.年轻代GC (Young GC)
2.老年代并发标记过程 (Concurrent Marking)
3.混合回收(Mixed GC)
4.(如果需要,单线程、独占式、高强度的Full GC还是继续存在的。它针对GC的评估失败提供了一种失败保护机制,即强力回收。)
ZGC是什么?
是一款基于Region内存布局的,(暂时)不设分代的,使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记-压缩算法的,以低延迟为首要目标的一款垃圾收集器。
JVM中的安全点和安全区域
安全点:程序执行时并非在所有地方都能停顿下来开始 GC,只有在特定的位置才能停顿下来开始GC,这些位置称为“安全点(Safepoint)”。
安全区域:安全区域是指在一段代码片段中,对象的引用关系不会发生变化,在这个区域中的任何位置开始GC都是安全的。我们也可以把 Safe Region 看做是被扩展了的 Safepoint。
什么是字节码?
源代码经过编译器编译之后便会生成一个字节码文件,字节码是一种二进制的类文件,它的内容是JVM的指令,而不像C、C++经由编译器直接生成机器码。
类文件的结构
魔数
Class文件版本
常量池
访问标识(或标志)
类索引,父类索引,接口索引集合
字段表集合
方法表集合
属性表集合
类的生命周期
过程一:Loading(装载)阶段
过程二:Linking(链接)阶段
过程三:Initialization(初始化)阶段
过程四:类的Using(使用)
过程五:类的Unloading(卸载)
装载阶段主要做了什么事情?
将Java类的字节码文件加载到机器内存中,并在内存中构建出Java类的原型——类模板对象。
初始化阶段中哪几种情况必须对类初始化?
1. 当创建一个类的实例时,比如使用new关键字,或者通过反射、克隆、反序列化。
2. 当调用类的静态方法时,即当使用了字节码invokestatic指令。
3. 当使用类、接口的静态字段时(final修饰特殊考虑),比如,使用getstatic或者putstatic指令。
4. 当使用java.lang.reflect包中的方法反射类的方法时。比如:Class.forName("com.atguigu.java.Test")
5. 当初始化子类时,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。
6. 如果一个接口定义了default方法,那么直接实现或者间接实现该接口的类的初始化,该接口要在其之前被初始化。
7. 当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个主类。
双亲委派模型是什么?,有什么优缺点?
如果一个类加载器在接到加载类的请求时,它首先不会自己尝试去加载这个类,而是把这个请求任务委托给父类加载器去完成,依次递归,如果父类加载器可以完成类加载任务,就成功返回。只有父类加载器无法完成此加载任务时,才自己去加载。
优点:
1.避免类的重复加载,确保一个类的全局唯一性
2.保护程序安全,防止核心API被随意篡改
缺点:顶层的ClassLoader无法访问底层的ClassLoader所加载的类