96SEO 2026-05-25 06:11 2
垃圾收集器与内存分配策略是怎样的?
在探讨垃圾收集器与内存分配策略之前,我们 需要理解垃圾回收的基本概念。垃圾回收是一种自动内存管理机制,它的核心工作是回收程序中不再使用的对象所占用的内存,防止内存泄漏,减轻程序员手动管理内存的负担。
如何判断对象是否存活判断对象是否存活是垃圾回收的首要任务。主流的Java虚拟机采用了可达性分析算法来判定对象是否存活,而不是引用计数法。可达性分析算法通过一系列称为GC Roots的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索。Ru果某个对象到GC Roots间没有任何引用链相连,则证明此对象是不可Neng再被使用的。

Java中的引用概念经过了扩充,不再仅仅是传统的“引用”或“被引用”两种状态,而是分为强引用、软引用、弱引用和虚引用四种,它们的强度逐渐减弱。这种扩充使得JVMNeng够geng好地管理内存,特别是在处理缓存等应用场景时。
对象的死亡过程即使在可达性分析算法中判定为不可达的对象,也不是“非死不可”的。要真正宣告一个对象的死亡,至少要经历两次标记过程。Ru果对象在进行可达性分析后发现没有与GC Roots相连接的引用链,它将会被第一次标记,随后进行一次筛选,筛选的条件是此对象是否有必要执行finalize方法。
finalize方法是定义在java.lang.Object类中的一个protected方法,它给对象一个“Zui后的机会”来释放其占用的非Java资源。虽然它曾经被用于拯救对象免于被回收,但由于其问题太多,现在Yi经不推荐使用。
方法区的垃圾回收主要回收两个部分:废弃常量和无用的类。回收常量的逻辑类似于堆中的对象回收,而判定一个类是否是“无用的类”则需要满足三个条件:该类的所有实例douYi经被回收,加载该类的ClassLoaderYi经被回收,该类对应的java.lang.Class对象没有在任何地方被引用。
从如何判定对象消亡的角度,垃圾回收算法被划分为“引用计数式垃圾回收”和“追踪式垃圾回收”两大类。主流的JVMdou是后者,因此我们重点讨论“追踪式垃圾回收”。目前的虚拟机dou是遵循了“分代收集”的经验法则,将Java堆划分出不同的区域,然后将回收对象依据其年龄分配到不同的区域之中存储。
标记-清除算法Zui早Zui基础的算法是“标记-清除算法”,它分为“标记”和“清除”两个阶段: 标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。它有两个缺点:执行效率不稳定,Ru果Java堆中包含大量需要被回收的对象,需要进行大量标记和清除动作;会产生大量不连续的内存碎片。
标记-复制算法标记-复制算法将内存划分为两个大小一样的内存,每次只使用其中的一块,当这块内存用完了将存活的对象复制到另一半上,然后清理这一块内存。这种方法特别适合去回收新生代,因为大部分对象dou是可回收的,复制的对象仅仅只是少部分存活对象,因此执行效率高。
Appel式回收Appel式回收的具体Zuo法是把新生代分为一块较大的Eden空间和两块较小的Survivor空间,每次分配内存只使用Eden和其中一块Survivor。在发生垃圾收集的时候,将Eden区和Survivor区仍然存活的对象一次性复制到另一块Survivor区,然后清理掉Eden和用过的那块Survivor区。HotSpot虚拟机默认Eden和Survivor的大小比例是8:1。
根据老年代的存亡特点,另外有一个算法,即标记-整理算法,其中标记过程和标记清除算法一样,然后让所有的存活对象dou向内存空间一端移动,然后直接清理掉边界以外的内存。是否移动存活的对象是一项优缺点并存的风险决策:移动虽然Ke以消除内存碎片化问题,但需要全程暂停用户应用程序;不移动虽然Ke以立即开始GC,但会产生大量内存碎片。
垃圾收集器与内存分配策略的关系.Serial:单线程,在进行,必须暂停其它所有的工作线程,知道它收集完成.
.这两个假说共同奠定了:,然后将不同年龄的对象.
只有处于运行期我们才Neng知道究竟会创建哪些对象,创建多少,这部分,..文章浏览阅读187次。.即使在,也...,这时他们还处于...,要真正宣告一个对象的死亡.... 除了这些固定的GC Roots集合以外,根据用户所选用的,还Ke以有其他对 临时性 地加入,共同构成完整GC Roots集合.事实上,,在1960年诞生于麻省理工学院的Lisp是第一门开始使 用. 当,无论当前,dou会...此外,..public class FinalizeEscapeGC { }.
每一个栈帧中分配多少.. 1960年诞生于MIT的Lisp是第一门真正使用 .
System..;TimeUnit.{ SAVEHOOK.;}else { System.;}.
如Serial Collector可用控制参数、收集算法、Stop The World、Memory allocation rules,recovery strategies等;.并发与并行 Collector:garbage collector's contextual semantics..
实际上就是一种 机制,它的 核心工作是 程序中不再使用的 objects所占用的memory,防止memory leak,减轻程序员手动管理memory 的负担。
garbage collection 机制需要考虑三个问题:
回顾JVM memory 的几个区域:
thread 私有:
thread 共有:
对于thread 私有 的区域,它们随着 thread 而生,随着 thread 而灭,stack 中的 stack frame 随着方法的进入和退出有条不紊地执行着出栈和入栈操作,而每一个 stack frame 分配的大小 在 类的结构上就确定 下来因此这些区域 不需要过多考虑如何 回收的问题,当方法结束或者 thread 结束时memory 自然就跟随着 回收了。
对于 heap 和 method 区 ,就有着hen明显的不确定性,这部分 memory 的 分配和 回收是动态的,因此 garbage collector 所关注的正是 这部分 memory 该如何管理 。
在 heap 中存放着几乎所有 的 object 实例,garbage collector 在对 heap 进行 recovery 前,第一件事就是要确定这些 object 之中哪些 object “dead” 了。
一种教科书方法是:在 object 中添加一个 reference counter,每当有一个地方 reference 它时counter 就加一,当 reference 失效时counter 值就减一,任何时刻 counter 为零的 object 就是不可 Neng再被使用的。
但是在主流的JVM 中,并没有使用 reference counting 法 来管理 memory,因为它hen难解决循环依赖问题。
主流的商用语言,dou是通过 可达性分析算法 来判定 object 是否存活的。
这个算法的基本思路就是通过 一系列称为 GC Roots 的根 object 作为起始节点集,从这些节点开始,根据 reference 关系向下搜索.
Ru果某个 object 到 GC Roots 间没有任何 reference chain 相连,或者用图论的话来说就是从 GC Roots 到这个 object 不可达时则证明此 object 是不可Neng再被使用的。
finalize 方法
finalize 是定义在 java.lang.Object 类中的一个 protected 方法。这意味着所有 Java 对象dou继承了这个方法。它的原始设计目的是:在 garbage collector 确定这个 object 没有任何 reference 之后但在实际 recovery 其 memory 空间之前,给 object 一个“Zui后的机会”来释放其占用的非 Java 资源。
资深游戏老玩家应该知道这个就是 “亡语”,现在Yi经不怎么用了因为问题太大了。
在方法区进行 garbage recovery 的性价比hen低:在 Java heap 中,尤其是在新生代中,对常规应用进行一次 garbage collection 通常Ke以 recovery 百分之七八十至百分之九十以上的 memory 空间. 方法区的 garbage recovery 主要 recovery 两个部分:
回收常量和 Java heap 中的 object 非常类似,比如说:假如一个字符串 java 曾经进入常量池中,但是当前系统又没有任何一个字符串 object 的值是 java.
回收类型的条件就非常苛刻:JVM 被允许对满足这三个条件的无用类进行 recovery。
从如何判定 object 消亡的角度. 目前的主流 JVM 实现dou是遵循了 “分代收集”. 这两个分代假说共同奠定了多款常用的 garbage collector 的一致的设计原则。
Ru果一个 region 中大多数 object dou是朝生夕灭的话.
Ru果剩下的dou是难以消亡的 obj.
JVM 的 heap 一般dou会被设计至少划分为 “新生代” 和 “老年代”,但是有一个问题:object 不是孤立存在的,它们之间存在跨代 reference .
Zui早Zui基础Zui早Zui基础 是由IBM公司研发的一种商业JVM,但HotSpot VM后来居上.
Zui早Zui基础 有两个不足之处:
将 memory space 对半分,每次只使用其中一半。当这一半 space 使用完毕,将仍存活着的对象 copy 至另一半 space ,然后将这一半 space 清理掉。
因为大多数 obj dou属于 “朝生夕灭”. 由上述的特点Ke以知道,这种方法特别适合去 recovery 新生代.
Appel式具体Zuo法是将新生代分为一块较大的 Eden space 和两块较小的 Survivor space ,每次 allocation 只使用 Eden 和其中一块 Survivor . HotSpot 虚拟机默认 Eden 和 Survivor 的大小比例为8∶1.
当 Survivor space 不足以容纳一次 Minor GC 过后仍然存活着的对象时就需要依赖其他 region 进行 allocation 担保:Ru果另外一块 Survivor space 没有足够的 space 来存放上一次新生代 GC 过后的仍存活着的对象,这些 obj 便将通过 allocation 担保机制直接进入老年代,这对虚拟机来说就是安全的。
根据老年代的特点,另外有一个 ,即
Serial Collector单线程,在进行,必须暂停其它所有的工作线程,直到它收集完成。
并发与并行 Collectorgarbage collector's contextual semantics里“并发”和“并行”这两个术语有着特定的含义。
并行:多个 garbage collector 线程同时工作,但此时用户线程仍然处于等待状态。
并发: garbage collector 线程与用户线程同时工作。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback