jvm02–内存分配和回收
标签: jvm java
一.GC需要完成的3件事情
- 哪些内存需要回收
- 什么时候回收
- 如何回收
二.各区域内存特点(需回收的内存)
程序计数器、虚拟机栈、本地方法栈3各区域随线程而生,随线程而灭。这几个区域的内存分配回收具有确定性。而java堆和方法区的内存分配和回收都是动态的,垃圾收集器关注的是这部分内存。
三.对象狗带了吗(回收的时机)
1. 引用计数法(存在对象相互循环引用的问题,如对象A引用B,对象B引用A,原本一起狗带,结果相伴到永远,你中有我我中有你)
2. 可达性分析算法(jvm采用)
根节点对象一般为以下几种
* 虚拟机栈(栈帧中的本地变量表)中引用对象
* 方法区中类静态属性引用对象
* 方法区中常量引用对象
* 本地方法栈中JNI(即一般说的Native方法)引用对象
3. 引用分类:强引用,软引用,弱引用,虚引用
4. 方法区回收
* 废弃常量
* 无用的类(条件苛刻)
* 该类所有实例都已经回收
* 加载该类的ClassLoader已经被回收
* 该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类方法。
四.垃圾收集算法
1. 标记-清除算法(Mark-Sweep)
2. 复制算法 (新生代)(Survivor空间不够时,依赖其它内存进行分配担保)
3. 标记-整理算法(Mark-Compact)(老年代)
五.内存分配与回收策略
1. 对象优先在Eden分配
2. 大对象直接进入老年代(如长字符串以及数组)
3. 长期存活的对象进入老年代
4. 如果Survivor空间中相同年龄所有对象大小总和大于Survivor空间一半,则年龄大于或等于该年龄的对象直接进入老年代