02JVM_垃圾回收GC

二、垃圾回收GC

里面存放着java的所有对象实例,当对象为“死去”,也就是不再使用的对象,就会进行垃圾回收GC

1.如何判断对象可以回收

1.1引用计数器

介绍

在对象中添加一个引用计数器,当一个对象被其他变量引用时这个对象的引用计数器加1。当某个变量不再引用这个对象时引用计数器减1。当这个引用计数变为0时,这个对象就会被垃圾回收。

优点

判定效率很高

缺点

不完全准确,当两个对象相互引用就判断失效了。当A引用B对象,B引用A对象,然后A和B不再被其他变量引用,垃圾不会回收,出现了垃圾回收失效。

02JVM_垃圾回收GC_第1张图片

 

1.2可达性分析算法(Java)

介绍

①要确定一个根对象GC Roots(肯定不会被垃圾回收的对象)作为起始节点,当垃圾回收前会对堆对象进行扫描,判断这些对象是否被根对象引用,如果没有被引用那么这个对象就可以垃圾回收。

②java虚拟机是通过可达性分析判断存活对象

02JVM_垃圾回收GC_第2张图片

哪些对象可以作为GC Root?

①虚拟机栈中引用的对象

各个线程调用的方法(参数,局部变量)

②本地方法栈中native方法引用的对象

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

Java类的引用类型静态变量

④方法区中常量引用的对象

字符串常量池StringTable里的引用

⑤所有被同步锁synchronized持有的对象

⑥java虚拟机内部的引用,核心类

1.3四种引用

02JVM_垃圾回收GC_第3张图片

 

1.强引用-不回收

介绍

程序代码中普遍存在的引用赋值“Object obj = new Object()”这种引用关系。

特点

不回收,只要沿着GC Root引用链能够找到这个对象,这个对象就不会被垃圾回收。

2.软引用-内存不足回收

介绍

软引用(间接引用)是一些还有用但非必需的对象,当被软引用关联的对象,系统发生内存溢出钱,会把这些对象列进回收范围进行二次回收。如果这次回收没有足够的内存,会抛出内存溢出异常

特点

当垃圾回收后,此时内存仍不够,软引用关联的对象会进行垃圾回收(内存不够才回收)

3.弱引用-发现就回收

介绍

弱引用是一些还有用但非必需的对象,生存到下一次垃圾回收为止。在系统进行垃圾回收时,发现弱引用,不管系统堆空间是否充足,都会回收软引用关联的对象。

特点

当发生垃圾回收时,弱引用关联的对象都会被回收。(内存不管够不够都回收)

4.虚引用-对象回收跟踪

介绍

当虚引用对象创建时会关联一个引用队列。虚引用在创建时必须提供引用队列作为参数。当垃圾回收准备回收一个对象时,如果发现他是虚引用,在垃圾回收后把这个虚引用加入引用队列,通知应用程序对象的回收情况。

5.终结器引用-引用队列配合

介绍

用于实现对象的finalize()方法。当终结器对象创建时会关联一个引用队列。当准备回收一个对象时,发现是终结器引用,会把终结器引用对象放入引用队列(此时对象没回收)。由Finalizer线程调用该对象的finalize()方法,第二次垃圾回收就会回收此对象。

2.垃圾回收算法

2.1标记清除

什么时候垃圾回收

扫描整个堆对象的过程中,如果发现对象被GC Root引用了,需要保留。如果这个对象没有被GC Root引用,就要进行垃圾回收。

标记清除算法的两个阶段

①把没有引用的对象标记为垃圾。

②把垃圾对象占用的空间释放,清除

③释放不是空间清0,而是把起始地址记录下来,然后将来把创建的新对象存储这个位置

02JVM_垃圾回收GC_第4张图片

优点

垃圾回收速度快

缺点

产生内存碎片

2.2标记整理

标记整理两个阶段

①把没有引用的对象标记为垃圾

②把可用的对象向前移动,让内存更加紧凑。连续的空间变多。

02JVM_垃圾回收GC_第5张图片

优点

没有内存碎片

缺点

对象整理过程中需要移动,垃圾回收效率低。

2.3复制

复制两个阶段

①把没有引用的对象标记为垃圾

②把活着的内存分为两块from区和to区。把from区存活的对象复制到to区。然后清空from区,然后交换from和to的位置

02JVM_垃圾回收GC_第6张图片

优点

没有内存碎片

缺点

占用双倍内存空间

你可能感兴趣的:(JVM,jvm,java,开发语言)