JVM-相关内容

JVM内存模型
├── 线程私有区
│ ├── 程序计数器(记录当前线程正在执行的字节码指令地址)
│ ├── 虚拟机栈(存储局部变量表、操作数栈、动态链接和方法出口等信息‌)
│ └── 本地方法栈(服务于native方法)
└── 线程共享区
├── 堆(新生代、老年代)
└── 方法区(类信息、运行时常量池等)

 
java组成:
类信息、方法信息、运行时常量池
新生代、老年代
程序计数器:字节码指令地址
虚拟机栈:局部变量、方法出口等信息 

 

 

 

以下是JDK 8中常用的JVM调优参数分类及说明:

一、堆内存参数

  1. ‌基础堆设置‌

    • -Xms:初始堆大小(如-Xms4g12
    • -Xmx:最大堆大小(建议与-Xms相同以避免动态扩容性能波动)23
    • -Xmn:新生代大小(如-Xmn1g38
  2. ‌分代比例‌

    • -XX:NewRatio:老年代与新生代比例(默认2:1)18
    • -XX:SurvivorRatio:Eden区与Survivor区比例(默认8:1:1)18

二、元空间参数(替代永久代)

  • -XX:MetaspaceSize:初始元空间大小(如256m23
  • -XX:MaxMetaspaceSize:元空间上限(防止内存泄漏)28

三、垃圾回收器选择

  1. ‌常用回收器‌

    • -XX:+UseParallelGC:并行收集器(默认,适合高吞吐量)78
    • -XX:+UseConcMarkSweepGC:CMS收集器(低延迟场景)48
    • -XX:+UseG1GC:G1收集器(JDK 8u20+推荐)37
  2. ‌调优参数‌

    • -XX:MaxGCPauseMillis:目标最大GC停顿时间(如200ms78
    • -XX:ParallelGCThreads:并行GC线程数(默认与CPU核数相同)8

四、监控与日志

  • -XX:+PrintGCDetails:打印详细GC日志38
  • -XX:+HeapDumpOnOutOfMemoryError:OOM时自动生成堆转储8
  • -XX:HeapDumpPath:指定堆转储文件路径8

五、调优建议

  1. ‌堆内存‌:-Xms-Xmx设为相同值(如-Xms4g -Xmx4g28
  2. ‌元空间‌:必须设置MaxMetaspaceSize(如512m23
  3. ‌GC选择‌:高吞吐量选ParallelGC,低延迟选CMSG178

注:参数需结合应用场景(如Web服务/大数据处理)和硬件配置调整58。

 

元空间(Metaspace)是JDK 8引入的用于存储类元数据的内存区域,取代了原有的永久代(PermGen),其核心特点和机制如下:

一、基本定义

  • ‌存储内容‌:存放类的元数据(如类信息、方法代码、常量池等)48
  • ‌内存位置‌:使用本地内存(Native Memory)而非JVM堆内存56

二、与永久代的区别

  1. ‌动态扩展‌

    • 永久代有固定大小(通过-XX:PermSize设置),易引发OutOfMemoryError7
    • 元空间默认无上限,按需动态分配本地内存78
  2. ‌垃圾回收机制‌

    • 永久代GC效率低且易产生碎片7
    • 元空间由JVM自动管理,触发Full GC时进行类卸载(回收未被引用的类加载器及元数据)18

三、关键参数

  • -XX:MetaspaceSize:初始容量阈值,达到后触发GC18
  • -XX:MaxMetaspaceSize:限制最大容量(避免本地内存耗尽)17

四、优势总结

  • ‌避免内存溢出‌:动态分配减少PermGen space错误78
  • ‌性能优化‌:降低内存碎片,提升类加载/卸载效率7
  • ‌简化调优‌:无需手动设置永久代大小78

注:元空间的设计借鉴了JRockit等JVM的实现6。

 

Java元空间(Metaspace)是JVM用于存储类元数据的内存区域,主要存储以下内容25:

  1. ‌类元数据‌
  • 类名、访问修饰符、父类信息、接口信息
  • 字段信息(名称、类型、修饰符等)
  • 方法信息(方法名、返回类型、参数列表等)
  1. ‌常量池‌
  • 字符串常量
  • 类和接口的全限定名
  • 字段和方法的符号引用6
  1. ‌方法字节码‌
  • 编译后的方法字节码
  • 异常处理表
  • 局部变量表5
  1. ‌其他运行时数据‌
  • 静态变量(但静态变量值本身存储在堆中)
  • 即时编译器(JIT)编译后的本地代码6
  • 反射相关的元数据5

与永久代(PermGen)相比,元空间使用本地内存而非JVM堆内存,可以动态扩展且不易出现内存溢出48。在Java 8之后,类的元数据不再存储在永久代中,而是移到了元空间2。

设置jvm参数的时候还是需要设置元空间初始大小,避免不够的时候分配,影响性能 。-XX:MetaspaceSize

 

 

G1(Garbage-First)垃圾回收器通过统一的内存管理机制同时处理新生代和老年代,其核心机制和配置要点如下:


‌一、回收机制‌

  1. ‌内存划分‌

    • 将堆划分为多个固定大小的Region(默认约2048个,每个1MB~32MB)67
    • Region可动态分配为Eden、Survivor、Old或Humongous(大对象专用)区域78
  2. ‌回收模式‌

    • ‌Young GC‌
      • 触发条件:Eden区占满时56
      • 过程:存活对象复制到Survivor或晋升到Old区,采用复制算法68
    • ‌Mixed GC‌
      • 触发条件:老年代占用超过IHOP阈值(默认45%)6
      • 过程:选择性回收老年代Region(优先垃圾最多的Region),同时处理新生代24
  3. ‌并发处理‌

    • 通过并发标记阶段减少STW时间,老年代回收与用户线程并发执行18

‌二、是否需要额外设置‌

  1. ‌基础启用‌

    • 仅需添加JVM参数:-XX:+UseG1GC(JDK9+默认启用)7
  2. ‌关键调优参数‌

    • ‌停顿时间控制‌
      • -XX:MaxGCPauseMillis=200(目标停顿时间,默认200ms)18
    • ‌Region大小‌
      • -XX:G1HeapRegionSize=4m(需为2的幂次方)7
    • ‌老年代回收阈值‌
      • -XX:InitiatingHeapOccupancyPercent=45(IHOP阈值,默认45%)6
    • ‌并行线程数‌
      • -XX:ParallelGCThreads=N(根据CPU核心数调整)5
  3. ‌特殊场景配置‌

    • 大对象处理:Humongous区默认自动管理,无需单独设置7
    • 混合GC触发频率:通过-XX:G1MixedGCCountTarget调整混合GC周期次数4

‌三、与传统收集器的区别‌

  • ‌无需组合‌:单G1即可管理全堆,无需像CMS需搭配ParNew36
  • ‌逻辑分代‌:物理上无连续分代空间,仅通过Region角色区分27

若需进一步优化,建议结合GC日志分析(-Xlog:gc*)调整参数15。

 

 

posted on 2025-04-18 20:42  Hi Martin  阅读(41)  评论(0)    收藏  举报