java内存垃圾判断

如何判定一个对象是垃圾

1.引用计数法:
java中,通过引用和对象关联的,那么当一个对象没有关联的引用时,说明这个对象不会再被使用,可以判断这个对象是垃圾。
引用计数法的缺陷:循环引用
2.可达性分析法:
通过GC Roots作为起始点,从这些节点开始向下搜索,搜索走过的路径叫做引用链。当一个对象与任何一个GC Roots没有引用链相连时,就认为该对象是内存垃圾。
在这里插入图片描述

可达性分析算法

这里涉及到两个概念:一个是GC Roots,一个是可达性。

  • GC Roots可以是哪些对象:
    1.虚拟机栈的局部变量表所引用的变量
    2.方法区的静态变量和常量引用的对象
    3.本地方法栈中引用的对象

JVM判断对象是否存活

即使在可达性分析算法中不可达的对象,也并非是“非死不可”的,这时候它们暂时处于“缓刑”阶段,要真正宣告一个对象死亡,至少要经历再次标记过程。
标记的前提是对象在进行可达性分析后发现没有与GC Roots相连接的引用链。
1).第一次标记并进行一次筛选。
筛选的条件是此对象是否有必要执行finalize()方法。
当对象没有重写finalize方法,或者finzlize方法已经被虚拟机调用过,虚拟机将这两种 情况都视为“没有必要执行”,对象被回收。
2).第二次标记
如果这个对象被判定为有必要执行finalize()方法,那么这个对象将会被放置在一个名为:F-Queue的队列之中,并在稍后由一条虚拟机自动建立的、低优先级的Finalizer线程去执行。这里所谓的“执行”是指虚拟机会触发这个方法,但并不承诺会等待它运行结束。这样做的原因是,如果一个对象finalize()方法中执行缓慢,或者发生死循环(更极端的情况),将很可能会导致F-Queue队列中的其他对象永久处于等待状态,甚至导致整个内存回收系统崩溃。
在这里插入图片描述

强软弱虚引用

在Java中垃圾回收器的运行是JVM操作的,但是我们仍然可以在一定程度上与垃圾回收器进行交互,其目的在于更好的帮助垃圾回收器管理好应用的内存,避免内存出现OOM这种交互方式就是使用JDK 1.2引入的java.lang.ref包,为对象指定不同的引用类型。

  • 传统引用方式
    在JDK1.2以前,Java中引用的定义很传统: 如果引用类型的数据中存储的数值代表的是另一块内存的起始地址,就称这块内存代表着一个引用。这种定义有些狭隘,一个对象在这种定义下只有被引用或者没有被引用两种状态。
    我们希望能描述这一类对象: 当内存空间还足够时,则能保存在内存中;如果内存空间在进行垃圾回收后还是非常紧张,则可以抛弃这些对象。很多系统中的缓存对象都符合这样的场景。
  • 强引用(StrongReference)
    当我们使用 new 这个关键字创建对象时创建出来的对象就是强引用。
    当jvm内存不足时,具备强引用的对象,虚拟机宁可会抛出OutOfMemoryError(内存空间不足),使程序终止,也不会靠垃圾回收器去回收该对象来解决内存。
  • 软引用(SoftReference)
    如果内存空间不足,就会回收这些对象。
    软引用可用来实现内存敏感的高速缓存。
  • 弱引用(WeakReference)
    在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。
  • 虚引用(PhantomReference)
    如果一个对象仅持有 虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。
    虚引用主要用来跟踪对象被垃圾回收器回收的活动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值