在堆中存放着Java世界中几乎所有的对象的实例,垃圾收集器在对堆进行垃圾回收前,第一件事情就是要确定这些对象中还有那些是"存活"着,那些已经死去(即不能再被任何途径使用的对象)。

  引用计数算法(Reference Counting)

    定义:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器就加1;当引用失效时,计数值就减1;任何时刻计数器为0的对象就是不可能再被使用的。

    优点:实现简单,判断效率高

    应用案例:微软公司的COM(Component Objcect Model)技术、使用ActionScript 3的FlashPlayer、Python语言和在游戏脚本领域被广泛应用的Squirrel中都使用了引用计数算法进行内存管理

    但是,至少主流的Java虚拟机里面没有选用引用计数法来管理内存,最主要原因是它很难解决对象之间相互引用的问题。

public class ReferenceCounting {
public Object instance = null;
private static final int _1MB = 1024 * 1024;
/**
* 占用内存,以便在GC中观察
*/
private byte[] bigSize = new byte[2 * _1MB]; /**
* -XX:+PrintGCDetails 输出GC的详细日志
* @param args
*/
public static void main(String[] args) {
ReferenceCounting objA = new ReferenceCounting();
ReferenceCounting objB = new ReferenceCounting();
objA.instance = objB;
objB.instance = objA;
objA = null;
objB = null;
// 设置GC
System.gc();
}
}

    可达性分析算法(Reachability Analysis)

      定义:通过一系列称为"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径称为"引用链",当一个对象到GC Roots没有任何引用链相连时,则证明此对象不可用。

    

      优点:解决引用计数法无法解决的对象相互调用问题

      缺点:寻找GC Roots   ->枚举根节点

      应用案例:Java、C#、Lisp

      在Java语言中,可作为GC Roots的对象包括下面几种:

        虚拟机栈(栈帧中的本地变量表)中引用的对象

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

        方法区中常量引用的对象

        本地方法栈(即Native方法)引用的对象

    枚举根节点

      项目中的GC Roots动辄上百兆,要逐个检查里面的引用,势必消耗很多时间

      在分析阶段 ->要保证“一致性” 即在整个分析期间,整个执行系统看起来就像被冻住在某个时间点上(Stop The World),不可以出现分析过程中对象引用关系还在不断变化的情况,该点不满足的话分析结果准确性就无法得到保证。

      OopMap:待续

      安全点:待续

      安全区域:待续

最新文章

  1. ASP.NET Core 中文文档 第三章 原理(5)错误处理
  2. f(n) hdu 2582
  3. WPF学习笔记1---初接触
  4. Eclipse的SVN插件下载
  5. Java web中为什么要用Service接口和DAO接口?
  6. 学习java第二天
  7. hdu 3123
  8. Codeforces Gym 100513D D. Data Center 前缀和 排序
  9. JS中for循环里面的闭包问题的原因及解决办法
  10. Spring与Hibernate整合中,使用OpenSessionInViewFilter后出现sessionFactory未注入问题
  11. CSS3+HTML5特效9 - 简单的时钟
  12. js 利用iframe和location.hash跨域解决的方法,java图片上传回调JS函数跨域
  13. [置顶] 使用sping AOP 操作日志管理
  14. IntelliJ IDEA 源值1.5已过时,将在未来所有版本中删除
  15. python3使用pymysql库连接MySQL的常用操作
  16. Entity Framework 5.0.0 Function Import 以及 ODP. NET Implicit REF CURSOR Binding使用简介
  17. javaScript事件系统详解
  18. 容易掉坑的地方The value for the useBean class attribute XXX is invalid
  19. Jenkins与Git持续集成&&Linux上远程部署Java项目
  20. msdn 中MethodBase.Invoke 方法 介绍中的坑

热门文章

  1. 北理工机器人队RM视觉组ubuntu必备软件安装指南
  2. Flask应用启动流程
  3. 了解MySQL
  4. 1 Ubuntu 破解帐户密码
  5. 结对编程作业(java实现)
  6. notepad++ 设置运行python脚本
  7. MySQL数据库(二)--库相关操作、表相关操作(1)、存储引擎、数据类型
  8. wordpress中文目录出现“有点尴尬诶!该页无法显示"
  9. 【Linux】文件拷贝-Linux当前目录所有文件移动到上一级目录(转)
  10. LeetCode 987. Vertical Order Traversal of a Binary Tree