Java中的GC是什么?
这节课给小伙伴们讲解的是GC是什么,以及Java如何判断对象可以进行回收和常见的GC算法有哪些。 这个面试题可能出现在面试笔试部分,也可能出现在面试中面试官直接问的部分。
1. GC是什么
GC 全称 garbage collection,翻译过来叫做垃圾回收器。 GC的主要作用就是回收JVM中不再使用的对象所占内存。 JVM运行时堆内存和方法区中数据。而虚拟机栈、程序计数器、本地方法栈都是根据线程创建而创建, 随着线程销毁而销毁,所以不需要进行回收。
2. GC如何判断对象是否可以进行回收
2.1 引用计数(已淘汰)
引用计数算法就是看对象是否被引用。如果引用则对象计数器加一。如果释放引用计数器减一。但是引用计数算法最大的问题就是循环引用问题。当出现循环引用时对象计数器至少为1.这时候对象可能已经是垃圾了,但是无法被回收。(循环引用)
2.2 可达性分析
根达可算法没有引用计数算法中循环引用无法被回收的问题。 其主要思路是通过一系列名为GC Roots的对象作为根,从根开始往下搜索,搜索过程经过的路径称为引用链(Reference Chain),当一个对象到达GC Root时表示当前对象还在使用,如果没有引用的或者和 其他非GC Roots循环引用的内容都是垃圾。静态变量、线程变量、常量池、JNI(指针)都是GC Roots 。
3.GC如何判断对象是否可以进行回收
3.1 标记清除算法(Mark-sweep)
- 标记:从根节点(如栈、全局变量)开始,递归地遍历所有可达对象,并标记它们。
- 清除:遍历整个对象空间,清除未标记的对象。
缺点:简单,但可能产生内存碎片。
3.2 标记压缩算法(Mark-Compact)
- 标记:与标记-清除算法相同,从根节点开始标记所有可达对象。
- 整理:将所有标记的对象移动到对象空间的一端,整理出连续的空闲空间。
减少内存碎片,但整理过程耗时。
3.3 复制算法(coping)
- 复制:将对象空间分为两部分,每次只使用其中一部分。当这部分空间用完时,将所有存活对象复制到另一部分空间,然后清除原空间。
避免内存碎片,但需要额外空间。
3.4 分代收集(Generational Collection)算法
- 分代:将对象空间分为几代,新对象分配到年轻代,经过多次GC后,存活对象移动到年老代。
- 收集:根据对象的年龄,选择不同的GC策略。年轻代使用复制算法,年老代使用标记-清除或标记-整理算法。
提高GC效率,减少GC时间,是现代JVM中常用的GC算法。
都看到这里啦,点个小小的赞吧!
期待你的关注这将会是我更新的最大动力 !
关注我,回复:面试题 获取资料!!!