越不懂的越爱装
大家都同等:IT世界没有难不难,只有是否了解过
挑战目录
什么是gc
指JVM用于释放那些不再使用的对象所占用的内存。
如何确定不再使用的对象
-
由于引用太弱:Java中引用分为强引用、软引用、弱引用、虚引用。
强引用:无论什么情况下,只要有强引用。则不会被回收。
软引用:当发生要发生内存溢出前,才进行回收。
弱引用:若对象只被弱引用及更低的持有,无论内存是否足够。都会进行回收。
虚引用:存在的目的是为了监听gc被调用。
-
引用计数:每当有增加这个对象的引用时,就将计数器加1。减少引用时,计数器就减1。当一个对象的引用计数器为0时,说明没有被其他对象引用,就会被GC回收。
缺点:因为是只要有被引用就不回收,而不是从"根对象"循环查找下来。对比可达性分析法有着明显的内存泄露的风险。典型的是相互引用的问题。 -
可达性分析法:从GC Root往下搜索,没有搜到的对象,说明此对象不可用。就会被GC回收。
可作为GC Root的有:- Java虚拟机栈上栈帧里面的本地变量表(但是一般随着方法的结束自动退出栈了)。
- 和1同理,本地方法栈上的引用(一般随着native方法的结束自动退出栈了)。
- 方法区中的运行时常量区的变量引用。
- 方法区类静态属性引用的对象。
- 虚拟机内部必须引用(比如系统类加载器)。
- 被同步锁(synchronized关键字)持有的对象(??TODO 这里补充写解释)。
- 反应Java虚拟机内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存等(??TODO 这里补充写解释)。
- ...
什么时候释放上面确定的不使用了的对象所占的内存
如何释放上面确定的不使用了的对象所占的内存
根据java内存模型,可知java对象大多数情况存储于堆中,方法区的运行时常量池也有一些常量。
- 回收方法区:
回收堆:
- 堆主要是用来存放对象的。
- 对象一般可分为朝生夕死的和存活很久的、以及分布于这之间的对象。每次都整个堆进行回收,回收效率会特别低。
- 所以Java堆一般采取根据分类,采用不同的回收算法进行回收
标记清除算法:
这是java堆回收算法的基础,堆中不同区使用的回收算法都是根据这个算法的不同优化方向优化而来的。

-
回收Eden区(和Survivor共同组成使用 标记复制算法):
-
回收Survivor区(和Eden共同组成使用 标记复制算法):
-
回收Old区(标记整理算法):
网友评论