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虚拟机规范》
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~