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 来设置
相关文章
|
网络协议 数据安全/隐私保护 Windows
当不在公司时,如何在外远程登录公司内网OA系统?
当不在公司时,如何在外远程登录公司内网OA系统?
554 0
|
Java Spring
Spring boot 运行服务jar外配置配置文件方式总结
Spring boot 运行服务jar外配置配置文件方式总结
1463 0
|
11月前
|
存储 监控 Devops
DevOps实践:持续集成/持续部署(CI/CD)的实战指南
DevOps实践:持续集成/持续部署(CI/CD)的实战指南
|
机器学习/深度学习 数据采集 数据可视化
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
744 4
Zerotier+Parsec五分钟实现外网远程访问校园或公司内网
本文介绍了如何通过Zerotier和Parsec软件在五分钟内实现外网对校园或公司内网的远程访问,包括安装软件、配置内网穿透和实现远程控制的详细步骤。
1030 3
Zerotier+Parsec五分钟实现外网远程访问校园或公司内网
|
前端开发 关系型数据库 MySQL
Python基于Django框架图书管理系统,Bootstrap框架UI,后台EasyUI框架UI,有登录,实现增删改查的富文本效果
本文介绍了一个使用Python Django框架开发的图书管理系统,该系统采用Bootstrap框架进行前端UI设计,EasyUI框架用于后台UI界面,集成了富文本编辑器,并实现了登录及增删改查功能。
325 1
|
安全 Java
如何在 Java 中停止线程
【8月更文挑战第22天】
492 4
|
12月前
|
缓存 Java
java文件读取 while ((len = reader.read(buffer)) != -1){}的理解
本文解释了Java中使用`InputStreamReader`和`read(buffer)`方法循环读取文件内容的机制,强调了如何正确理解读取循环和处理读取到的数据,以及如何处理字符编码和换行符。
206 0
|
存储 缓存 关系型数据库
深入解析MySQL中的表类型及其应用场景
【8月更文挑战第31天】
930 0
|
SQL 关系型数据库 数据库
手把手教你管理PostgreSQL数据库及其对象
手把手教你管理PostgreSQL数据库及其对象
642 0