JVM学习(2)--垃圾收集器

垃圾收集,也就是GC,GC过程中需要考虑三件事:
1、收集什么?(哪些内存需要收集)
2、何时回收?(什么时候进行收集)
3、如何回收?(通过什么方法回收)
下面内容是对这三点的一些总结。

一、收集什么?
哪些内存需要回收呢?一句话,死去的对象占用的内存需要回收。死去的对象也就是,不能再被任何途径使用的对象。

1、判断对象是否存活
1)引用计数法
给对象分配一个引用计数器,当对象被引用一次,计数器加1;引用失效,计数器-1,当GC时,对象的计数器为0,则代表对象没有被引用。
优点:实现简单,效率高。
缺点:无法解决对象间相互循环引用的问题,主流jvm没有使用该算法。

2)可达性分析算法
通过一系列的GC Roots的对象为起始点,开始往下搜索,搜索搜过的路径成为引用链(Reference Chain),当一个对象到GC Roots之前没有任何引用链,则说明对象不可用,可回收。
可达性分析算法
什么对象可以作为GC Roots呢?
● 虚拟机栈中引用的对象
● 方法区中静态变量引用的对象
● 方法区中常量引用的对象
● 本地方法中JNI(即Native方法)引用的对象

3)引用
前面两种方式依赖的都是对象的引用,那么什么是引用?
传统定义:如果reference类型的数据中的值指向的是另一个内存地址,就成为这块内存代表一个引用。
jdk1.2补充了引用的概念
● 强引用(Strong Reference):类似 Object a = new Object() 的引用,只要强引用还存在,这些对象不会被GC掉。
● 软引用(Soft Reference):描述一些有用但又非必须的引用,在即将发生内存溢出之前,会把存在软引用的对象列进GC范围之中进行第二次回收。如果这次GC任然不够内存,则抛出内存溢出异常。(备胎)
● 弱引用(Weak Reference):也是描述非必须对象,被弱引用关联的对象,只能存活到下一次GC之前,当发生GC时,无论内存是否足够,这些对象都会被回收掉。
● 虚引用(Phantom Reference):虚引用不会对对象的生存时间造成影响,也无法通过一个虚引用去获取一个对象,为对象加上虚引用的目的只是为了在对象被GC时收到一个系统的通知。

2、对象生死判定
上面通过可达性分析,判断一个对象是否满足执行死刑的要求,如果达到,则表示这个对象已经进入死缓时期,但是,并不代表进入死缓,对象就必死,对象判定为死亡需要进行两次标记。
1)虚拟机进行可达性分析时进行第一次标记。
2)第一次标记之后,进行一次筛选,筛选条件是,对象是否有必要执行finalize()方法。
3)如果对象没有覆盖finalize()方法,或者虚拟机已经执行过该方法,则视为 没有必要执行finalize()方法。
4)当对象被确定为有必要执行finalize()方法时,虚拟机将对象放到F-Queue队列中,循环执行finalize()方法。
5)队列执行完毕,进行第二次标记,依然使用可达性分析,也就是说,在第二次标记之前,如果一个对象在finalize()方法中自救了自己,将自己赋值为某一个变量,关联上引用关系,则第二次标记将不会生效,对象也将不被回收。
● 注意的地方时是,一个对象的finalize()方法,系统只会执行一次。

3、方法区的回收
方法区存放的是,静态变量,常量,类信息等,回收价值低,HotSpot虚拟机会回收这块区域。
主要回收的东西是:废弃常量以及无用的类。

1)废弃常量:可以理解,假设有个常量”abc”,整个系统中没有哪一个变量引用到了这个常量,则这个常量也就废弃了,被清理出常量池,将会被虚拟机回收掉。常量池中的其他类、方法、字段的符号引用也与此类似。

3)无用的类
什么是无用的类:
● 该类所有的实例已经被回收了,也就是在Java堆中不存在该类的任何实例。
● 该类的类加载器ClassLoader已经被回收了。
● 该类对应的java.lang.Class对象没有在任何地方引用,无法通过反射访问该类的方法。
满足上述条件的类将会被GC掉。

二、怎么回收(垃圾回收算法)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值