一、描述类的装载过程和各个步骤的主要工作
1、加载:使用类的全限定名(包名与类名)从磁盘搜索路径加载此类的二进制字节流(.class文件)
2、链接:验证-准备-解析
(1)验证:验证被加载后的类是否有正确的结构,类数据是否会符合虚拟机的要求,确保不会危害虚拟机安全。
(2)准备:为类的静态变量(static filed)在方法区分配内存,并赋默认初值
(3)解析:将类的二进制数据中的符号引用换为直接引用(老师上课的例子:在16进制显示的.class字节码文件中可以看到常量池里的#XX所对应的指针引用关系)。
二、简述类加载器的双亲委派原则即双亲委派原则的意义
原则:某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。
意义:
(1)避免类的重复加载
(2)保护程序安全,防止核心的JAVA语言环境遭受破坏(老师上课举的例子:自己定义的String类根本没机会记载,BootstrapClassloader会直接加载JAVA的核心类)
Mark-Compact:“标记-整理”(Mark-Compact)算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存
优点:1、避免标记扫描的碎片问题。2、避免停止复制的空间问题。
缺点:占用计算机资源,效率低
Mark-Sweep
优点:1、第一个实现并发垃圾收集的垃圾处理器。2、最短的STW停顿时间,发挥多核CPU并发运行为设计原则。
缺点:1、效率问题,标记和清除两个过程的效率都不高。2、空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多。
Copy算法
优点:1、适用于“朝生夕死”的区域,如新生的Eden区。2、没有标记和清除过程,实现简单,运行高效。3、复制过去以后保证空间的连续性,不会出现"碎片"问题。
缺点:需要两倍的内存空间。