zoukankan      html  css  js  c++  java
  • 什么情况下JVM内存中的一个对象会被垃圾回收?

    新生代满了会触发 Young GC,老年代满了会触发 Old GC。GC时会回收对象,那么具体是什么样的对象会被垃圾回收器回收呢?

    可达性分析算法,判断是否被 GC Roots 引用
    判断引用类型:强引用、软引用、弱引用、虚引用
    是否调用finialize()方法自救
    首先,JVM 会通过可达性分析算法来判断哪些对象会被回收,哪些不会被回收。可达性分析算法会从一个对象触发,一层层向上,分析有谁在引用它,看是否有一个 GC Roots。

    被 GC Roots 引用的对象就不会被垃圾回收。GC Roots 指的是局部变量,或者类的静态变量。具体可以看这篇文章:什么是被 GC Roots 直接引用的对象?。

    其次,看引用类型。Java中有强引用、软引用、弱引用和虚引用:

    强引用,被强引用的对象不会被回收
    软引用,被软引用的对象一般并不会被回收,GC之后内存任然不够会被回收
    弱引用,弱引用就像没有被引用,GC时直接回收
    虚引用,很少用到需引用,可以忽略
    所以总的来说:

    有 GC Roots 的对象不能回收,没有 GC Roots 的对象可以回收
    有 GC Roots 的对象,如果是软引用或者弱引用,也有可能被回收
    最后,一个对象没有被 GC Roots 引用,是否立即就会被回收呢?

    也不一定立即被回收,该类可以重写finialize()方法,在finialize()中让一个 GC Roots 重新引用这个对象,就能自救。

    转载:https://blog.csdn.net/shuiCSDN/article/details/104146295

               Java常见的GC Root

  • 相关阅读:
    隐私政策
    常用SQL语句总结
    C++读写配置项
    GridControl中事件
    DEV ListBoxControl
    DEV LookUpEdit 下拉框
    DataTable GridControl 数据结构
    django + celery + channels.websocket 异步任务
    微信消息推送,获取access_token时AppSecret错误或者access_token无效 invalid credential, access_token is invalid or not latest rid
    sqlserver 表生成实体类
  • 原文地址:https://www.cnblogs.com/brithToSpring/p/13328332.html
Copyright © 2011-2022 走看看