前言:以下相关内容多为图片,参考链接、附上少量文字解释,以便整理脉络,以作复习巩固之用。若需详细了解,请查阅相关资料或者观看相关课程。如有错误,敬请指出,谢谢。
参考链接:《剑指Java面试-Offer直通车》–Java底层知识GC
一、垃圾回收之标记算法
对象被判定为垃圾的标准:
没有被任何对象引用的情况下,对于系统而言就是垃圾,占据的内存就要被释放,此对象也会被销毁。
判定对象不被引用的方法:
1)引用计数算法;
2)可达性分析算法
引用计数算法
通过判断对象的引用数量来决定对象是否可以被回收。
可达性分析算法
通过判断对象的引用链是否可达来决定对象是否可以被回收。
注:GC Root
二、回收算法
1、标记-清除算法(Mark and Sweep)
从根集合进行扫描
2、复制算法(copying)
分为对象面和空闲面
3、标记-整理算法(Compacting)
标记、整理(移动,就不需要考虑分一半)、回收
4、分代收集算法(Generational Collector)
注:
参考链接:JVM内存区域详解(Eden Space、Survivor Space、Old Gen、Code Cache和Perm Gen)
To Survivor 和 From Survivor的标记会互换,始终保证一个survivor是空的
1、Eden Space字面意思是伊甸园,对象被创建的时候首先放到这个区域,进行垃圾回收后,不能
2、被回收的对象被放入到空的survivor区域。
3、Survivor Space幸存者区,用于保存在eden space内存区域中经过垃圾回收后没有被回收的对象。
4、Survivor有两个,分别为To Survivor、 From Survivor,这个两个区域的空间大小是一样的。
5、执行垃圾回收的时候Eden区域不能被回收的对象被放入到空的survivor
(也就是To Survivor,同时Eden区域的内存会在垃圾回收的过程中全部释放),
另一个survivor(即From Survivor)里不能被回收的对象也会被放入这个survivor(即To Survivor),
然后To Survivor 和 From Survivor的标记会互换,始终保证一个survivor是空的。
GC分类
1)Minor GC:发生在年轻代中的垃圾收集动作,采用的复制算法
2)Full GC:和老年代相关
分代收集算法关键词
三、常见的垃圾收集器
JVM的运行模式:
Server和Client
注:
1、理解就是高配版和低配版
2、java -version可以查看当前虚拟机使用的哪种运行模式
垃圾收集器之间的联系
垃圾收集器和JVM实现紧密相关的,虚拟机所处的区域,说明它是属于新生代的收集器还是老年代的收集器,如果两个收集器之间有连线,就说明它们可以搭配使用
四、常见面试题
finalize()
ReferenceQueue引用队列
注:这个需要查自恋
注:
1、Queue类似于一个链表的结构,这里的节点其实就是Reference本身。
2、链表的容器,其自己只存储当前的head节点,而后面的节点由每个Reference节点自己通过next来保存即可。
3、上面三个引用都可以保存到引用队列里面,强引用不可以
4、如果在创建一个引用对象的时候,指定了ReferenceQueue,
那么当引用对象指向的对象达到合适的状态的时候,GC会把引用对象本身添加到这个队列里面,方便我们处理它
强引用作用 Strong Reference
强引用(Strong Reference),最普遍的引用,
1、例如Object obj = new Object();这里new一个对象实例来,这里面的obj就是一个强引用。
2、如果一个对象具有强引用,当内存空间不足的时候,
Java虚拟机宁可抛出OutOfMemoryError终止应用程序,也不会回收具有强引用的对象。
3、通过将对象设置为null来弱化引用,使其被回收。
注:设置为null相当于去掉与堆中对象的联系或连接
如果我们不使用这个对象了,需要通过将对象的引用设置为null方法来弱化引用,使其被回收,
即将刚才的obj设置为null,或者等待它超过对象的生命周期范围,
这个时候GC就认为该对象不存在引用了,就可以回收这个对象了。具体什么时候收集,取决于系统。
软引用(Soft Reference),表示一个对象处在有用但非必须的状态
软引用 softReference 类
弱引用(Weak Reference),用来描述非必须的对象,类似软引用,强度比软引用更弱一些
GC在扫描的过程中,一旦发现有被弱引用关联的对象,就会将它回收了
弱引用 WeakReference类
虚引用(Phantom Reference),顾名思义就是形同虚设,与其他几种引用不同,虚引用不会决定对象的生命周期
虚引用 PhantomReference类
如果一个对象仅持有虚引用,那么它就和没有任何引用一样。任何时候都可能被垃圾收集器回收