面试题:内存模型与垃圾回收深度解析

JVM内存模型与垃圾回收机制深度解析

一、JVM内存模型全景图

1.1 思维导图概览

JVM运行时数据区 = 线程私有区(程序计数器、虚拟机栈、本地方法栈)+ 线程共享区(堆、方法区/元空间)

JVM内存结构架构图:
#mermaid-svg-Ykt20v9phcEiO4u6{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Ykt20v9phcEiO4u6 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Ykt20v9phcEiO4u6 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Ykt20v9phcEiO4u6 .error-icon{fill:#552222;}#mermaid-svg-Ykt20v9phcEiO4u6 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Ykt20v9phcEiO4u6 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Ykt20v9phcEiO4u6 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Ykt20v9phcEiO4u6 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Ykt20v9phcEiO4u6 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Ykt20v9phcEiO4u6 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Ykt20v9phcEiO4u6 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Ykt20v9phcEiO4u6 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Ykt20v9phcEiO4u6 .marker.cross{stroke:#333333;}#mermaid-svg-Ykt20v9phcEiO4u6 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Ykt20v9phcEiO4u6 p{margin:0;}#mermaid-svg-Ykt20v9phcEiO4u6 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Ykt20v9phcEiO4u6 .cluster-label text{fill:#333;}#mermaid-svg-Ykt20v9phcEiO4u6 .cluster-label span{color:#333;}#mermaid-svg-Ykt20v9phcEiO4u6 .cluster-label span p{background-color:transparent;}#mermaid-svg-Ykt20v9phcEiO4u6 .label text,#mermaid-svg-Ykt20v9phcEiO4u6 span{fill:#333;color:#333;}#mermaid-svg-Ykt20v9phcEiO4u6 .node rect,#mermaid-svg-Ykt20v9phcEiO4u6 .node circle,#mermaid-svg-Ykt20v9phcEiO4u6 .node ellipse,#mermaid-svg-Ykt20v9phcEiO4u6 .node polygon,#mermaid-svg-Ykt20v9phcEiO4u6 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Ykt20v9phcEiO4u6 .rough-node .label text,#mermaid-svg-Ykt20v9phcEiO4u6 .node .label text,#mermaid-svg-Ykt20v9phcEiO4u6 .image-shape .label,#mermaid-svg-Ykt20v9phcEiO4u6 .icon-shape .label{text-anchor:middle;}#mermaid-svg-Ykt20v9phcEiO4u6 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Ykt20v9phcEiO4u6 .rough-node .label,#mermaid-svg-Ykt20v9phcEiO4u6 .node .label,#mermaid-svg-Ykt20v9phcEiO4u6 .image-shape .label,#mermaid-svg-Ykt20v9phcEiO4u6 .icon-shape .label{text-align:center;}#mermaid-svg-Ykt20v9phcEiO4u6 .node.clickable{cursor:pointer;}#mermaid-svg-Ykt20v9phcEiO4u6 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Ykt20v9phcEiO4u6 .arrowheadPath{fill:#333333;}#mermaid-svg-Ykt20v9phcEiO4u6 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Ykt20v9phcEiO4u6 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Ykt20v9phcEiO4u6 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Ykt20v9phcEiO4u6 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Ykt20v9phcEiO4u6 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Ykt20v9phcEiO4u6 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Ykt20v9phcEiO4u6 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Ykt20v9phcEiO4u6 .cluster text{fill:#333;}#mermaid-svg-Ykt20v9phcEiO4u6 .cluster span{color:#333;}#mermaid-svg-Ykt20v9phcEiO4u6 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Ykt20v9phcEiO4u6 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Ykt20v9phcEiO4u6 rect.text{fill:none;stroke-width:0;}#mermaid-svg-Ykt20v9phcEiO4u6 .icon-shape,#mermaid-svg-Ykt20v9phcEiO4u6 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Ykt20v9phcEiO4u6 .icon-shape p,#mermaid-svg-Ykt20v9phcEiO4u6 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Ykt20v9phcEiO4u6 .icon-shape .label rect,#mermaid-svg-Ykt20v9phcEiO4u6 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Ykt20v9phcEiO4u6 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Ykt20v9phcEiO4u6 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Ykt20v9phcEiO4u6 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 堆内存结构
新生代
老年代
Eden区
Survivor区

