堆内存分区

内容概述

Java堆通常被划分为新生代老年代两个区域。

  1. 新生代 :绝大多数新创建的对象首先在这里分配内存。新生代内部又分为一个Eden区 和两个Survivor区(From和To)。新对象在Eden区分配。当Eden区没有足够空间进行分配时,将触发一次Minor GC。
  2. 老年代 :在新生代中经历多次GC仍然存活的对象会被移动到老年代。老年代的内存空间一般比新生代大,用于存放生命周期长的对象。当老年代空间不足时,会触发Major GC(或Full GC)。

Java 堆的设计核心在于**"弱分代假说"**:绝大多数对象都是朝生夕死的。

新生代 是高频交易区,采用复制算法。Eden 区负责接纳新对象,一旦满载,触发 Minor GC。存活对象被复制到 Survivor 区,Eden 区直接清空。这种"以空间换时间"的策略,保证了 GC 的高效。

老年代则是长期持有账户。对象在新生代经历多次"洗礼"(默认15次)仍未消亡,即被视为"长期资产",晋升至老年代。这里空间大但回收频率低,一旦空间耗尽,将触发昂贵的 Full GC。

思考一下

问题: 如果系统中的所有对象都变成了"长生不老"的长期对象,堆内存会发生什么?

提示: 思考新生代存在的意义,以及 GC 的频率和停顿时间(STW)会如何变化。

Java堆内存设计的核心理论基础是"弱分代假说",该假说的具体内容是什么?

A对象存活时间越长越容易被回收

B老年代空间必须大于新生代空间

C对象回收频率与内存大小成正比

D绝大多数对象都是朝生夕死的

系统监测到Eden区已满载并触发了Minor GC,此时应采取何种回收策略?

A直接清空Eden区所有对象

B将存活对象复制到Survivor区

C将存活对象移入老年代

D标记后直接清除不移动对象

相关推荐
咖啡八杯1 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
优橙教育1 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
糖果店的幽灵2 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
腻害兔3 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
SeaTunnel3 小时前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel
碎光拾影3 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
Marst Code4 小时前
(python)2026Plotly 库评估:交互式可视化到底值不值得引入?
开发语言·python
Miao121314 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
腻害兔4 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:支付模块 yudao-module-pay,一个让产品经理都看懂的支付中台设计
java·前端·vue.js·产品经理·ai编程
CRMEB系统商城5 小时前
开源自建还是SaaS订阅?算一笔3年经济账
java·大数据·开发语言·开源