java代码是如何被执行的

1.总述:

  • ClassFile即是类或接口的定义信息;
  • ClassFile结构+JVM指令集实现了语言无关性和平台无关性;
  • 加载类时生成的Class<Test>对象,是元空间对应类的元数据访问入口
  • JVM解释执行系统是基于栈的指令架构,不同于基于寄存器的指令架构;
  • 程序逻辑都是定义在方法中的,程序过程即是方法的表征与执行过程;
  • 指令像方向盘,栈帧像引擎,栈外数据像汽油;
  • 元空间中指令+栈内栈帧+栈外数据使得过程运转

2.JVM架构图:

3.JAVA对象结构图:

4.分述:

1.内存模型
	程序计数器 - 线程私有
	虚拟机栈区 - 线程私有
		- 栈帧(随方法调用而创建,随方法结束而销毁)
			- 局部变量表
				- 一个slot支持boolean byte char short float reference returnAddress,两个连续slot支持long double
				- 通过索引访问
			- 操作数栈
			- 动态链接 - 符号引用(Symbolic Reference)
				- 其他方法的符号引用
				- 成员变量的符号引用
			- 返回地址
				- 返回时恢复上层方法的局部变量表和操作数栈
				- 调整PC
	本地方法栈 - 线程私有
	方法区(MethodArea)/元空间(Metaspace) - 线程共享
		- 类型(Type: 类、接口、枚举、注解)信息
		- 域(Field)信息
		- 方法(Method)信息
		- JIT代码缓存
		- 运行时常量池(Runtime Constant Pool,类加载后即创建,是每一个类或接口的常量池(Constant_Pool)的运行时表示形式)
			- 字面量(字符串以外)
			- 符号引用(1.7移到native memory,1.8移到metaspace)
	堆区 - 线程共享
		- 字符串常量池(string table)、字符串字面量(interned strings)、静态变量(JDK7后从方法区移至堆区)
		- 实例数据(非静态、非常量的成员变量)
		- 对象的句柄数据(某些JVM实现)
          - 线程分配缓冲区Thread Local Allocation Buffer - 线程私有 2.对象结构 - 对象头 - MarkWord - KlassWord - 数组长度(仅数组) - 实例数据 - 填充数据 3.对象寻址 - 句柄式 - 局部变量表中reference存储堆中的句柄 - 指针式 - 局部变量表中reference存储对象指针 4.字节码指令分类 - 加载和存储指令(局部变量表和操作数栈之间传输数据) - 局部变量加载 iload iload_<n> lload fload dload aload - 存储 istore istore_<n> lstore fstore dload aload - 常量加载 bipush sipush ldc ldc_w ldc2_w aconst_null iconst_ml iconst_<i> lconst_<i> fconst_<i> dconst_<i> - 运算指令 - 类型转换指令 - 对象创建与访问指令 - 创建 new newarray anewarray multianewarray - 访问 getfield putfield getstatic putstatic - 数组操作 - baload caload saload iaload faload daload aaload - bastore castore iastore sastore fastore fastore dastore aastore - arraylength - 检查类实例类型 instanceof checkcast - 操作数栈管理指令 - 出栈 pop、pop2 - 入栈 dup、dup2、dup_x1 dup2_x1 dup_x2 dup2_x2 - 栈顶交换 swap - 控制转移指令 - 方法调用和返回指令 - invokevirtual invokeinterface invokespecial(特殊处理的实例方法,如实例的初始化方法,私有方法和父类方法) invokestatic invokedynamic(用户定义指令分派逻辑) - ireture lreturn freturn dreturn areturn return - 异常处理指令 - athrow - 同步指令 - monitorenter monitorexit

 

参考:

从Java虚拟机规范看HotSpot虚拟机的内存结构和变迁【靠谱】  https://blog.csdn.net/weixin_43001913/article/details/115258341

虚拟机字节码执行引擎 https://blog.csdn.net/weixin_39700215/article/details/111361110

方法区 https://blog.csdn.net/zuodaoyong/article/details/107031191

https://www.jianshu.com/p/59f98076b382

指令 https://www.cnblogs.com/qlqwjy/p/7598879.html

属性表与CODE属性 https://blog.csdn.net/helianus/article/details/92079985

从内存布局来理解字符串比较 https://blog.csdn.net/zzzgd_666/article/details/87999870

《Java虚拟机规范》

posted @ 2021-04-15 11:17  小天儿  阅读(186)  评论(0)    收藏  举报