(From/To)
虚拟机栈结构
栈帧1
栈帧2
...
JVM运行时数据区
线程私有区
线程共享区
程序计数器
虚拟机栈
本地方法栈
堆
方法区/元空间
线程私有

唯一不会OOM的区域
存储栈帧

局部变量表、操作数栈等
为Native方法服务

HotSpot中与虚拟机栈合并
存放对象实例和数组

GC主要区域
存储类信息、常量

静态变量、JIT代码

1.2 面试题1:JVM内存结构包含哪些区域?各区域的作用是什么?

解析:JVM内存结构可分为五大区域,理解它们的职责是排查内存问题的基础。

内存区域 作用 特点 相关JVM参数
程序计数器 保存当前线程执行的字节码行号指示器 线程私有,唯一不会发生OOM的区域 -
虚拟机栈 存储栈帧(局部变量表、操作数栈、动态链接、方法返回地址) 线程私有,栈深度溢出抛StackOverflowError -Xss 设置栈大小
本地方法栈 为Native方法服务 线程私有,HotSpot中与虚拟机栈合并 -
堆 存放对象实例和数组 线程共享,GC主要区域,分代收集 -Xms 初始堆大小 -Xmx 最大堆大小
方法区/元空间 存储类信息、常量、静态变量、JIT编译代码 JDK8前为永久代,JDK8后改为元空间(本地内存) -XX:MetaspaceSize -XX:MaxMetaspaceSize

示例代码:内存区域演示

java 复制代码
public class MemoryDemo {
    private static final String CONSTANT = "常量"; // 方法区/元空间
    private static Object staticObj = new Object(); // 方法区/元空间(引用),对象在堆
    
    public void method() {
        int localVar = 10; // 虚拟机栈 - 局部变量表
        Object obj = new Object(); // obj在虚拟机栈,Object对象在堆
        recursiveMethod(0); // 可能引发StackOverflowError
    }
    
    private void recursiveMethod(int depth) {
        if (depth > 10000) return;
        recursiveMethod(depth + 1); // 递归过深导致栈溢出
    }
}

1.3 面试题2:堆内存为什么要划分为新生代和老年代?

解析:分代收集的理论基础是"弱分代假设"------绝大多数对象朝生夕灭,熬过多次收集的对象难以消亡。

  • 新生代(Young Generation):存放新创建的对象,使用复制算法,Minor GC频率高但停顿时间短

    • Eden区:新对象分配区域
    • Survivor区(From/To):存活对象复制区域
    • 默认比例:Eden:Survivor = 8:1:1(-XX:SurvivorRatio=8)
  • 老年代(Old Generation):存放存活时间长的对象,使用标记-清除或标记-整理算法,Full GC频率低但停顿时间长

    • 默认新生代:老年代 = 1:2(-XX:NewRatio=2)

【趣味类比】 把堆内存想象成一家公司的员工宿舍:

  • 新生代是"实习生宿舍",人员流动快,每天有人入职离职
  • 老年代是"正式员工公寓",人员稳定,但换房成本高

分代管理让"宿舍管理员"(GC)可以针对不同人群采用不同的管理策略。

JVM参数配置示例:

bash 复制代码
# 设置堆内存大小
-Xms2g -Xmx4g

# 设置新生代大小
-XX:NewSize=512m -XX:MaxNewSize=1g

# 设置Survivor区比例
-XX:SurvivorRatio=8

# 设置晋升年龄阈值
-XX:MaxTenuringThreshold=15

二、垃圾回收机制深度剖析

2.1 面试题3:如何判断对象是否可被回收?

问题解析:JVM 采用可达性分析算法来判断对象是否可被回收,而不是使用引用计数法。

1. 可达性分析算法(主流方法)

