JVM 虚拟机

简介:

JVM 堆内存结构
堆内存的布局与垃圾回收器有关。
传统的垃圾回收器会把堆内存划分为:老年代和年轻代,年轻代又分为
● 伊甸园 Eden
● 幸存区 S0,S1
如果是 G1 垃圾回收器,会把内存划分为一个个的 Region,每个 Region 都可以充当
● 伊甸园
● 幸存区
● 老年代
● 巨型对象区

6.2 垃圾回收算法
记忆三种:

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

6.3【追问】伊甸园、幸存区、老年代细节
● 对象最初都诞生在伊甸园,这些对象通常寿命都很短,在伊甸园空间不足,会触发年轻代回收,还活着的对象进入幸存区 S0,年轻代回收适合采用标记-复制算法
● 接下来再触发年轻代回收时,会将伊甸园和 S0 仍活着的对象复制到 S1,清空 S0,交换 S0 和 S1 职责
● 经过多次回收仍不死的对象,会晋升至老年代,老年代适合放那些长时间存活的对象
● 老年代回收如果满了,会触发老年代垃圾回收,会采用标记-整理或标记-清除算法。老年代回收时的暂停时间通常比年轻代回收更长
还会常问
晋升条件
● 注意不同垃圾回收器,晋升条件不一样
● 在 parallel 里,经历 15 次(默认值)新生代回收不死的对象,会晋升
○ 可以通过 -XX:MaxTenuringThreshold 来调整
○ 例外:如果幸存区中的某个年龄对象空间占比已经超过 50%,那么大于等于这个年龄的对象会提前晋升
大对象的处理
● 首先大对象不适合存储在年轻代,因为年轻代是复制算法,对象移动成本高
● 注意不同垃圾回收器,大对象处理方式也不一样
● 在 serial 和 cms 里,如果对象大小超过阈值,会直接把大对象晋升到老年代
○ 这个阈值通过 -XX:PretenureSizeThreshold 来设置
● 在 g1 里,如果对象被认定为巨型对象(对象大小超过了 region 的一半),会存储在巨型对象区
○ Region 大小是堆内存总大小 / 2048(必须取整为2的幂),或者通过 -XX:G1HeapRegionSize 来设置
P.S.
著名教材《深入理解Java虚拟机》一书关于这些论述,很多观点陈旧过时,需要带批判眼光来学习。例如在它的《内存分配与回收策略》这一章节,提到了这些:
● 对象优先在Eden分配(OK)
● 大对象直接进入老年代(没有提到 g1 情况)
● 长期存活的对象将进入老年代(即我上面讲的晋升条件,但没强调要区分垃圾回收器)
● 动态对象年龄判定(即提前晋升)
● 空间分配担保(已过时)文中提到的 -XX:+HandlePromotionFailure 参数在 jdk8 之后已经没了

7、Lambda表达式

相关文章
|
9天前
|
人工智能 JavaScript 开发工具
Yank Note: 一款强大可扩展的本地 Markdown 笔记应用
Yank Note 是一款本地化、高性能、高扩展性、双栏式的开源 Markdown 笔记应用。你可以用它轻松地记录学习笔记、撰写文章、管理待办事项、运行代码片段、制作小工具等。
117 7
Yank Note: 一款强大可扩展的本地 Markdown 笔记应用
|
9天前
|
人工智能 PyTorch 算法框架/工具
在无网络与8G内存约束下,个人计算机部署AI实践
本文探讨在无网络、仅8GB内存、无GPU的老旧PC上本地部署大语言模型的实践路径。通过构建纯净Python环境、选用PyTorch格式小模型(Qwen1.5-0.5B)、规避系统陷阱(如长路径限制、注册表关联错误等),成功实现离线中文对话,形成可复现的避坑指南与技术参考。(239字)
|
10天前
|
人工智能 Kubernetes 数据可视化
别再写"面条式文档"了!用AI给你的思维装个"图形渲染引擎"
别让线性文字限制了你的高维思考。本文揭示了大脑作为"图形处理器"的本质,提供了一套专业的AI指令,将复杂的逻辑思维"序列化"为清晰的拓扑结构,像渲染DOM树一样可视化你的知识体系,极大提升沟通与学习效率。
142 12
|
5月前
|
Java
java入门代码示例
本文介绍Java入门基础,包含Hello World、变量类型、条件判断、循环及方法定义等核心语法示例,帮助初学者快速掌握Java编程基本结构与逻辑。
476 0
|
7天前
|
SQL Java 关系型数据库
Spring Boot 3 集成 Apache Calcite:多数据源查询的终极解决方案
本文详解Spring Boot 3集成Apache Calcite实现多数据源统一查询:支持MySQL、MongoDB等异构数据库,通过JSON模型配置+MyBatis Plus风格开发,一行SQL跨库关联。含完整依赖、配置、代码及三大实战场景(中台融合、实时+离线、文件直查),助你高效解决分布式数据查询难题。
140 0
|
29天前
|
人工智能 JavaScript UED
如何实现两个下拉选择框 select选中联动效果?
本文通过一个公司与产品联动的下拉选择案例,详细讲解了Element UI中双向联动下拉框的实现方法。涵盖数据过滤、回显处理、重置功能及注意事项,结合Vue实战代码,帮助开发者提升表单交互体验,适用于各类关联选择场景的开发参考。(238字)
189 0
如何实现两个下拉选择框 select选中联动效果?
|
5月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
553 0