回顾上期

1)JVM中引用存在哪里?

答:虚拟机栈,该内存空间线程独有

2)该引用的对象存在哪里?

答:堆,所有通过new方法分配的对象都存在堆中

3)String s1="abc",字符串"abc"存在哪里?
答:运行时常量池,且常量池每次存储对象时会查找是否存过相等的对象,如果有,直接引用指向它,不再开辟空间。

如果你三个问题都可以回答出来,恭喜你!上一篇的精髓你get到了~~~~

引用的分类

1) 强引用,默认分配方式均为此类型

Object a=new Object();

2) 软引用,以强引用为参数,构造弱引用

Object a=new Object();
SoftReference<Object> b=new SoftReference<Object>(a);
a=null; //强引用a一定要断掉
System.out.println(b.get()); //通过get()方法返回对象

3) 弱引用

Object a=new Object();
WeakReference<Object> b=new WeakReference<Object>(a);
a=null; //强引用a一定要断掉
System.out.println(b.get()); //通过get()方法返回对象
System.gc();

4)幽灵引用,和没有引用是一样的

引用的特点

1)有强引用指向的对象不会被垃圾回收

2)软引用指向的对象在堆的空间不够时被回收

3)只要系统执行垃圾回收,就会回收软引用

从上面三点中,我们总结出垃圾回收是也是JVM中的一个线程,每执行一次,都要检查对象有没有强引用指向

如果没有再依次考虑软引用和弱引用

那么怎么检查呢?

代码分析

垃圾回收检查算法

1) 计数分析

每个对象,都给一个计数器,每增加一个强引用,就把计数器+1,如果当前计数器的值为0,就回收

思路很简单,但是会发生问题

Object a = new Object(); // a的引用计数为1
Object b = new Object(); // b的引用计数为1
 
a.next = b; // b的引用计数为2
b.next = a; // a的引用计数为2
 
a = null; // a的引用计数为1,尽管已经显示地将a赋值为null,但是由于引用计数为1,GC无法回收a
b = null; // b的引用计数为1,同理,GC也不回收b

2) 可达性分析

从GC Root往下搜索,如果该对象是可达的,找到到达该对象的最短路径

最短路径中的强度最弱的引用,决定了该对象是否被回收,如:

GC Root-(弱引用)->1对象-(强引用)->5对象

那么上述两个对象都是要被回收的

另外:GC Root 是什么?一些特殊的对象

虚拟机栈(栈帧中的本地变量表)中引用的对象,往往是方法中的一些简单类型变量

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

最新文章

  1. linux /proc/meminfo 文件分析(转载)
  2. hdoj 1022 Train Problem I
  3. qrcodenet 代码中一些基础的认识 帮助
  4. IOKit找不到问题定义
  5. Codeforces Round #112 (Div. 2)
  6. eclipse--解决Android模拟器端口被占用问题的办法
  7. POJ 1773 Parity game 带权并查集
  8. C# Dictionary 字典
  9. 就这样CSDN账号被人盗了??
  10. {java学习}[第一章]软件开发概述(2017.1.11).
  11. NavigationController的返回按钮自定义
  12. Failed to start Vsftpd ftp daemon错误
  13. JavaWeb 之Ubuntu intelliJ 新建maven项目及配置tomcat
  14. apache开启重写模式
  15. 斐波那契数列(NOIP1997)
  16. python-标识符(Identifiers)和关键字(keywords)
  17. java的HashMap 原理
  18. python 简明教程
  19. 20155215 2016-2017-2 《Java程序设计》第10周学习总结
  20. BZOJ 3437: 小P的牧场

热门文章

  1. Redis详解(二)——AOF
  2. 「POJ1147」The Buses
  3. 0. GC 前置知识
  4. php 打印格式化显示利器 &lt;pre&gt;
  5. 常用keycode列表
  6. 吴裕雄--天生自然JAVAIO操作学习笔记:RandomAccessFile
  7. Mac 终端启动AVD模拟器
  8. 使用JMX连接JVM
  9. ROS常用库(五)navigation之Tutorials
  10. C++编程学习(十二) STL