Java 垃圾回收

Posted work hard work smart

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 垃圾回收相关的知识,希望对你有一定的参考价值。

  1、对象被判断为垃圾的标准

没有被其它对象引用

 

2、判断对象是否为垃圾的算法

1)引用计数算法

2)可达性分析算法

 

3、引用计数算法

1) 通过判断对象的引用数量来决定对象是否可以被回收

2)每个对象实例都有一个引用计数器,被引用则+1, 完成引用则-1

3) 任何引用计数为0的对象实例可以被当作垃圾收集

 

4、引用计数算法优缺点

优点: 执行效率高,程序执行受影响较小

缺点: 无法检测出循环引用的情况,导致内存泄露。(如父对象引用子对象,子对象中引用父对象,引用计数永远不可能为0)

 

5、可达性分析算法

通过判断对象的引用链是否可达来决定对象是否可以被回收。

 

6、什么对象可以作为GC Root对象

1) 虚拟机栈中的引用的对象(栈桢中的本地变量表)

2) 方法区中的常量引用的对象

3)方法区中的类静态属性引用的对象

4)本地方法栈中JNI(Native方法)的引用对象

5)活跃线程的引用对象

 

7、垃圾回收算法

1) 标记-清除算法(Mark and Sweep)

标记: 从根集合进行扫描,对存活的对象进行标记

清除: 对堆内存从头到尾进行线性遍历,回收不可达对象内存

 

缺点: 容易造成碎片化

如上图,Sweep后,有三个不连续的内存,如果要分配的对象比较大(比如有占用三个),就无法分配到刚才Sweep的区域。

 

2)复制算法(Copying)(适用对象存活率低的场景)

分为对象面和空闲面

对象在对象面上创建

存活的对象被对象面复制到空闲面

将对象面所有对象内存清除

 

复制算法:

解决碎片化问题

顺序分配内存,简单高效

适用于对象存活率低的场景

 

3) 标记-整理算法(Compacting)

标记: 从根集合进行扫描,对存活的对象进行标记

清除: 移动所有存活的对象,且按照内存地址次序依次排列,然后将末端内存地址以后的内存全部回收。

 

以上是关于Java 垃圾回收的主要内容,如果未能解决你的问题,请参考以下文章

Java学习笔记3.11.2 垃圾回收 - 垃圾回收的实现方式

Java开发中垃圾回收的最佳做法?

53.垃圾回收算法的实现原理启动Java垃圾回收Java垃圾回收过程垃圾回收中实例的终结对象什么时候符合垃圾回收的条件GC Scope 示例程序GC OutOfMemoryError的示例

Java垃圾回收手册翻译 - 什么是垃圾回收

java中垃圾回收机制的原理

java中是怎样进行垃圾回收的?