1.类加载的过程
1.类的加载是指把类的.class 文件中的数据读入到内存中,通常是创建一个字节数组读入.class 文件,然后产生与所加载类对应的 Class 对象
2.当类被加载后就进入连接阶段,这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤
3.最后 JVM 对类进行初始化,包括:1)如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;2)如果类中存在初始化语句,就依次执行这些初始化语句。
2.简述JVM
(1)JVM粗略分为三个部分:类加载器(ClassLoader),运行时数据区和执行引擎。
(2)类加载器:加载程序中的类和接口,为他们赋予唯一的名字。
(3)执行引擎:执行字节码,执行本地方法。
(4)运行时数据区:
- 方法区(线程共享)
- 堆(线程共享)
- 虚拟机栈(线程私有)
- 本地方法栈(线程私有)
- 程序计数寄存器(线程私有)
3.内存中栈、堆和方法区的用法
栈:基本数据类型变量、对象的引用、函数调用的现场保存;
堆:new关键字和构造器创建的对象,堆是垃圾回收器管理的主要区域;
方法区:jvm加载的类信息、常量、静态变量、JIT编译器编译后的代码、常量池(常量池是方法区的一部分);
程序计数寄存器:每一个线程都会有一个程序计数寄存器,它也是在线程创建是建立的,寄存器的内容指向下一个将被执行的地址。
4.垃圾回收算法
(1)引用计数法
原理是,一个对象增加一个引用就会计数加一,减少一个引用就会减一,最后只会回收计数为0的对象。
(2)标记清除
分为两个阶段,第一阶段从根节点开始标记每一个被引用的对象,第二阶段,清除所有未被标记的对象。
(3)复制
把堆空间平均分为两部分,把引用的对象复制到同一个空间里,然后清除另一个空间里所有的对象。
(4)标记整理
先从根节点开始标记被引用的对象,删除所有未被标记的对象,然后再把剩余对象整理到一个空间里依次排放,避免了空间碎片。