1.JVM内存模型
堆:创建对象的地方
栈:方法执行和引用遍历的地方
元数据区(本地方法区):静态遍历,class类
本地方法栈:native修饰的方法,c语言写的
程序计数器:程序控制
2.类加载机制
加载-类加载过程的一个阶段,ClassLoader通过一个类的完全限定名查找此类字节码文件,并利用字节码文件创建一个class对象
验证-目的在于确保class文件的字节流中包含信息符合当前虚拟机要求,不会危害虚拟机自身的安全,主要包括四种验证:文件格式的验证,元数据的验证,字节码验证,符号引用验证。
准备-为类变量(static修饰的字段变量)分配内存并且设置该类变量的初始值,(如static int i = 5 这里只是将 i 赋值为0,在初始化的阶段再把 i 赋值为5),这里不包含final修饰的static ,因为final在编译的时候就已经分配了。
解析-常量池中的符号引用替换成直接引用
初始化-类具有父类就进行对父类进行初始化,执行其静态初始化器(静态代码块)和静态初始化成员变量
双亲委派机制:父类加载,不重复加载
3.分代回收
年轻代:刚出生的对象
So:第一次没有被回收的对象
S1:第n次没有被回收的对象
老年代:15次以后没有被回收的对象,超级大的对象
4.垃圾回收机制
引用计数:给每个对象添加一个计数器,当有地方引用该对象时计数器加1,当引用失效时计数器减1。用对象计数器是否为0来判断对象是否可被回收。
缺点:
无法解决循环依赖的问题
标记清除:它分为2部分,先把内存区域中的这些对象进行标记,哪些属于可回收标记出来,然后把这些垃圾拎出来清理掉。就像上图一样,清理掉的垃圾就变成未使用的内存区域,等待被再次使用。
缺点:
内存碎片
标记整理:但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,再清理掉端边界以外的内存区域。
缺点:
标记整理算法对内存变动更频繁,需要整理所有存活对象的引用地址,在效率上比复制算法要差很多。
标记复制:可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
缺点:
消耗空间
5.垃圾回收器:
cms垃圾回收器:
初始标记-》并发标记-》重复标记-》并发清除
标记清除算法
G1垃圾回收器:
标记整理