JVM(Java Virtual Machine)(下)

简介: JVM(Java Virtual Machine)(下)

可达性分析🍂

Java 中的对象是通过引用进行指向并访问的

可达性分析, 就是将这些对象被组织的结构视为链式结构

从起始位置出发, 遍历链

能够被访问到的对象标记为"可达"

反之即为"不可达"

(将不可达的作为"垃圾"进行回收)

举个栗子🌰

class TreeNode {
  int val;
  TreeNode left;
  TreeNode right;
}

目前所有的节点都是可达的

此时3 → 6之间的连接断开

6不可达

8不可达

于是6, 8被当作垃圾进行回收

  • 可达性分析
  • 需要进行类似于遍历操作从而判断是否可达
  • 相比于引用计数, 其执行效率要慢一些
  • 可达性分析的遍历操作, 并不需要一直执行, 是一种周期性的策略(隔一段时间分析一遍)
  • 可达性分析遍历的起点
  • 栈上的局部变量
  • 常量池中的对象
  • 静态成员变量

如何清理垃圾

标记清除


将垃圾标记并回收

标记清除的不足🍂

内存碎片问题

被释放的空间是零散的, 不是连续的

申请内存的空间要求是连续的空间

导致总的空闲空间可能很大(非连续), 但每个具体的空间(连续)却较小

从而申请内存失败

复制算法


将内存空间划分为两半

将不是垃圾的对象复制到另一半, 然后将整个空间删除

复制算法解决了内存碎片问题

但也有其不足

复制算法的不足🍂

  1. 空间利用率较低
  2. 垃圾少, 有效对象多时, 复制成本较大

标记整理


将垃圾进行标记

将不是垃圾的对象覆盖垃圾的空间

删除剩余空间

解释🍭

1为垃圾

后面的元素依次进行覆盖

1, 2, 3, 4, 5, 6

变为

2, 3, 4, 5, 6

解释🍭

3为垃圾

后面的元素依次进行覆盖

2, 3, 4, 5, 6

变为

2, 4, 5, 6

解释🍭

5为垃圾

后面的元素依次进行覆盖

2, 4, 5, 6

变为

2, 4, 6

解释🍭

删除剩余空间

标记整理解决了复制算法的空间利用率较低的问题

但也有其不足

标记整理的不足🍂

效率问题

(需要将对象进行搬运, 如果要搬运的对象较多, 此时效率就会较低)


分代回收


可以看出, 上述对于垃圾清理的操作, 都有其相对的适用场景与不足

那么, 能不能让合适的垃圾清理方法去其适合的场景呢

于是引出了分代回收

分代回收

将垃圾回收划分成不同的场景

不同的场景应用不同的清理方法

(各展所长)

分代是如何划分的🍭

基于经验规律

是的, 基于经验规律

这个规律是这样的

如果一个东西存在的时间比较长, 那么大概率还会继续长时间的存在下去

这个规律, 对于 Java 的对象也是有效的(由一系列的实验和论证过程得出)

  • Java对象的生命周期大致可以划分为两种
  • 生命周期极短
  • 生命周期极长

于是, 给对象引入了一个概念—年龄

(此处的年龄指代的是熬过GC的轮次, 可以类比于人类的年龄)

于是将堆进行了区域的划分

更为具体的划分

  • 新 new 出来的对象, "年龄"为0, 存放在伊甸区
  • 使用复制算法
  • 熬过一轮 GC 的对象, 存放在幸存区(伊甸区 → 幸存区)
  • 使用复制算法
  • 在幸存区经过多轮拷贝的对象, 存放在老年代(幸存区 → 老年代)
  • 使用标记整理

🔎结尾

创作不易,如果对您有帮助,希望您能点个免费的赞👍

大家有什么不太理解的,可以私信或者评论区留言,一起加油

相关文章
|
3月前
|
监控 算法 Java
Java虚拟机(JVM)的垃圾回收机制深度解析####
本文深入探讨了Java虚拟机(JVM)的垃圾回收机制,旨在揭示其背后的工作原理与优化策略。我们将从垃圾回收的基本概念入手,逐步剖析标记-清除、复制算法、标记-整理等主流垃圾回收算法的原理与实现细节。通过对比不同算法的优缺点及适用场景,为开发者提供优化Java应用性能与内存管理的实践指南。 ####
|
2月前
|
监控 算法 Java
Java虚拟机(JVM)垃圾回收机制深度剖析与优化策略####
本文作为一篇技术性文章,深入探讨了Java虚拟机(JVM)中垃圾回收的工作原理,详细分析了标记-清除、复制算法、标记-压缩及分代收集等主流垃圾回收算法的特点和适用场景。通过实际案例,展示了不同GC(Garbage Collector)算法在应用中的表现差异,并针对大型应用提出了一系列优化策略,包括选择合适的GC算法、调整堆内存大小、并行与并发GC调优等,旨在帮助开发者更好地理解和优化Java应用的性能。 ####
71 0
|
1月前
|
存储 监控 算法
Java JVM 面试题
Java JVM(虚拟机)相关基础面试题
|
2月前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
2月前
|
存储 监控 算法
Java虚拟机(JVM)垃圾回收机制深度解析与优化策略####
本文旨在深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法及参数调优方法。通过剖析垃圾回收的生命周期、内存区域划分以及GC日志分析,为开发者提供一套实用的JVM垃圾回收优化指南,助力提升Java应用的性能与稳定性。 ####
|
3月前
|
机器学习/深度学习 监控 算法
Java虚拟机(JVM)的垃圾回收机制深度剖析####
本文深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法、性能调优策略及未来趋势。通过实例解析,为开发者提供优化Java应用性能的思路与方法。 ####
76 1
|
3月前
|
Oracle 安全 Java
深入理解Java生态:JDK与JVM的区分与协作
Java作为一种广泛使用的编程语言,其生态中有两个核心组件:JDK(Java Development Kit)和JVM(Java Virtual Machine)。本文将深入探讨这两个组件的区别、联系以及它们在Java开发和运行中的作用。
162 1
|
3月前
|
监控 Java 开发者
Java虚拟机(JVM)深度优化指南####
本文深入探讨了Java虚拟机(JVM)的工作原理及其性能优化策略,旨在帮助开发者通过理解JVM的内部机制来提升Java应用的运行效率。不同于传统的技术教程,本文采用案例分析与实战技巧相结合的方式,为读者揭示JVM调优的艺术。 ####
86 8
|
4月前
|
存储 算法 Java
Java虚拟机(JVM)的内存管理与性能优化
本文深入探讨了Java虚拟机(JVM)的内存管理机制,包括堆、栈、方法区等关键区域的功能与作用。通过分析垃圾回收算法和调优策略,旨在帮助开发者理解如何有效提升Java应用的性能。文章采用通俗易懂的语言,结合具体实例,使读者能够轻松掌握复杂的内存管理概念,并应用于实际开发中。
|
3月前
|
监控 算法 Java
深入理解Java虚拟机(JVM)的垃圾回收机制
【10月更文挑战第21天】 本文将带你深入了解Java虚拟机(JVM)的垃圾回收机制,包括它的工作原理、常见的垃圾收集算法以及如何优化JVM垃圾回收性能。通过本文,你将对JVM垃圾回收有一个全新的认识,并学会如何在实际开发中进行有效的调优。
88 0