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表达式

相关文章
【图像分类数据集】非常全面实用的垃圾分类图片数据集共享
【图像分类数据集】非常全面实用的垃圾分类图片数据集共享
1919 37
【图像分类数据集】非常全面实用的垃圾分类图片数据集共享
|
存储 数据采集 运维
阿里巴巴DevOps实践指南(二十四)| 智能运维
智能运维( AIOps )是依托于阿里巴巴 DevOps 经验沉淀而来的智能化运维平台,通过运维大数据的积累,以及算法团队多种算法的校对,我们将运维提升到新的高度,通过 AI 来帮我们查看数据、判断异常、决策运维操作,形成监、管、控一体化的运维平台。
阿里巴巴DevOps实践指南(二十四)| 智能运维
|
3月前
|
人工智能 安全 API
2026年OpenClaw(Clawdbot)安全实战指南:5000+Skill选型攻略+部署流程+风险防御解析
2026年,OpenClaw(原Clawdbot、Moltbot)凭借开放的Skill生态成为AI助手领域的标杆,ClawHub平台汇聚的5705个技能覆盖办公自动化、智能家居、内容创作等全场景需求。但繁荣背后暗藏致命风险:Koi Security审计发现341个恶意Skill,Bitdefender扫描显示近20%的Skill存在安全漏洞,这些恶意插件伪装成“加密钱包追踪器”“YouTube摘要工具”等实用工具,实则窃取API密钥、开启反向Shell远程控制设备,成为潜伏在设备中的安全陷阱。
1321 1
|
9月前
|
缓存 前端开发 API
阿里巴巴国际站关键字搜索 API 实战:从多条件筛选到商品列表高效获客
本文详解了如何通过阿里巴巴国际站的关键字搜索接口实现多条件商品搜索功能,涵盖接口调用、参数设置、分页处理及数据解析,并提供可复用的 Python 实现代码,助力开发者高效构建跨境电商商品搜索系统。
|
10月前
|
Java 计算机视觉
微信虚拟视频聊天插件,QQ抖音快手虚拟摄像头工具,替换相机视频流java
实现包含了虚拟摄像头核心功能,可以捕获真实摄像头视频流,处理后输出到虚拟摄像头设备。
|
开发框架 人工智能 Cloud Native
破茧成蝶:阿里云应用服务器让传统J2EE应用无缝升级AI原生时代
一场跨越20年的技术对话:在杭州某科技园的会议室里,一场特殊的代码评审正在进行。屏幕上同时展示着2005年基于WebLogic开发的供应链系统和2025年接入DeepSeek大模型的智能调度方案——令人惊叹的是,二者的核心业务代码竟保持着惊人的一致性。"我们保住了20年积累的238个核心业务对象,就像修复传世名画时保留了每一笔历史痕迹。"企业CTO的感慨,揭开了阿里云应用服务器助力传统系统智能化转型的奥秘。
434 13
|
10月前
redmibook pro14 2024
redmi book pro14 2024
|
消息中间件 分布式计算 并行计算
Python 高级编程与实战:构建分布式系统
本文深入探讨了 Python 中的分布式系统,介绍了 ZeroMQ、Celery 和 Dask 等工具的使用方法,并通过实战项目帮助读者掌握这些技术。ZeroMQ 是高性能异步消息库,支持多种通信模式;Celery 是分布式任务队列,支持异步任务执行;Dask 是并行计算库,适用于大规模数据处理。文章结合具体代码示例,帮助读者理解如何使用这些工具构建分布式系统。
|
存储 分布式计算 资源调度
什么是Hadoop及其组件?
【8月更文挑战第31天】
1437 1