GC垃圾回收机制

3 篇文章 0 订阅

什么是垃圾回收

垃圾回收在哪进行

GC是如何判断对象是否存活的

引用技术算法
可达性分析(Java)

通过查找完整的调用链,去发现哪些节点是无法到达的,即已经被GC回收。

在JAVA中,可做为GC Roots的对象包括:

  1. 方法区中类的静态属性引用的对象
  2. 方法区中常量的引用对象
  3. 虚拟机栈(本地变量表)中引用的对象
  4. 本地方法栈JNI(Native)中引用的对象

四种引用类型

强引用

如果一个对象具有强引用,它就不会被垃圾回收器回收。即使当前内存空间不足,JVM也不会回收它,而是抛出OutOfMemoryError错误,使程序异常终止。

软引用

在使用软引用时,如果内存的空间足够,软引用就能继续被使用,而不会被垃圾回收器回收;只有在内存空间不足时,软引用才会被垃圾回收器回收。

弱引用

在使用弱引用时,只要进行垃圾回收,该引用就被回收。在使用弱引用时,将对象放入弱引用的实现类即可。

虚引用

顾名思义,就是形同虚设,如果一个对象仅持有虚引用,那么它相当于没有引用,在任何时候都可能被垃圾回收器回收。

虚引用必须和引用队列关联使用,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

ReferenceQueue<String> queue = new ReferenceQueue<String>();
PhantomReference<String> pr = new PhantomReference<String>(new String("hello"), queue);

当我在方法内部写下来

Object o1 = new Object();
Object O2 = o1;

我们在堆里面就产生了一个关于Object的实例,在栈里面产生了一个类型为Object的O对象的引用

垃圾回收算法

复制算法

  • 优点

简单高效,不会出现内存碎片问题

  • 缺点

存活对象较多时,效率会更低。

标记清除算法

  • 优点

利用率百分之百

  • 缺点

标记和清除速率对比复制算法都不高
会产生大量的不连续的内存碎片

分代收集

-XX:NewRadio 2 // 新生代和老年代的比例为 1:2

-Xmn
-XX:NewSize/MaxNewSize
发生在新生代 Minor GC
老年代 Full GC (同样的也会回收新生代的内存,永久代内存溢出的时候也会发生Full GC)

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QzO4Wjdu-1598495216853)(DC08D3A6BAEB4BE1AC552157980FC477)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0WIc9n4m-1598495216855)(5C17EEA69E8B4311B0914BB8B98A2573)]

参数 如何使用

垃圾回收中的Stop The World 现象
当我们发生垃圾回收时,要暂停所有的用户进程,因为在内存中大多数的垃圾都是由用户进程产生的,如果一边进行垃圾回收,线程一边产生垃圾,会降低垃圾回收的效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值