#P5208. 分代GC模拟器
-
1000ms
Tried: 7
Accepted: 3
Difficulty: 7
所属公司 :
核心
时间 :2026年5月13日考试
算法与标签>模拟
分代GC模拟器
解题思路
用两个列表维护新生代 / 老年代对象 id,并用哈希表存每个对象的 cnt 与是否可回收。
- createObject:放入新生代;若数量 ≥
youngSize,立即执行新生代 GC。 - 新生代 GC:先删可回收 → 剩余
cnt++→cnt>=2晋升老年代。 - 老年代 GC:删可回收 → 剩余
cnt++(不晋升)。 - getLiveObjects:按
(-cnt, -id)排序输出。
题目内容
在某编程语言中,分代垃圾回收是一种重要的内存管理策略。请模拟一个简易的分代垃圾回收系统,用于创建和回收(删除)对象。内存被划分为两个代际区域:
- 新生代:用于存放新创建的、可能很快被释放的对象
- 老年代:用于存放存活时间较长的对象
每个对象具有:
- 状态:可回收 或 不可回收
- cnt:表示该对象已经历的垃圾回收(GC)次数
垃圾回收机制
新生代垃圾回收
触发条件:
- 手动触发新生代 GC
- 加入一个对象后,新生代对象总数大于等于设定阈值时
执行步骤:
- 先回收(删除)新生代中所有当前状态为「可回收」的对象
- 对新生代中剩余对象,将其
cnt加 1 - 将所有
cnt >= 2的对象移入老年代
老年代垃圾回收
触发条件:
- 手动触发老年代 GC
执行步骤:
- 回收(删除)老年代中所有当前状态为「可回收」的对象
- 对老年代中剩余对象,将其
cnt加 1
需要实现的接口
GCSystem(int youngSize):系统初始化。youngSize为新生代对象数量阈值(用于自动触发新生代 GC)createObject(int objectId):创建标识为objectId的新对象,放入新生代;初始cnt为 0,状态为不可回收。(加入对象后可能触发新生代 GC)markObjects(int[] objectIds):将给定标识对应的对象标记为可回收manualGC(int generation):手动触发指定代际区域的 GC。generation = 0表示新生代,generation = 1表示老年代getLiveObjects(int generation):返回指定代际区域中当前存活对象的标识序列- 排序规则:先按
cnt降序,cnt相同时按objectId降序 - 若该区域无对象,返回空序列
[]
- 排序规则:先按
输入描述
每行表示一次函数调用。初始化函数 GCSystem 仅首行调用一次。
generation:0表示新生代,1表示老年代- 输入保证:
objectId全局唯一;markObjects中的标识均对应已存在对象
输出描述
对每次函数调用,按调用顺序输出返回值:
GCSystem/createObject/markObjects/manualGC返回nullgetLiveObjects返回对象标识列表(按上述排序规则)
样例1
(本样例根据题意构造,用于展示自动新生代 GC 与晋升。)
输入:
GCSystem(3)
createObject(1)
createObject(2)
createObject(3)
getLiveObjects(0)
createObject(4)
getLiveObjects(0)
getLiveObjects(1)
输出:
null
null
null
null
[3, 2, 1]
null
[4]
[3, 2, 1]
解释:
youngSize = 3- 创建对象 1、2 后,新生代数量为 2,未触发 GC
- 创建对象 3 后,新生代数量为 3,触发新生代 GC:无可回收对象;1、2、3 的
cnt均变为 1;无人晋升 getLiveObjects(0):三者cnt均为 1,按objectId降序得[3, 2, 1]- 创建对象 4 后,新生代数量为 4,再次触发新生代 GC:1、2、3、4 的
cnt分别变为 2、2、2、1;cnt >= 2的 1、2、3 晋升到老年代,新生代仅剩 4 getLiveObjects(0)为[4];getLiveObjects(1)中三者cnt均为 2,按objectId降序得[3, 2, 1]
样例2
(本样例根据题意构造,用于展示标记回收、手动 GC 与老年代 GC。)
输入:
GCSystem(2)
createObject(10)
createObject(20)
markObjects([10])
createObject(30)
getLiveObjects(0)
getLiveObjects(1)
manualGC(1)
getLiveObjects(1)
markObjects([20])
manualGC(1)
getLiveObjects(1)
输出:
null
null
null
null
null
[30]
[20]
null
[20]
null
null
[]
解释:
- 创建 10 后数量为 1,未触发 GC
- 创建 20 后数量为 2,触发新生代 GC:10、20 的
cnt变为 1 - 将 10 标记为可回收
- 创建 30 后数量为 3,触发新生代 GC:先回收 10;剩余 20、30 的
cnt变为 2、1;20 晋升到老年代,新生代剩 30 getLiveObjects(0)为[30],getLiveObjects(1)为[20]- 手动老年代 GC:无可回收对象,20 的
cnt变为 3 - 将 20 标记为可回收后再手动老年代 GC:回收 20,老年代为空
请从“运行结果”或“历史提交”选择一条记录并点击「开始AI分析」
选择提交后点击「开始AI分析」