JVA---内存管理和垃圾回收机制

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,最新的发展成果,面向服务器端,可预测停顿时间 模型。


猜你喜欢

转载自blog.csdn.net/mr_ming_/article/details/79694398