一、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 |