Jvm 垃圾回收算法 : 引用计数&可达性分析

本文探讨了在内存紧张和高并发场景下如何利用垃圾回收策略。讲解了垃圾回收的发生区域、对象回收时机,特别是可达性分析和根对象的定义。详细介绍了四种Java引用类型:强引用、软引用、弱引用和虚引用,并揭示了它们在内存管理中的作用。
摘要由CSDN通过智能技术生成

目录

什么场景下该使用垃圾回收策略

垃圾回收发生在哪些区域

对象在什么时候能够被回收

 根对象(GC Roots)包括哪些对象

Java中四种引用对象

强引用 (Strong Reference)

软引用 (Soft Reference)

弱引用 (Weak Reference)

虚引用 (Phantom Reference)


什么场景下该使用垃圾回收策略

  • 对内存要求苛刻的场景:想办法提高对象的回收效率,多回收掉一些对象,腾出更多内存
  • 在Cpu使用率高的情况下:降低高并发垃圾回收的频率,让CPU更多的去执行你的业务而不是垃圾回收

垃圾回收发生在哪些区域

 堆和方法区线程共享,垃圾回收的主要对象。方法区回收废弃的常量和不需要使用的类。

对象在什么时候能够被回收

引用计数法:通过对象的引用计数器来判断是否被引用。但是解决不了循环引用的问题

A → B → C → D → B  当A 不引用 B的时候,理论上BCD都要被回收,但是他们3个之间循环引用,引用计数器不为0,所以不能被回收

可达性分析:以根对象(GC Roots)作为起点向下搜索,走过的路径被称为引用链(Reference Chain),如果某个对象到根对象没有引用链相连时,就认为这个对象时不可达的,可以回收。

 根对象(GC Roots)包括哪些对象

  • 虚拟机栈(栈帧中的本地变量表)中的引用对象
  • 方法区中类静态属性引用的对象
  • 方法去中常量引用的对象
  • 本地方法栈中JNI(即 Native方法)引用的对象

Java中四种引用对象

分别是  强引用、软引用、弱引用和虚引用。

强引用 (Strong Reference)

只要是强引用的类型,那么垃圾回收的时候绝对不会去回收这个对象的

 例如这种就是强引用:User user = new User()

软引用 (Soft Reference)

用来描述一些有用但非必须的对象。软引用关联的对象,只有在内存不足的时候才会回收。利用这个特性软引用就适合用来做些缓存,比如网页缓存,图片缓存

把 “ User ” 实例对象用一个“SoftReference”软引用类型的对象给包裹起来了
static SoftReference<User> userSoftReference = new SoftReference<User>(new User());

弱引用 (Weak Reference)

弱引用也是用来描述非必须的对象的。当Jvm垃圾回收的时候,无论内存是否充足,都会被回收弱引用关联的对象

WeakReference 包裹的对象
WeakReference <User> user = new WeakReference <User>(new User());

虚引用 (Phantom Reference)

ReferenceQueue<String> queue = new ReferenceQueue<>();
PhantomReference<String> pr = new PhantomReference<>("aa",queuq)
虚引用必须和ReferenceQueue配合

可达性算法当判断一个对象即使不可达,也不一定会被回收。还会经历下面这一步骤

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值