Java GC 判断对象是否存活

作者: LightDreams | 来源:发表于2017-04-06 17:29 被阅读133次

Java对象是否存活的判断算法——根搜索算法。
这个算法的思路其实很简单,它把内存中的每一个对象都看作一个节点,并且定义了一些对象作为根节点“GC Roots”。如果一个对象中有另一个对象的引用,那么就认为第一个对象有一条指向第二个对象的边,如下图所示。JVM会起一个线程从所有的GC Roots开始往下遍历,当遍历完之后如果发现有一些对象不可到达,那么就认为这些对象已经没有用了,需要被回收。

Paste_Image.png

四种作为GC Roots的对象==>
1、虚拟机栈中的引用的对象,我们在程序中正常创建一个对象,对象会在堆上开辟一块空间,同时会将这块空间的地址作为引用保存到虚拟机栈中,如果对象生命周期结束了,那么引用就会从虚拟机栈中出栈,因此如果在虚拟机栈中有引用,就说明这个对象还是有用的,这种情况是最常见的。
2、我们在类中定义了全局的静态的对象,也就是使用了static关键字,由于虚拟机栈是线程私有的,所以这种对象的引用会保存在共有的方法区中,显然将方法区中的静态引用作为GC Roots是必须的。
3、常量引用,就是使用了static final关键字,由于这种引用初始化之后不会修改,所以方法区常量池里的引用的对象也应该作为GC Roots。
4、使用JNI技术时,有时候单纯的Java代码并不能满足我们的需求,我们可能需要在Java中调用C或C++的代码,因此会使用native方法,JVM内存中专门有一块本地方法栈,用来保存这些对象的引用,所以本地方法栈中引用的对象也会被作为GC Roots。

相关文章

  • Java GC 判断对象是否存活

    Java对象是否存活的判断算法——根搜索算法。这个算法的思路其实很简单,它把内存中的每一个对象都看作一个节点,并且...

  • GC算法

    主要关注点: 对象存活判断 GC算法 垃圾回收器 对象存活判断 判断对象是否存活一般有两种方式: 引用计数:每个对...

  • JVM引用

    Java 执行GC判断对象是否存活有两种方式其中一种是引用计数 引用计数概念:JAVA Heap(堆)中每个对象有...

  • Java GC 判断对象是否存活(转)

    几个疑问: 栈区:也叫java虚拟机栈,是由一个一个的栈帧组成的后进先出的栈式结构,栈桢中存放方法运行时产生的局部...

  • Java内存模型

    本文主要介绍 1.Java虚拟机内存区域 2.判断对象是否存活算法 3.GC算法 一.Java虚拟机内存区域划分 ...

  • 二、垃圾收集器与内存分配策略

    一、Java采用可达性算法 虚拟机采用可达性分析来判断对象是否存活的。 它们已GC root对象为起点,向下搜索所...

  • JVM - GC垃圾回收

    注:可达性分析法(判断对象是否存活):当一个对象到GC Roots没有任何引用链相连时。GC Roots对象:虚拟...

  • Java的强引用、软引用、弱引用和虚引用

    前言 Java执行GC判断对象是否存活有两种方式,其中一种是:引用计数。 引用计数:Java堆中每一个对象都有一个...

  • Java 强/软/弱/虚引用

    前言 Java执行GC判断对象是否存活有两种方式其中一种是引用计数。 引用计数:Java堆中每一个对象都有一个引用...

  • 深入理解JVM之垃圾收集器与内存分配策略

    概述 思考GC需要完成的3件事: 回顾第二章Java内存运行时各个区域的划分: 对象已死吗? 判断对象是否存活的方...

网友评论

    本文标题:Java GC 判断对象是否存活

    本文链接:https://www.haomeiwen.com/subject/tqpqattx.html