一、JVM指令集详解
1. 栈和局部变量操作
常量压入指令
| 指令 | 功能说明 |
|---|---|
aconst_null |
压入null对象引用 |
iconst_m1 |
压入int类型常量-1 |
bipush |
压入8位带符号整数 |
ldc |
从常量池加载项到栈 |
局部变量存取指令
- 装载指令 :
iload(int)、aload(引用类型)、iaload(从数组加载int) - 存储指令 :
istore(存入int)、astore(存入引用)、iastore(存入int数组)
通用栈操作
java
dup // 复制栈顶一个字长内容
pop2 // 弹出栈顶两个字长内容
swap // 交换栈顶两个字长内容
2. 类型转换与运算
类型转换
java
i2l // int → long
f2d // float → double
i2b // int → byte
运算指令
| 类型 | 加法 | 乘法 | 取余 |
|---|---|---|---|
| 整数 | iadd |
imul |
irem |
| 浮点数 | fadd |
fmul |
frem |
| 长整型 | ladd |
lmul |
lrem |
3. 对象与数组操作
java
new // 创建新对象
checkcast // 验证对象类型
arraylength // 获取数组长度
multianewarray // 分配多维数组
4. 控制流与异常
条件跳转
java
ifeq // 等于0时跳转
ifnonnull // 非null时跳转
tableswitch // 索引跳转表
异常处理
java
athrow // 抛出异常
jsr // 跳转到finally子例程
二、VisualGC插件安装与使用
1. 插件安装流程
- 访问新地址:https://visualvm.github.io/index.html
- 在JDK的
jvisualvm中:- Tools → Plugins → Settings
- 替换URL为对应JDK版本的插件中心地址
- 安装
VisualGC插件并重启
2. 可视化界面解析
三大部分功能
| 区域 | 功能说明 |
|---|---|
| Spaces | 内存分布:Perm, Old, Eden, S0, S1 |
| Graphs | 详细内存指标监控 |
| Histogram | Survivor区年龄分布柱状图 |
关键参数示例
java
-XX:PermSize=128m -XX:MaxPermSize=256m // Perm区配置
-Xms512m -Xmx512m -Xmn100m // 堆内存配置
-XX:SurvivorRatio=8 // Eden与Survivor比例
三、JVM内存模型与调优
1. 内存参数设置
Spring Boot示例
java
java -Xms3072M -Xmx3072M -Xmn2048M -Xss1M
-XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M
-jar app.jar
元空间优化建议
将
MetaspaceSize和MaxMetaspaceSize设为相同值,避免扩容触发Full GC。
2. 调优核心原则
-
对象分配策略
- 优先在新生代(Eden区)分配对象
- 避免频繁对象晋升到老年代
-
线程栈控制
java-Xss1M // 栈大小影响可创建线程数 -
Full GC规避策略
- 合理设置新生代/老年代比例(如
-Xmn占堆70%) - 监控
Old Gen内存增长趋势
- 合理设置新生代/老年代比例(如
3. 百万级系统配置参考
java
-Xms3072M -Xmx3072M // 堆固定3GB
-Xmn2048M // 新生代2GB
-XX:SurvivorRatio=8 // Eden:S0:S1=8:1:1
-XX:MaxMetaspaceSize=512M
阿里调优面试题:通过控制对象生命周期和内存分配策略,可大幅降低Full GC频率。
附录:JVM指令速查表
| 类别 | 常用指令示例 |
|---|---|
| 逻辑运算 | iand, ior, ixor |
| 方法调用 | invokevirtual, invokestatic |
| 返回指令 | ireturn, dreturn |