jvm学习笔记-001

本文详细介绍了Java命令的使用,如`javac`、`java`和`javap`,并以`compute()`方法为例,解析了字节码执行流程。从编译.java文件到JVM内存结构,包括线程栈、局部变量表和操作数栈的工作原理。最后,讨论了方法执行完成后内存的释放,以及GC优化的相关话题。
摘要由CSDN通过智能技术生成

## 常用java命令
javac :编译java代码。
java:运行编译后的字节码文件,.class文件。
javap -c :查看字节码文件
备注:查看字节码文件执行过程参照《jvm命令指令文档》

名称解释

线程栈:栈为每个线程分配内存,所以更像是线程。习惯叫它线程栈。
局部变量表:存放局部变量
操作数栈:数据操作
动态链接:
方法出口:

字节码执行流程

以Compute()方法为例
原方法如下:
public int compute() {
int a = 1;
int b = 2;
int c = a * b * 10;
return c;
}
编译后的字节码文件如下:
public int compute();
Code:
0: iconst_1 将int类型常量1压入栈 //将a 压入栈中
1: istore_1 将int类型值存入局部变量1 // 将1赋值给a
2: iconst_2 将int类型常量2压入栈 //将 b压入栈中
3: istore_2 将int类型值存入局部变量2 //将2赋值给b
4: iload_1 从局部变量1中装载int类型值 //从a装载1
5: iload_2 从局部变量2中装载int类型值 //从b装载2
6: imul 执行int类型的乘法 ab
7: bipush 10 送到栈顶
9: imul 乘 a
b10
10: istore_3 将int类型值存入局部变量3 //a
b*10存入局部变量3中
11: iload_3 从局部变量3中装载int类型值 将局部变量赋值给3

Jvm结构图

第一次画,请多指教
在这里插入图片描述
执行流程描述:
1: 通过javac命令将.java文件进行编译生成.class字节码文件。
2:通过jvm中类加载子系统进行加载(classLoader)
3:执行main方法,jvm为main主线程分配栈内存空间
4:秉承栈的特点FIOU main方法栈帧分配的栈帧内存压入栈底。
5:compute()方法也分配了对应的栈帧。
6:main栈帧局部变量表中存储main方法的局部变量地址。
对象存放在堆中。
7:compute()栈帧中 局部变量表中存在了 a,b,c变量。
8:操作数栈用于a,b,c的操作。
9:compute()方法执行完成,跳出栈释放内存。
10:main()方法在compute()方法之后执行完成,跳出栈释放内存。
11:堆中的对象没有引用,通过minor GC将内存释放。
11:到此执行流程结束。

下一个文章记录频繁GC的场景及如何优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值