从一组称为 "GC Roots" 的根对象出发,通过引用链向下搜索,如果一个对象到 GC Roots 没有任何引用链相连(即不可达),则该对象被标记为可回收。

GC Roots 包括:

  1. 虚拟机栈中引用的对象 - 当前线程栈帧中的局部变量表
  2. 方法区中类静态属性引用的对象 - 类的静态变量
  3. 方法区中常量引用的对象 - 字符串常量池中的引用
  4. 本地方法栈中 JNI 引用的对象 - Native 方法中的对象
  5. 所有被同步锁持有的对象 - synchronized 持有的对象
  6. Java 虚拟机内部引用 - 基本类型对应的 Class 对象、常驻异常对象等
2. 引用计数法(非主流)
  • 原理:每个对象维护一个引用计数器,记录被引用的次数
  • 回收条件:引用计数为 0 时立即回收
  • 缺点:无法解决循环引用问题(A 引用 B,B 引用 A,但两者都不被外部引用)
3. 对象回收流程
java 复制代码
// 示例:循环引用场景
class Node {
    Node next;
}

public class ReferenceExample {
    public static void main(String[] args) {
        Node a = new Node();  // GC Root 引用
        Node b = new Node();  // GC Root 引用
        a.next = b;
        b.next = a;
        
        a = null;  // 断开 GC Root 引用
        b = null;  // 断开 GC Root 引用
        // 此时 a 和 b 形成循环引用,但都不可达,会被回收
    }
}
4. 面试要点总结
  • 核心算法:可达性分析(主流 JVM 实现)
  • 关键概念:GC Roots 是判断对象存活的起点
  • 常见误区:引用计数法无法处理循环引用,不是 JVM 的选择
  • 实际应用:理解 GC Roots 有助于排查内存泄漏

提示:可达性分析是"标记-清除"、"标记-复制"、"标记-整理"等垃圾回收算法的基础。

垃圾回收判断流程:
#mermaid-svg-fVnHmfBbzIBnItSo{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-fVnHmfBbzIBnItSo .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-fVnHmfBbzIBnItSo .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-fVnHmfBbzIBnItSo .error-icon{fill:#552222;}#mermaid-svg-fVnHmfBbzIBnItSo .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fVnHmfBbzIBnItSo .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-fVnHmfBbzIBnItSo .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fVnHmfBbzIBnItSo .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fVnHmfBbzIBnItSo .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-fVnHmfBbzIBnItSo .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fVnHmfBbzIBnItSo .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fVnHmfBbzIBnItSo .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fVnHmfBbzIBnItSo .marker.cross{stroke:#333333;}#mermaid-svg-fVnHmfBbzIBnItSo svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fVnHmfBbzIBnItSo p{margin:0;}#mermaid-svg-fVnHmfBbzIBnItSo .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-fVnHmfBbzIBnItSo .cluster-label text{fill:#333;}#mermaid-svg-fVnHmfBbzIBnItSo .cluster-label span{color:#333;}#mermaid-svg-fVnHmfBbzIBnItSo .cluster-label span p{background-color:transparent;}#mermaid-svg-fVnHmfBbzIBnItSo .label text,#mermaid-svg-fVnHmfBbzIBnItSo span{fill:#333;color:#333;}#mermaid-svg-fVnHmfBbzIBnItSo .node rect,#mermaid-svg-fVnHmfBbzIBnItSo .node circle,#mermaid-svg-fVnHmfBbzIBnItSo .node ellipse,#mermaid-svg-fVnHmfBbzIBnItSo .node polygon,#mermaid-svg-fVnHmfBbzIBnItSo .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fVnHmfBbzIBnItSo .rough-node .label text,#mermaid-svg-fVnHmfBbzIBnItSo .node .label text,#mermaid-svg-fVnHmfBbzIBnItSo .image-shape .label,#mermaid-svg-fVnHmfBbzIBnItSo .icon-shape .label{text-anchor:middle;}#mermaid-svg-fVnHmfBbzIBnItSo .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-fVnHmfBbzIBnItSo .rough-node .label,#mermaid-svg-fVnHmfBbzIBnItSo .node .label,#mermaid-svg-fVnHmfBbzIBnItSo .image-shape .label,#mermaid-svg-fVnHmfBbzIBnItSo .icon-shape .label{text-align:center;}#mermaid-svg-fVnHmfBbzIBnItSo .node.clickable{cursor:pointer;}#mermaid-svg-fVnHmfBbzIBnItSo .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-fVnHmfBbzIBnItSo .arrowheadPath{fill:#333333;}#mermaid-svg-fVnHmfBbzIBnItSo .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-fVnHmfBbzIBnItSo .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-fVnHmfBbzIBnItSo .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fVnHmfBbzIBnItSo .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-fVnHmfBbzIBnItSo .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fVnHmfBbzIBnItSo .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-fVnHmfBbzIBnItSo .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-fVnHmfBbzIBnItSo .cluster text{fill:#333;}#mermaid-svg-fVnHmfBbzIBnItSo .cluster span{color:#333;}#mermaid-svg-fVnHmfBbzIBnItSo div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-fVnHmfBbzIBnItSo .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-fVnHmfBbzIBnItSo rect.text{fill:none;stroke-width:0;}#mermaid-svg-fVnHmfBbzIBnItSo .icon-shape,#mermaid-svg-fVnHmfBbzIBnItSo .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fVnHmfBbzIBnItSo .icon-shape p,#mermaid-svg-fVnHmfBbzIBnItSo .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-fVnHmfBbzIBnItSo .icon-shape .label rect,#mermaid-svg-fVnHmfBbzIBnItSo .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fVnHmfBbzIBnItSo .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-fVnHmfBbzIBnItSo .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-fVnHmfBbzIBnItSo :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 可达
不可达
是
否
GC Roots类型
虚拟机栈中

