JVM---垃圾回收的主要问题

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

可达性分析算法:

          Java 虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象
        扫描堆中的对象,看是否能够沿着 GC Root对象 为起点的引用链找到该对象,找不到,表示可以回收
  哪些对象可以作为 GC Root ?

  通过memory analyzer 可以分析哪些可以作为GC Root对象。

java虚拟机中的四种引用:

  1. 强引用
        只有所有 GC Roots 对象都不通过【强引用】引用该对象,该对象才能被垃圾回收

    List<byte[]> list = new ArrayList<>();
    list.add(new byte[_4MB]);

2. 软引用(SoftReference)
      仅有软引用引用该对象时,在垃圾回收后,内存仍不足时会再次出发垃圾回收,回收软引用
对象可以配合引用队列来释放软引用自身

List<SoftReference<byte[]>> list = new ArrayList<>();
ReferenceQueue<byte[]> queue = new ReferenceQueue<>(); //引用队列,当软引用对象被回收的时候,软引用会被加入到这个队列中
SoftReference<byte[]> ref = new SoftReference<>(new byte[_4MB],queue);
list.add(ref);  
queuq.poll()  // 可以获取软引用对象

3. 弱引用(WeakReference)  将上面的代码中写成WeakReference,其他的不变
      仅有弱引用引用该对象时,在垃圾回收时,无论内存是否充足,都会回收弱引用对象
可以配合引用队列来释放弱引用自身


4. 虚引用(PhantomReference)
      必须配合引用队列使用,主要配合 ByteBuffer 使用,被引用对象回收时,会将虚引用入队,
由 Reference Handler 线程调用虚引用相关方法释放直接内存
5. 终结器引用(FinalReference)
      无需手动编码,但其内部配合引用队列使用,在垃圾回收时,终结器引用入队(被引用对象
暂时没有被回收),再由 Finalizer 线程通过终结器引用找到被引用对象并调用它的 finalize
方法,第二次 GC 时才能回收被引用对象

2. 垃圾回收算法


3. 分代垃圾回收


4. 垃圾回收器

1、串行

2、吞吐量优先

3、响应时间优先


5. 垃圾回收调优

垃圾回收主要参考文章:https://blog.csdn.net/oneby1314/article/details/107979977

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zero _s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值