JVM-垃圾回收

  1. 垃圾 ——运行程序中没有任何指针指向的对象
  2. GC——垃圾回收
  3. 回收关心区域——方法区(元空间)、堆(重点)

引用计数算法

  1. 对每一个对象保存一个整型的引用计数器属性,用于记录对象被引用的情况。引用增加计数起加一,引用失效计数器失效。当对象引用树为0时,则表示对象可回收。
  2. 优点:实现简单,判定效率高,回收没有延迟性。
  3. 缺点:
  • 需要单独的计数器,增加了存储空间开销
  • 每次引用都需要更新计数器,增加了时间开销
  • 致命问题:无法处理循环引用的问题,导致内存泄露问题

循环引用问题—— 对象 A 和 B 互相引用,但是A、B没有其他任何对象引用。导致其他回收不了。

内存泄露——无用对象却无法回收导致内存泄露

可达性分析--java中使用的

  1. 以更对象集合(GC Roots)为起始点,搜索根对象所连接的目标对象是否可达。搜索的路径称为引用链,对象没有任何引用链相连则是不可达,可标记为了垃圾对象。
  2. 解决循环引用问题
  3. GC Roots包括元素
  • 虚拟机栈中引用的对象:各个线程被调用的方法中使用到的参数、局部变量等
  • 本地方法中引用的对象
  • 方法区中类静态属性引用的对象:java类的引用类型静态变量
  • 方法区中常量引用对象:字符串常量池中的引用
  • 被同步锁synchronize持有的对象
  • java虚拟机内部的引用:基本数据类型对应的class对象,系统类加载器
  • 反映java虚拟机内部情况JMXBean、JVMTI中注册的问题、本地代码缓存等

对象的finalization机制

  1.  机制允许开发人员在对象被销毁之前进行自动定义处理逻辑。
  2. 回收对象前 总会先调用对象的finalize()方法。
  3. finalize()方法允许在子类中被重写,用于在对象被回收时进行资源释放。
  4. 不要主动调用finalize()   
  • 可能导致对象的复活
  • 方式执行的时间没有保障,由GC线程控制,不发生GC则finalize()方法将没有机会执行
  • 糟糕的finalize()会影响GC 的性能

finalize()方法影响对象状态的三种状态   

  • 可触及的 -- GC Roots  可到达的
  • 可复活的 -- GC Roots  不可到达,但对象可能在finaliza()方法中复活,finalize()方法只能执行一次 所以对象只能复活一次。
  • 不可触及的 -- finaliza()方法中没有符合

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值