一,内存管理
1,jvm提供自动的内存管理
2,jvm在开始运行时会在内存开启一片空间,这篇空间主要由以下五部分组成
方法区:为所有的线程共享,用于存放以加载的类信息,静态变量,常量和即使编译器编译后的代码
虚拟机栈:线程用来执行程序的内存空间
本地方法栈:
堆(heap):存放实例的地方,GC管理的主要区域
程序计数器:记录程序运行下一条指令的地址
二,垃圾回收
1,首先判断对象是否存活
引用计数法:为每一个对象添加一个引用计数器,当多一个引用变量指向对象时引用计数器加一,反之减一,当计数器为零时,该对象将等待回收(无法解决循环引用的问题)
可达性分析算法:以系统给定的名称为“GC Root”的对象为起点,从这个起点向下搜索,搜索走过的路径称为引用链,当一个对象不再任何引用链上时,该对象将等待回收。
GC Root对象:
虚拟机栈中引用的对象,本地方法栈中JNI引用的对象,方法区中类静态成员变量引用的对象,方法区中常量引用的对象;
2,垃圾回收算法
标记清除,复制算法,标记压缩,分代算法
标记清除:该算法分为两个阶段,标记阶段找到所有的可访问对象,做个标记。遍历堆把未标记的对象进行回收。
复制算法:可将堆内存分为两块,from域和to域,每次只使用from域,当from域内存不够时,执行GC操作,将from域中的对象拷贝到to域,将from域进行清空;
标记压缩:标记-清除算法的升级版。在完成标记阶段后,不是直接对可回收对象进行清理,而是让存活对象向着一端移动,然后清理掉边界以外的内存
分代算法:根据对象的存活周期不同将内存划分为新生代和老年代,新生代和老年代所采用的垃圾祸首算法是不一样的,新生代采用复制算法,老年代主要采用压缩标记清除算法
3,垃圾回收机制
Minor GC 和Full GC