JVM对象引用以及回收算法

java回收机制

概念

为了避免内存溢出,内存泄漏的问题,虽然java有自动垃圾回收机制,但是在高数据量,高并发时,我们仍需要去注意java的回收机制。

引用

Java回收算法需要判断对象是否存活,判断存活的方式,都与“引用”有关,引用的含义是指:引用类型的数据中,存在其他对象的内存地址,我们称这块内存存在引用。java中将引用分为四个强度等级:

  1. 强引用 ,java中最普遍存在的引用方式,只要强引用还存在,虚拟机宁可报出“OOM”异常,也不会对强引用进行回收;
  2. 软引用 ,指的是有用但是非必需的对象。当内存快要满的时候,虚拟机会对软引用对象进行回收,如果回收后内存空间还是不够,就会报出“OOM”异常,java中使用SoftReference类来实现软引用;
  3. 弱引用,用来指非必需对象,引用强度要小于软引用 ,只要虚拟机扫到弱引用,就会对该对象进行回收,java中使用WeakReference类来实现弱引用。
  4. 虚引用,最弱的引用方式,(使用的目的是为了得到系统回收时的一个通知)。java中使用PhantomReference来实现虚引用;

回收算法

引用计数法
该方法通过给对象添加一个引用计数器,每当对象被引用时,计数+1,取消引用时,计数-1,当计数等于0时,代表对象不可能再被使用了,比如python目前再用引用计数法来管理内存。
这里存在一个问题,如果对象之间相互存在引用,当两个对象不在被使用时,如果两个对象相互牵着彼此,两个对象的计数都不为0,计数器就不会通知虚拟机来回收对象。所以引用计数法不是当前java虚拟机中用的管理内存的方法。
可达性分析算法
从GC Roots 出发,当对象与GC Roots存在引用链时,系统就不会将其回收。这是目前Java 虚拟机最主流的内存管理方式。
java中一般会将以下几种作为GC Roots:
1.虚拟机栈中的对象
2.本地方法中的对象
3.方法区中的常量对象
4.静态属性对象

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值