Java垃圾收集机制是Java虚拟机(JVM)自动管理内存的一种方式,它的主要目标是自动识别和释放不再使用的对象,从而避免内存泄漏。本篇文章将详细介绍两种标记方法、四种GC根(GC Root)类型、三种垃圾收集算法以及七种垃圾收集器。 **一、两种标记方法** 1. 引用计数器:这是早期的垃圾收集策略,每个对象都有一个引用计数,当对象被引用时计数加1,引用消失时减1。当计数为0时,认为对象不再被使用。这种方法简单高效,但无法处理循环引用的问题。 2. 引用跟踪:从GC Root出发,遍历所有可达的对象,无法直接到达的对象被认为是垃圾。这种方法能处理循环引用,但需要更复杂的算法和数据结构。 **二、四种GC Root类型** 1. 线程栈:每个线程的栈帧中本地变量引用的对象被视为GC Root。 2. 方法区静态变量:类的静态属性引用的对象。 3. 方法区常量引用:常量池中的引用,如字符串字面量。 4. JNI方法引用:Java Native Interface(JNI)方法中的引用,这些是Java代码与本地(非Java)代码交互时创建的引用。 **三、三种垃圾收集算法** 1. 标记-清除:首先标记所有存活的对象,然后清除所有未标记的对象。此算法会产生内存碎片,效率较低。 2. 复制:将内存空间分为两块,每次只使用一块,当一块用完后,将存活对象复制到另一块,然后清空当前块。虽然效率较高,但会浪费一半的内存。 3. 标记-整理:标记存活对象,然后让所有存活对象向一端移动,最后清理掉边界以外的区域。这种方法无碎片,但移动对象会消耗一定时间。 **四、七种垃圾收集器** 1. serial:新生代的单线程收集器,STW(Stop The World),适合轻量级应用。 2. parNew:并行版本的serial,同样STW。 3. parallel scavenge:关注系统吞吐量,而非用户停顿时间,适用于后台服务。 4. CMS(Concurrent Mark Sweep):年老代的并发收集器,STW时间短,以最小化用户停顿为目标,但有内存碎片问题。 5. parallel old:与parallel scavenge配合,使用标记-整理算法,STW。 6. serial old:单线程的标记-整理算法,STW。 7. G1(Garbage First):新一代收集器,使用标记-整理,动态分区,最小化停顿时间且无碎片。 **五、默认垃圾收集器配置** - client模式:新生代使用serial,年老代使用serial old。 - server模式:新生代使用parNew,年老代使用CMS。 **六、并行与并发的区别** 并行是指垃圾收集过程由多个线程同时进行,但会暂停用户线程。并发则是用户线程与垃圾收集线程同时运行,允许一定程度的交叉执行。 **七、Java内存分配策略** Java对象主要在新生代和年老代分配,根据对象生命周期的不同,分为minor GC(主要针对新生代)和full GC(涉及整个堆或包括年老代)。 总结起来,Java垃圾收集机制是JVM内存管理的关键组成部分,通过不同策略和算法来优化内存使用,提高程序性能。理解这些概念有助于优化应用程序的内存使用和性能。
- 粉丝: 20
- 资源: 314
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
评论0