JVA---内存管理和垃圾回收机制
1. 何为GC
垃圾回收机制是由GC实现的,一个后台的低优先级的守护进程。在内存中低到一定限度时才会自动运行,因此回收的时间是不确定的。
因为GC也要占用CPU资源,所以执行过于频繁会对JAVA程序执行产生影响,所以实行不定期的GC。
垃圾回收GC只能回收new申请的内存,但是堆上的内存并不完全是new申请分配的,所以需要在finalize中使用本地方法,再使用GC。
2. 何为垃圾
Java中那些不可达的对象就会变成垃圾,当一个对象没有任何链相连时,这个对象就可以被回收。
2.1 栈中的本地变量表所引用的对象
2.2 方法区中类静态属性和常量引用的对象
2.3 本地方法栈中引用的对象
2.4 改变对象的引用,String类型被判定为可回收对象,循环执行的每个Object,类嵌套分配置空,线程执行完产生的垃圾。
3. 四种引用类型
3.1 强引用,不会被回收。
3.2 软引用,当内存空间不足时回收。
3.3 弱引用,一旦发现了弱引用的对象,不管是否有空间,都会回收。
3.4 虚引用,必须和队列联合使用,在回收内存之前,把这个虚引用加入到队列中,可以通过判断引用队列中是否有该虚引用对象,来知道这个对象是否要被回收。
4. 典型的垃圾回收算法
4.1 标记-清除算法
4.2 复制算法,如果存活对象很多,那么效率将会大大降低。
4.3 标记整理算法,充分利用内存空间,将存活的对象移到另一端,清理掉边界以外的内存。
4.4 分代回收算法,将堆划分为老年代,新生代。老年代只有少量被回收,新生代有大量被回收,不同的区有不同的回收算法,新生代基本采用复制算法。永久代:用来存储class文件,静态方法,方法描述。主要回收废弃常量和无用类。
5. 典型的垃圾回收器
5.1 Serial & Serial Old ,单线程收集器,在收集垃圾时,必须暂停所有用户线程。
5.2 ParNew ,多线程版5.1
5.3 Parallel Scavenge,新生代多线程收集器,采用Copying算法。
5.4 Parallel Old,老年代版本,使用多线程和Mark-Compact算法。
5.5 CMS,并发收集器,G1,最新的发展成果,面向服务器端,可预测停顿时间 模型。