zoukankan      html  css  js  c++  java
  • JVM对象存活判断方法

    一、GC主要针对什么区域

      1. 程序计数器、虚拟机栈、本地方法栈,3个部分随线程而生死。每个栈桢分配多少内存基本上是在类结构确定下来时就已确定,大体上可认为是 编译期可知

      2. 而 堆 和 方法区 则不一定,如一个接口多个实现类需要内存不一样,一个方法多个分支需要分配内存也不一样;这些只有一实现运行中才能得知会创建那些对象,这部分内存的分配 和 回收 都是动态的。GC主要关注的也是这两个部分。

    二、对象的“存活”:

      1、引用计数法:在各个对象中添加一个引用计数器。

        a. 实现简单,判定效率高;

        b. 但主流JVM没有用这个方法来判定;主要因为它很难解决对象间的相互循环引用问题。

      2、可达性分析算法:

        a. 主流的程序语言使用的方法。

        b. 通过GC Roots的对象作作为起点,从这些起点向下去搜索,所走过的路径叫做引用链,当一个对象到GC Roots没有任何引用链连接时,则证明此对象不可达。

        c. 可作为GC Roots的对象:

          1. 方法区中类静态属性、常量引用的对象;(Static修饰)

          2. 虚拟机栈、本地方法栈中引用的对象;

    三、最终判定对象是否被回收:

      在可达性分析算法中不可达的对象,也并非就判定为“死亡”了;判定一个对象最终是否死亡,至少经历两次标记过程:

        1. 不可达的对象会被 第一次标记

        2. 被第一次标记的对象进行 判断是否有必要执行finalize(),若对象覆盖了finalize()方法 且 finalize() 没有执行过,若都满足则执行finalize();

        3. 在finalize()中,若对象重新和引用链上的任一对象建立关联,则不会被第二次标记,它则不会被回收。

  • 相关阅读:
    Leetcode Reverse Words in a String
    topcoder SRM 619 DIV2 GoodCompanyDivTwo
    topcoder SRM 618 DIV2 MovingRooksDiv2
    topcoder SRM 618 DIV2 WritingWords
    topcoder SRM 618 DIV2 LongWordsDiv2
    Zepto Code Rush 2014 A. Feed with Candy
    Zepto Code Rush 2014 B
    Codeforces Round #245 (Div. 2) B
    Codeforces Round #245 (Div. 2) A
    Codeforces Round #247 (Div. 2) B
  • 原文地址:https://www.cnblogs.com/mzzcy/p/7048950.html
Copyright © 2011-2022 走看看