简述java虚拟机的垃圾回收(GC)机制

1. 垃圾回收的概念
- Java虚拟机的垃圾回收(GC)机制是自动管理内存的一种机制。它负责识别和回收不再被程序使用的内存对象,使得程序员不需要手动释放内存,从而减少了内存泄漏和悬空指针等错误的发生。
2. 垃圾判断方法
- 引用计数法
- 原理:给对象添加一个引用计数器,当有一个地方引用这个对象时,计数器就加1,当引用失效时,计数器就减1。当计数器的值为0时,就认为这个对象是垃圾,可以被回收。
- 缺点:无法解决循环引用的问题。例如,对象A引用对象B,对象B也引用对象A,此时它们的引用计数都不为0,但实际上这两个对象可能已经没有其他地方引用了,应该被回收。
- 可达性分析算法
- 原理:以一系列被称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链。当一个对象到任何一个GC Roots没有引用链相连时,就认为这个对象是不可达的,是垃圾,可以被回收。
- GC Roots对象包括:虚拟机栈(栈帧中的本地变量表)中引用的对象、方法区中类静态变量引用的对象、方法区中常量引用的对象、本地方法栈中JNI(Java Native Interface)引用的对象。
3. 垃圾回收算法
- 标记 - 清除算法
- 过程:首先标记出所有需要回收的对象,然后统一清除被标记的对象。
- 缺点:效率较低,因为标记和清除两个过程都比较耗时。而且清除后会产生大量不连续的内存碎片,当需要分配较大内存对象时,可能无法找到足够大的连续内存空间,导致内存分配失败。
- 复制算法
- 过程:将可用内存分为大小相等的两块,每次只使用其中一块。当这块内存用完了,就将还存活的对象复制到另一块内存中,然后把原来使用的那块内存全部清除。
- 优点:简单高效,不会产生内存碎片。
- 缺点:内存利用率较低,因为始终有一半的内存处于闲置状态。
- 标记 - 整理算法
- 过程:首先标记出所有需要回收的对象,然后将所有存活的对象向一端移动,最后清除掉端的内存区域。
- 优点:既解决了标记 - 清除算法的内存碎片问题,又不像复制算法那样浪费一半的内存。
4. 垃圾回收器类型
- Serial GC
- 特点:单线程的垃圾回收器,在进行垃圾回收时,会暂停所有的用户线程(“Stop - The - World”现象)。它适合于单CPU环境下的小型应用程序,因为它简单高效,内存占用小。
- Parallel GC(吞吐量优先垃圾回收器)
- 特点:多线程的垃圾回收器,在进行垃圾回收时,也会暂停所有的用户线程。它注重提高垃圾回收的吞吐量,即单位时间内垃圾回收器能够处理的垃圾量占总垃圾量的比例。它适合于对吞吐量要求较高的多CPU环境下的应用程序。
- CMS GC(并发标记清除垃圾回收器)
- 特点:以并发的方式进行部分垃圾回收操作,尽量减少“Stop - The - World”现象对用户线程的影响。它主要分为四个阶段:初始标记、并发标记、重新标记和并发清除。初始标记和重新标记阶段会暂停用户线程,并发标记和并发清除阶段与用户线程并发进行。它适合于对响应速度要求较高的应用程序,如Web服务器等。
- G1 GC(Garbage First垃圾回收器)
- 特点:是一种区域分块的垃圾回收器,它将堆内存分为多个大小相等的区域(Region),根据对象的大小和存活时间等因素来确定哪些区域优先进行垃圾回收。它结合了标记 - 整理和复制算法的优点,既减少了内存碎片,又提高了垃圾回收的效率。它适合于大内存、多CPU的应用程序。
全部评论

相关推荐

2 4 评论
分享
牛客网
牛客企业服务