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

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. 灵活性:元空间可根据类加载需求动态调整,无需手动设置大小
相关推荐
cfm_29144 小时前
JVM底层源码深度解析:读写屏障(Read/Write Barrier)
jvm
wuminyu5 小时前
Java世界中StringTable源码剖析
java·linux·c语言·jvm·c++
醉颜凉6 小时前
Elasticsearch性能优化:JVM GC调优全攻略,彻底解决集群卡顿、吞吐量下降问题
jvm·elasticsearch·性能优化
顺风尿一寸8 小时前
从 Java 到内核:探秘线程改名的完整路径
jvm
lihao lihao9 小时前
linux线程
java·开发语言·jvm
南极企鹅1 天前
JVM-编译执行过程
jvm
苏克贝塔1 天前
.NET开发之.net framework对比.net core
jvm
cfm_29141 天前
JVM垃圾收集算法与收集器深度解析
jvm·测试工具·算法·性能优化
自律懒人1 天前
AI Agent 工作流编排实战:从单 Agent 到多 Agent,手搭一套能跑通的协作系统
jvm