• JVM(3)--垃圾回收前对象已死的判断


    在堆里面存放着几乎所有的对象实例,堆也是垃圾回收的主要区域,那么要怎么判断哪些对象可回收,哪些不可回收呢。

    下面有两个判断的算法,引用计数算法,可达性分析算法

    (1)引用计数算法:在对象中添加一个计数器。每当有地方引用它时,计数器加一,引用失效时减一。在任何时候计数器为0的对象就是可回收对象。

    但是这个算法有一个问题,当对象之间互相引用,计数器永不为0,也就没办法进行判断了。

    虚拟机并不通过此算法进行判断。

    (2)可达性分析算法:通过一系列成为“GCRoots”的对象,向下搜索,搜索所走过的路线成为引用链。若是一个对象无法通过任何引用链和GCRoots相连接,则说明该对象不可达。

    在Java中,可被作为GCRoots的对象有以下几种

    1.虚拟机栈中引用的对象

    2.方法区中静态属性引用的对象

    3.方法区中常量引用的对象

    4.本地方法栈中引用的对象

    当一个对象标记为不可达时,并不一定会被回收,还有一次拯救自己的机会。在第一次判断中发现对象不可达,对对象进行第一次标记,如果对象有重写finalize()方法,并且在方法里面让自己可达,则对象可以不被清理,否则其他任意情况在第二次可达性分析判断中被清理。

    在方法区中,也是有垃圾回收的。特别是在大量使用反射,动态代理等场景中,虚拟机必须具有卸载类的能力,可以通过JVM参数进行控制。

  • 相关阅读:
    javaWeb快速入门+——初体验-HelloWorld
    简单理解Linux系统的挂载是什么鬼
    STM32MP157 Cortex®-M4高性能系列MCU
    常见六种锂电池特性及参数对比
    IIC通信详解
    stm32微秒延时问题
    STM32 HAL库实现微秒级别延时
    开关电源波纹的产生、测量及抑制
    图解DIY 1pA超微电流测试器
    stm32
  • 原文地址:https://www.cnblogs.com/blogofjzq/p/9396871.html
Copyright © 2020-2023  润新知