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 的对象, 存放在幸存区(伊甸区 → 幸存区)
  • 使用复制算法
  • 在幸存区经过多轮拷贝的对象, 存放在老年代(幸存区 → 老年代)
  • 使用标记整理

🔎结尾

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

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

相关文章
|
5月前
|
监控 Java Unix
6个Java 工具,轻松分析定位 JVM 问题 !
本文介绍了如何使用 JDK 自带工具查看和分析 JVM 的运行情况。通过编写一段测试代码(启动 10 个死循环线程,分配大量内存),结合常用工具如 `jps`、`jinfo`、`jstat`、`jstack`、`jvisualvm` 和 `jcmd` 等,详细展示了 JVM 参数配置、内存使用、线程状态及 GC 情况的监控方法。同时指出了一些常见问题,例如参数设置错误导致的内存异常,并通过实例说明了如何排查和解决。最后附上了官方文档链接,方便进一步学习。
559 4
|
1月前
|
安全 Oracle Java
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
153 0
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
|
2月前
|
存储 运维 Kubernetes
Java启动参数JVM_OPTS="-Xms512m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError"
本文介绍了Java虚拟机(JVM)常用启动参数配置,包括设置初始堆内存(-Xms512m)、最大堆内存(-Xmx1024m)及内存溢出时生成堆转储文件(-XX:+HeapDumpOnOutOfMemoryError),用于性能调优与故障排查。
285 0
|
4月前
|
存储 监控 算法
Java程序员必学:JVM架构完全解读
Java 虚拟机(JVM)是 Java 编程的核心,深入理解其架构对开发者意义重大。本文详细解读 JVM 架构,涵盖类加载器子系统、运行时数据区等核心组件,剖析类加载机制,包括加载阶段、双亲委派模型等内容。阐述内存管理原理,介绍垃圾回收算法与常见回收器,并结合案例讲解调优策略。还分享 JVM 性能瓶颈识别与调优方法,分析 Java 语言特性对性能的影响,给出数据结构选择、I/O 操作及并发同步处理的优化技巧,同时探讨 JVM 安全模型与错误处理机制,助力开发者提升编程能力与程序性能。
Java程序员必学:JVM架构完全解读
|
9月前
|
监控 算法 Java
Java虚拟机(JVM)垃圾回收机制深度剖析与优化策略####
本文作为一篇技术性文章,深入探讨了Java虚拟机(JVM)中垃圾回收的工作原理,详细分析了标记-清除、复制算法、标记-压缩及分代收集等主流垃圾回收算法的特点和适用场景。通过实际案例,展示了不同GC(Garbage Collector)算法在应用中的表现差异,并针对大型应用提出了一系列优化策略,包括选择合适的GC算法、调整堆内存大小、并行与并发GC调优等,旨在帮助开发者更好地理解和优化Java应用的性能。 ####
225 27
|
6月前
|
存储 缓存 算法
JVM简介—1.Java内存区域
本文详细介绍了Java虚拟机运行时数据区的各个方面,包括其定义、类型(如程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和直接内存)及其作用。文中还探讨了各版本内存区域的变化、直接内存的使用、从线程角度分析Java内存区域、堆与栈的区别、对象创建步骤、对象内存布局及访问定位,并通过实例说明了常见内存溢出问题的原因和表现形式。这些内容帮助开发者深入理解Java内存管理机制,优化应用程序性能并解决潜在的内存问题。
308 29
JVM简介—1.Java内存区域
|
8月前
|
存储 监控 算法
Java JVM 面试题
Java JVM(虚拟机)相关基础面试题
|
10月前
|
机器学习/深度学习 监控 算法
Java虚拟机(JVM)的垃圾回收机制深度剖析####
本文深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法、性能调优策略及未来趋势。通过实例解析,为开发者提供优化Java应用性能的思路与方法。 ####
223 28
|
9月前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
9月前
|
存储 监控 算法
Java虚拟机(JVM)垃圾回收机制深度解析与优化策略####
本文旨在深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法及参数调优方法。通过剖析垃圾回收的生命周期、内存区域划分以及GC日志分析,为开发者提供一套实用的JVM垃圾回收优化指南,助力提升Java应用的性能与稳定性。 ####

热门文章

最新文章