JVM 虚拟机

简介: JVM堆内存结构及垃圾回收机制详解。传统GC将堆划分为老年代与年轻代(含Eden、S0、S1),G1则将内存划分为多个Region,可灵活分配为伊甸园、幸存区、老年代或巨型对象区。常见垃圾回收算法包括标记-清除、标记-整理和标记-复制。对象通常在Eden创建,经历多次GC后晋升至老年代。不同GC器晋升条件和大对象处理方式不同,如Parallel中默认经历15次GC不死则晋升,Serial/CMS中大对象直接进入老年代,G1则设巨型对象区存放超大对象。

JVM 堆内存结构

堆内存的布局与垃圾回收器有关。

传统的垃圾回收器会把堆内存划分为:老年代和年轻代,年轻代又分为

  • 伊甸园 Eden
  • 幸存区 S0,S1

如果是 G1 垃圾回收器,会把内存划分为一个个的 Region,每个 Region 都可以充当

  • 伊甸园
  • 幸存区
  • 老年代
  • 巨型对象区


垃圾回收算法

记忆三种:

  1. 标记-清除算法。优点是回收速度快,但会产生内存碎片
  2. 标记-整理算法。相对清除算法,不会有内存碎片,当然速度会慢一些
  3. 标记-复制算法。将内存划分为大小相等的两个区域 S0 和 S1
  1. S0 的职责用来存储对象,S1 始终保持空闲
  2. 垃圾回收时,只需要扫描 S0 的存活对象,把它们复制到 S1 区域,然后把 S0 整个清空,最后二者互换职责即可
  3. 不会有内存碎片,特别适合存活对象很少时(因为此时复制工作少)


伊甸园、幸存区、老年代细节

  • 对象最初都诞生在伊甸园,这些对象通常寿命都很短,在伊甸园空间不足,会触发年轻代回收,还活着的对象进入幸存区 S0,年轻代回收适合采用标记-复制算法
  • 接下来再触发年轻代回收时,会将伊甸园和 S0 仍活着的对象复制到 S1,清空 S0,交换 S0 和 S1 职责
  • 经过多次回收仍不死的对象,会晋升至老年代,老年代适合放那些长时间存活的对象
  • 老年代回收如果满了,会触发老年代垃圾回收,会采用标记-整理或标记-清除算法。老年代回收时的暂停时间通常比年轻代回收更长

晋升条件

  • 注意不同垃圾回收器,晋升条件不一样
  • 在 parallel 里,经历 15 次(默认值)新生代回收不死的对象,会晋升
  • 可以通过 -XX:MaxTenuringThreshold 来调整
  • 例外:如果幸存区中的某个年龄对象空间占比已经超过 50%,那么大于等于这个年龄的对象会提前晋升

大对象的处理

  • 首先大对象不适合存储在年轻代,因为年轻代是复制算法,对象移动成本高
  • 注意不同垃圾回收器,大对象处理方式也不一样
  • 在 serial 和 cms 里,如果对象大小超过阈值,会直接把大对象晋升到老年代
  • 这个阈值通过 -XX:PretenureSizeThreshold 来设置
  • 在 g1 里,如果对象被认定为巨型对象(对象大小超过了 region 的一半),会存储在巨型对象区
  • Region 大小是堆内存总大小 / 2048(必须取整为2的幂),或者通过 -XX:G1HeapRegionSize 来设置
相关文章
|
存储 算法 Oracle
极致八股文之JVM垃圾回收器G1&ZGC详解
本文作者分享了一些垃圾回收器的执行过程,希望给大家参考。
|
缓存 Java 应用服务中间件
一文带你使用xxl-job定时任务
将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求。 将任务抽象成分散的JobHandler,交由“执行器”统一管理,“执行器”负责接收调度请求并执行对应的JobHandler中业务逻辑。 因此,“调度”和“任务”两部分可以相互解耦,提高系统整体稳定性和扩展性;
5575 0
一文带你使用xxl-job定时任务
|
存储 缓存 算法
深入理解JVM《JVM内存区域详解 - 世界的基石》
Java代码从编译到执行需经javac编译为.class字节码,再由JVM加载运行。JVM内存分为线程私有(程序计数器、虚拟机栈、本地方法栈)和线程共享(堆、方法区)区域,其中堆是GC主战场,方法区在JDK 8+演变为使用本地内存的元空间,直接内存则用于提升NIO性能,但可能引发OOM。
|
8月前
|
安全 Java API
别再乱用 HashMap 了!高并发容器核心原理与全场景选型避坑指南
本文深度解析ConcurrentHashMap底层原理(桶级锁、CAS、无锁读)、核心API、全场景选型(Map/List/Queue)、高频踩坑(复合操作、size误用、null值等)及生产最佳实践,助你真正掌握高并发容器体系。
471 1
|
12月前
|
缓存 对象存储
「玩透ESA」ESA启动和加速-源地址池实操
创建两个新加坡OSS源站并上传图片,因测试账号Bucket满额复用已有资源。配置源地址池,设置请求不缓存,验证多请求下图片返回比例约为6:4。通过将一个源站指向无效IP(1.1.1.1),验证异常源站逃逸机制,约60%请求失败,实现故障模拟与容错测试。
584 1
|
Arthas 监控 数据可视化
深入理解JVM《JVM监控与性能工具实战 - 系统的诊断工具》
掌握JVM监控与诊断工具是Java性能调优的关键。本文系统介绍jps、jstat、jmap、jstack等命令行工具,以及jconsole、VisualVM、JMC、Arthas、async-profiler等可视化与高级诊断工具,涵盖GC分析、内存泄漏定位、线程死锁检测及CPU热点追踪,助力开发者全面提升线上问题排查能力。(238字)
|
Java 调度 数据库
SpringBoot整合XXL-JOB【05】- 任务分片
在实际业务中,批量定时任务可能因上一批任务未完成而影响业务。为解决此问题,本文介绍如何使用Xxl-job对批量任务进行分片处理,通过分片广播形式调度集群机器并行执行任务,大幅提升执行效率。具体步骤包括环境准备、添加依赖和配置、声明实体类与查询类,以及改造业务逻辑实现分片查询。测试结果显示,分片处理将两千条数据的执行时间从30秒缩短至15秒,性能提升显著。
2761 13
SpringBoot整合XXL-JOB【05】-  任务分片
|
数据采集 人工智能 分布式计算
MaxFrame:链接大数据与AI的高效分布式计算框架深度评测与实践!
阿里云推出的MaxFrame是链接大数据与AI的分布式Python计算框架,提供类似Pandas的操作接口和分布式处理能力。本文从部署、功能验证到实际场景全面评测MaxFrame,涵盖分布式Pandas操作、大语言模型数据预处理及企业级应用。结果显示,MaxFrame在处理大规模数据时性能显著提升,代码兼容性强,适合从数据清洗到训练数据生成的全链路场景...
1187 5
MaxFrame:链接大数据与AI的高效分布式计算框架深度评测与实践!
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
557 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
传感器 监控 物联网
贴片卡与插拔卡
贴片卡(也称为嵌入式SIM卡或eSIM)和插拔卡(传统SIM卡)在无线通信领域中各有其适用场景和操作方式。