JVM 03

发布于:2025-03-25 ⋅ 阅读:(37) ⋅ 点赞:(0)

今天是2025/03/24 15:21 day 11

总路线请移步主页Java大纲相关文章

今天进行JVM 5,6 个模块的归纳

首先是JVM的相关内容概括的思维导图

5. 优化技术

JVM通过多种优化技术提升程序执行效率,核心围绕热点代码检测编译优化实现动态性能提升。

热点代码检测

JVM通过统计代码执行频率识别“热点代码”(频繁执行的代码段),触发即时编译(JIT)优化:

  1. 方法调用计数器

    • 统计方法被调用的次数。

    • 默认阈值:客户端模式(C1编译器)1500次,服务端模式(C2编译器)10000次。

    • 超过阈值后,JIT编译器将方法编译为本地机器码,替换解释执行。

  2. 回边计数器

    • 统计循环体(如forwhile)的循环次数(“回边”指跳转到循环起始的指令)。

    • 触发标准:默认阈值与模式相关(例如C1为13995次)。

    • 达到阈值后,JIT会编译整个循环或方法,优化循环性能(如循环展开)。

编译优化

JIT编译器对热点代码进行深度优化,关键技术包括:

  1. 方法内联(Inlining)

    • 将小方法的调用替换为方法体代码,消除方法调用的栈帧开销。

    • 例如:a() { b(); } → 直接展开b()的代码到a()中。

    • -XX:MaxInlineSize参数控制(默认35字节以下方法可内联)。

  2. 逃逸分析(Escape Analysis)

    • 分析对象的作用域是否“逃逸”出方法或线程:

      • 未逃逸:对象仅在方法内使用 → 栈上分配(避免堆内存分配和GC压力)。

      • 线程逃逸:对象被其他线程访问 → 需同步处理。

      • 方法逃逸:对象作为返回值传递给其他方法 → 需堆分配。

    • 若对象未逃逸,JVM可能进一步进行标量替换(将对象拆解为基本类型字段存储)。

  3. 锁消除(Lock Elision)

    • 基于逃逸分析,若对象未逃逸当前线程,移除不必要的同步锁。

    • 例如:synchronized(new Object()) { ... }中的锁无实际竞争,会被直接移除。


6. 其他

JVM参数配置

关键参数直接影响内存布局和GC行为:

  1. 堆内存设置

    • -Xms:堆初始大小(如-Xms512m)。

    • -Xmx:堆最大大小(如-Xmx4g)。

    • 建议两者设为相同值,避免堆动态调整引发的性能波动。

  2. 代比例调整

    • -XX:NewRatio:老年代与年轻代的比例(默认2,即老年代占2/3,年轻代占1/3)。

    • -XX:SurvivorRatio:Eden区与Survivor区的比例(默认8,即Eden:S0:S1=8:1:1)。

  3. 元空间设置(Java 8+)

    • -XX:MetaspaceSize:元空间初始大小(默认约21MB)。

    • -XX:MaxMetaspaceSize:元空间最大大小(默认无限制,但受物理内存限制)。

OOM错误类型
  1. Heap OOM

    • 原因:堆内存不足,无法分配新对象(如大数组、内存泄漏)。

    • 排查:通过Heap Dump分析对象占用(MAT、VisualVM工具)。

  2. StackOverflowError

    • 原因:线程请求的栈深度超过JVM限制(如无限递归)。

    • 相关参数-Xss调整线程栈大小(默认1MB,Linux/x64)。

  3. Metaspace OOM

    • 原因:加载的类元数据超过元空间容量(如动态生成大量类)。

    • 典型场景:反射、CGLIB动态代理、大量JSP编译。