引用的对象
方法区中

静态属性引用
方法区中

常量引用
本地方法栈中

JNI引用
同步锁持有

的对象
JVM内部引用
开始垃圾回收
枚举所有GC Roots
从GC Roots开始

可达性分析遍历
对象是否可达?
标记为存活对象
标记为可回收对象
进入下一轮GC
执行Finalize方法

(如果有)
Finalize后是否重新可达?
移出待回收队列
加入待回收队列
执行垃圾回收算法

(标记-清除/复制/整理)
内存回收完成

2.2 面试题4:常见的垃圾回收算法有哪些?各有什么优缺点?

解析:三种基础算法各有适用场景,现代JVM采用分代收集策略组合使用。

算法 优点 缺点
标记-清除 实现简单,不需要移动对象 产生内存碎片,分配大对象时可能失败
标记-复制 无内存碎片,回收效率高 内存利用率仅50%(需预留空闲空间)
标记-整理 无内存碎片,内存利用率高 需要移动对象,停顿时间较长

2.3 面试题5:对象何时会从新生代晋升到老年代?

解析:对象晋升老年代有四种触发条件:

  1. 年龄阈值 :对象在Survivor区每熬过一次Minor GC,年龄增加1,默认达到15岁(-XX:MaxTenuringThreshold)晋升
  2. 动态年龄判断:如果Survivor区中相同年龄所有对象大小总和大于Survivor区的一半,年龄大于等于该年龄的对象可直接晋升
  3. 大对象直接进入 :-XX:PretenureSizeThreshold参数设置大对象阈值,超过该值直接在老年代分配
  4. 空间分配担保:Minor GC前,JVM检查老年代最大可用连续空间是否大于新生代所有对象总空间,不足时可能提前晋升

2.4 面试题6:常用的垃圾收集器有哪些?如何选择?

解析:JDK8默认Parallel GC,JDK9+默认G1 GC。选择收集器需权衡吞吐量与停顿时间。

收集器 特点 适用场景 启用参数
Serial 单线程,简单高效 客户端模式,内存<100MB -XX:+UseSerialGC
Parallel 多线程,吞吐量优先 后台计算,科学计算 -XX:+UseParallelGC
CMS 低停顿,并发收集 互联网应用,低延迟要求 -XX:+UseConcMarkSweepGC
G1 区域化分代,可预测停顿 大内存(>4G),平衡吞吐与延迟 -XX:+UseG1GC
ZGC 超低停顿(<10ms),可扩展 超大内存(>100G),极致低延迟 -XX:+UseZGC

