判定对象是否存活的算法----GC_ROOT算法

要应用GC_ROOT算法,判定某个对象是否会被回收,关键是要确定root。确定root之后,你就可以根据代码绘制可达链,从而就可以进行分析了,分析哪些对象会被泄漏,哪些对象会被回收,如果GC执行的时候。
可以作为root的对象:
1.类中的静态变量,当它持有一个指向一个对象的引用时,它就作为root
2.活动着的线程,可以作为root
3.一个Java方法的参数或者该方法中的局部变量,这两种对象可以作为root
4.JNI方法中的局部变量或者参数,这两种对象可以作为root
其它。
其中:第1种是类的类型信息,加载在方法区中;第3种,是存放在虚拟机栈的栈帧中,一个线程调用一个java方法,java虚拟机就会使用一个栈帧保存该方法的调用状态,该栈帧入栈到该线程所对应的虚拟机栈中;第4种,是存放在一个线程的本地栈中。
例子:下述的Something和Apple都可以作为root对象。
public AClass{
public static Something;
public static final Apple;
''''''
}
Java方法的参数和方法中的局部变量,可以作为root.
public Aclass{
public void doSomething(Object A)
{
ObjectB b = new ObjectB;
}
}
//某个线程执行该方法时,参数A可以作为root;
// 局部变量b,也可以作为参数。
-------------------------------------------------我是分割线--------------------------------------------------------------------------------------------
//参考资料:
http://www.yourkit.com/docs/80/help/gc_roots.jsp
http://www.cnblogs.com/zuoxiaolong/p/jvm3.html
GC roots
The so-called GC (Garbage Collector) roots are objects special for garbage collector. Garbage collector collects those objects that are not GC roots and are not accessible by references from GC roots.
There are several kinds of GC roots. One object can belong to more than one kind of root. The root kinds are:
- Class - class loaded by system class loader. Such classes can never be unloaded. They can hold objects via static fields. Please note that classes loaded by custom class loaders are not roots, unless corresponding instances of
java.lang.Classhappen to be roots of other kind(s). - Thread - live thread
- Stack Local - local variable or parameter of Java method
- JNI Local - local variable or parameter of JNI method
- JNI Global - global JNI reference
- Monitor Used - objects used as a monitor for synchronization
- Held by JVM - objects held from garbage collection by JVM for its purposes. Actually the list of such objects depends on JVM implementation. Possible known cases are: the system class loader, a few important exception classes which the JVM knows about, a few pre-allocated objects for exception handling, and custom class loaders when they are in the process of loading classes. Unfortunately, JVM provides absolutely no additional detail for such objects. Thus it is up to the analyst to decide to which case a certain "Held by JVM" belongs.
If an object is a root, it is specially marked in all views showing individual objects. For example, the following picture shows a fragment of paths view:

判定对象是否存活的算法----GC_ROOT算法的更多相关文章
- JVM的分区+查看GC对象是否存活+3种GC算法+7种垃圾收集器+如何减少GC次数
一.JVM的分区: 1.程序计数器(私有) 程序计数器是一块较小的内存分区,你可以把它看做当前线程所执行的字节码的指示器. 在虚拟机的概念模型里,字节码解释器工作时,就是通过改变计数器的值来选择下 ...
- Java虚拟机对象存活标记及垃圾收集算法解析
一.对象存活标记 1. 引用计数算法 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器就加1:当引用失效时,计数器就减1:任何时刻计数器都为0的对象就是不可能再被使用的. 引用计数算法(Re ...
- Java虚拟机学习笔记(二)--- 判断对象是否存活
Java堆中存放着所有的对象实例,垃圾收集器在堆进行回收之前,需要判断对象是“存活”还是“死亡”(即不可能再被任何途径引用的对象). 最常见的一种判断对象是否存活算法是引用计数算法, 给对象加一个引用 ...
- Java虚拟机判定对象存活算法
1.引用计数算法 描述:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器值为0的对象就是不可能再被使用的. 特点:实现简单,判定效率高. ...
- JVM中判断对象是否存活的方法
Java中几乎所有的对象实例都存放在堆中,在垃圾收集器对堆内存进行回收前,第一件事情就是要确定哪些对象还“存活”,哪些对象已经“死去”(即不可能再通过任何途径被使用). 引用计数算法 首先需要声明,至 ...
- JVM:垃圾收集器与对象的"存活"问题
垃圾收集器垃圾收集(Garbage Collection,GC).当需要排查各种内存溢出.内存泄露问题时,当垃圾收集成为系统更高并发量的瓶颈时,我们需要去了解GC和内存分配. 检查对象的"存 ...
- java虚拟机判断对象是否存活的方式
引用计数算法: 给对象添加一个引用计数器,每当有地方应用时,计数器值就加一,当引用失效时,程序计数器就减一,只要引用计数器的值为零时,就表示对象不可能再被引用,例如微软的 component ob ...
- 重新想象 Windows 8 Store Apps (31) - 加密解密: 哈希算法, 对称算法
原文:重新想象 Windows 8 Store Apps (31) - 加密解密: 哈希算法, 对称算法 [源码下载] 重新想象 Windows 8 Store Apps (31) - 加密解密: 哈 ...
- 变易算法 - STL算法
欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/mutating-algorithms.h ...
随机推荐
- js中斜杠转义
js中“/”不需要转义. if(myPath.indexOf("/Upload/EmailFile/")!=-1){ alert("有附件!")}
- SpringMVC拦截器实现登录认证(转发)
感谢原作者,转发自:http://blog.csdn.net/u014427391/article/details/51419521 以Demo的形式讲诉拦截器的使用 项目结构如图: 需要的jar:有 ...
- ACM 第二天
A - Mishka and Contest Mishka started participating in a programming contest. There are n problems i ...
- 《剑指offer》---丑数
本文算法使用python3实现 1. 问题1 1.1 题目描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).判断一个数是否是丑数. 时间限制:1s:空间限制:32768K ...
- iOS如何做出炫酷的翻页效果
详情链接http://www.jianshu.com/p/b6dc2595cc3e https://github.com/schneiderandre/popping
- cacti 添加redis监控(远程服务器)
监控主机 192.168.24.69 ,以下用A表示 被监控主机 192.168.24.79,以下用B标识 记得在A服务器的cacti中导入监控mysql的templates文件 拷贝ss_get ...
- Python基础教程系列目录,最全的Python入门系列教程!
Python是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. 在现在的工作及开发当中,Python的使用越来越广泛,为了方便大家的学习,Linux大学 特推出了 <Python基 ...
- MATLAB中的randi函数
randi Pseudorandom integers from a uniform discrete distribution.来自一个均匀离散分布的伪随机整数 R = randi(IMAX,N) ...
- RT-thread内核之线程调度器
一.前言 RT-Thread中提供的线程调度器是基于全抢占式优先级的调度,在系统中除了中断处理函数.调度器上锁部分的代码和禁止中断的代码是不可抢占的之外,系统的其他部分都是可以抢占的,包括线程调度器自 ...
- winform全局异常捕获
/// <summary> /// 应用程序的主入口点. /// </summary> public static ApplicationContext context; [S ...