JVM学习笔记11

70 阅读1分钟

GC概述

判断对象是否存活的方法:

引用计数算法:

在对象中添加一个引用计数器,每当有地方引用该对象时就加一,当引用失效时就减一。计数器为零的对象即为死对象。

缺陷:

有很多例外的情况要考虑,例如对象之间的相互循环引用。

可达性分析算法:

从GC Roots到这个对象不可达,则说明此对象是死的。

可作为GC Roots的对象包含以下几种:

  • 虚拟机栈中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法去中常量引用的对象
  • 本地方法栈中引用的对象
  • JVM虚拟机内部的引用(基本数据类型对应的Class对象,常驻的异常对象,系统类加载器等)
  • 所有被同步锁持有的对象(synchronized关键字)
  • JMXBean等

引用

JDK1.2之后,将引用分为强引用,软引用,弱引用,虚引用。

强引用:传统的引用赋值。只要强引用关系还在,GC永不会回收被引用的对象。

软引用:软引用对象,由垃圾收集器根据内存需求自行清除。软引用最常用于实现                  对内存敏感的缓存。

弱引用:弱引用对象的存在不会阻止它所指向的对象被垃圾回收器回收。弱引用最常见的用途  是实现规范映射(canonicalizing mappings,比如哈希表)。

虚引用:唯一目的是在这个对象被GC回收时收到一个系统通知。

finalize方法

任何一个对象的finalize方法只会被系统调用一次。

不建议使用finalize方法,代价高,不确定性大。