三、实战案例与性能优化

3.1 面试题7:什么是内存泄漏?如何排查?

解析:内存泄漏指对象不再使用但GC Roots仍可达,导致无法回收。

常见原因及解决方案:

  1. 静态集合类持有对象:如static Map缓存未设置过期策略,应使用WeakHashMap或设置容量上限
  2. 未关闭资源:数据库连接、文件流未close,应使用try-with-resources
  3. 监听器未移除:注册的事件监听器在对象销毁时未移除

排查工具:

  • jmap -dump:format=b,file=heap.hprof PID 生成堆转储
  • MAT(Memory Analyzer Tool)分析 dominator tree,查找大对象
  • VisualVM实时监控堆内存变化趋势

3.2 面试题8:线上服务出现OutOfMemoryError,如何快速定位?

【真实案例】 某电商系统在促销期间频繁OOM,通过以下步骤定位:

  1. 启用OOM时自动dump :-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/logs
  2. 分析dump文件:发现某促销缓存类占用了堆内存的78%
  3. 根因 :缓存未设置TTL,且使用强引用,改为Guava Cache并设置expireAfterWrite(10, MINUTES)后问题解决

3.3 面试题9:什么是直接内存?与堆内存有什么区别?

解析 :直接内存(Direct Memory)不属于JVM堆,通过NIO的DirectByteBuffer分配,受-XX:MaxDirectMemorySize限制。

对比项 堆内存 直接内存
管理方式 受GC管理 绕过JVM堆,不受GC直接管理
分配/回收开销 有GC开销 分配成本高,但减少数据拷贝
I/O性能 数据需拷贝到内核缓冲区 零拷贝,适合大文件读写、网络通信
溢出错误 OutOfMemoryError: Java heap space OutOfMemoryError: Direct buffer memory

3.4 面试题10:JDK8为什么移除永久代,改为元空间?

解析:永久代(PermGen)在JDK8被元空间(Metaspace)取代,核心原因有三:

  1. 内存限制 :永久代大小固定(-XX:MaxPermSize默认64M),动态加载大量类时容易OOM。元空间使用本地内存,默认无上限
  2. GC性能:永久代位于堆中,Full GC时需回收,增加停顿时间。元空间由独立机制管理
  3. 灵活性:元空间可根据类加载需求动态调整,无需手动设置大小
相关推荐
老三牛擦2 天前
订单履约流程
jvm
青春逝如流水2 天前
Java 线程在内存模型(JMM)与 JVM 实现:规范与落地的多元路径
java·开发语言·jvm·多线程·ai文章
colinu2 天前
C++ 异步任务与线程生命周期:`std::async`、`future`、`thread`、`jthread` 与协作式退出
java·jvm·c++
wuminyu2 天前
ForkJoinPool窃取线程在扫描其他WorkQueue时的随机采样算法与Phase线程挂起唤醒机制解析
java·linux·c语言·jvm·c++
DongQiShanRen2 天前
玄龙(上):TICK 主循环——意识心跳怎么跳
linux·jvm·数据库·人工智能·数据挖掘·rust
leisoo80973 天前
融资融券数据怎么查两融指标含义与杠杆观察方法 IG50免费开源股票数据API接口
开发语言·jvm·数据库·python·json
leisoo80973 天前
股票筹码分布怎么用获利比例成本区间与集中度实战 IG50免费开源股票数据API接口
开发语言·jvm·数据库·python·开源
晒太羊的猫3 天前
jvm面试题
jvm
夜之眷属4 天前
Core dump 崩溃排查:JVM 宕机后,那份 core 文件怎么用 gdb 还原现场
java·运维·服务器·jvm
用户094248568034 天前
第31章:JVM字节码解释器与模板解释器源码路径
java·jvm