1.Java虚拟机的组成
类加载器,运行时数据区域,执行引擎,本地接口
2.字节码文件的组成
1.魔数
2.主副版本号
3.常量池
作用:避免相同的内容重复定义,节省空间。
常量池中的数据都有一个编号,编号从1开始。在字段或者字节码指令中通过编号可以快速的找到对应的数据。
⚫
字节码指令中通过编号引用到常量池的过程称之为
符号引用
4.方法
字节码指令的内容存放在方法的Code属性中
iload:
复制了一份放入操作数栈
中。在局部变量
表数组中还有数据。
1.i++执行流程
![](https://img-blog.csdnimg.cn/direct/474aa6040b954d50909e8bef5f82eb56.png)
![](https://img-blog.csdnimg.cn/direct/6e6021dc2f30427e98a5ec144ff54c1d.png)
2.++i执行流程
5.如何查看字节码文件?
⚫
本地文件可以使用jclasslib工具查看,开发环境使用jclasslib插件。
⚫
服务器上文件使用javap命令直接查看,也可以通过arthas的dump命令导
出字节码文件再查看本地文件。还可以使用jad命令反编译出源代码。
3.类的生命周期
1.为什么在方法区和堆中都需要复制一份对象
2.查看内存中的对象
JDK自带的hsdb
工具查看Java虚拟机内存信息。工具位于JDK安装目录下lib文件夹中的sa-jdi.jar中。
⚫
启动命令:java -cp sa-jdi.jar sun.jvm.hotspot.HSDB
静态变量存放在堆区中的class文件中。
3.连接-验证
4.准备-赋初始值
5.初始化
clinit
方法中的执行顺序与
Java
中编写的顺序是一致的。
![](https://img-blog.csdnimg.cn/direct/750948412dbb4eb49ec002a2f442c55b.png)
1.面试题
![](https://img-blog.csdnimg.cn/direct/f4a5632316c548aaa751cfbba7703f53.png)
![](https://img-blog.csdnimg.cn/direct/2e3db759f8244dfeb0ab600aa06b0955.png)