GCRoots与可达性分析

Java中的四种引用

强引用、软引用、弱引用、虚引用。这四种引用的强度是逐渐减弱的,JVM垃圾回收的力度是逐渐增强的。

四种引用的作用

1、可以让程序员通过代码来控制对象的生命周期

2、有利于JVM判断哪些引用是否回收。

强引用

Object object =new Object();
String str ="hello";

强引用有引用变量回收时,永远不会被垃圾回收器回收。如果内存不足,JVM宁愿抛出OOM错误也不会回收这种对象。

如果想中断强引用,可以显示的将引用赋值为null;Vector的clear方法即是如此

软引用

1. MyObject aRef = new  MyObject();
2. SoftReference aSoftRef=new SoftReference(aRef);

如果一个对象具有软引用,内存空间足够,垃圾回收器就不会回收。不足就会回收。

弱引用

 WeakReference<People>reference=new WeakReference<People(new People("zhouqian",20));

当JVM进行垃圾回收时,无论内存是否充足都会回收弱引用。

虚引用:需引用任何时候都有可能被垃圾回收期回收。

ReferenceQueue<String> queue = new ReferenceQueue<String>();
PhantomReference<String> pr = new PhantomReference<String>(new String("hello"), queue);

Java引用与可达性分析



如图所示:1和2是强引用,4是软引用,6是弱引用。对对象5的引用判断:1和4这条引用链选取最弱的引用,4是最弱的,则1-4引用链是软引用;2和6这条引用链,6是最弱的,则2-6是弱引用,那么在1-4和2-6引用链中选取最强的引用,对象5的引用为软引用。

再谈GC Roots对象

1、虚拟机栈(栈帧局部变量)引用的对象作为GC Roots

	public static void method01() {
TestGCRoots01 t = new TestGCRoots01();
System.gc();
System.out.println("第一次GC完成");
}

t为局部变量,new出了一个对象,作为GC Roots。只要method1方法运行,t就不会消失,直到方法运行完栈帧出站,不再有指针指向该对象,那么该对象就会被垃圾回收。

2、方法区中的静态变量引用的对象

private static int _10MB = 10 * 1024 * 1024;
private static TestGCRoots02 t;
public static void main(String[] args) {
TestGCRoots02 t2 = new TestGCRoots02(4 * _10MB);
t2.t = new TestGCRoots02(8 * _10MB);
t2 = null;
System.gc();
}

t作为静态变量,引用的对象不会被回收,t2被置为null,引用的对象会被回收

3、方法区中常量引用对象

private static final TestGCRoots03 t = new TestGCRoots03(8 * _10MB);

t为常量,只被final修饰的常量会被回收,被static final修饰的不会被回收。

最新文章

  1. 轮播插件unsilder 源码解析(二)
  2. QT 文件对话框(QFileDialog)
  3. hibernate基础之无法自动创建表总结
  4. Java中2+2==5解读
  5. js/jquery的应用
  6. JVM调优总结 -Xms -Xmx -Xmn -Xss
  7. STM32向量表详细分析
  8. 做技术最自由,在IT最幸福!
  9. Get IP Address in Android 4.0+
  10. strcat函数的使用需要注意的问题
  11. Yii 如何渲染另一控制器中的视图。
  12. vmware克隆centos6.5 导致 system eth0 不可用解决办法
  13. html特殊符号列表
  14. 动态修改UINavigationBar的背景色
  15. 蓝牙门禁Android客户端
  16. springmvc基础学习3---注解简单理解
  17. Programming In Scala笔记-第六章、函数式对象
  18. 【题解】狼抓兔子—BZOJ1001。
  19. SVM探讨
  20. UML 图C#

热门文章

  1. 闪回之 Flashback Query (dml表、过程、函数、包等)、Flashback version Query
  2. IHE-PIX 备注
  3. 搭建Node+NPM+Grunt+Ruby开发环境
  4. MAF框架的使用限制
  5. 《Java多线程编程核心技术》读后感(十八)
  6. Jodd发送邮件
  7. Unicode编码下字符串转换
  8. java接口中成员变量和方法的默认修饰符(转)
  9. python 模拟事件触发机制
  10. SpringBoot2.0 基础案例(12):基于转账案例,演示事务管理操作