.java 是怎么样跑起来的

140 阅读3分钟

WechatIMG70.jpeg

上图是整个.java 整个启动过程;

1 .java

是Java 编译器认识的原文件(偏向人类思维的文件)

顺带说下 编译器:将一种语言文件 转化为另一种的计算机可认知的语言规范,

2 .Class

经过 编译器编译成jvm认识的字节码文件,是Java 虚拟机认识可加载的文件,

class 有两者数据结构:

  • u : 代表基本类型和无符号数据
  • _info:多个无符号数据和其他info 表的 共同构成的表,classs 本身也是info 表

info 表内的结构🈶️一定顺序组成,并是固定顺序 魔数-》版本号-》常量池-》访问标记-》类/父类/接口-》字段描述集合-》方法描述集合-》属性描述集合

  • 魔数:用来标记是否是 class
  • 版本号:用来标记class 文件的所对应的版本号
  • 常量池:类的名称、父类的名称、类中的方法名、参数名称、参数类型,具体的tag代表,可以去官网查看
  • 访问标记:类,常量等的访问信息等;
  • 类/父类/接口;访问标志代表类或者接口的访问信息,比如:该 class 文件是类还是接口,是否被定义成 public,是否是 abstract,如果是类,是否被声明成 final 等等
  • 字段描述: 字段的相关信息,名字和类型,权限等;
  • 方法描述:和字段描述类似
  • 属性描述: 方法内字段的属性信息 对应的信息如何查,可以去Java 虚拟机相关表内去查字典

3. 虚拟机栈

jvm 运行时期私有的栈;长伴随,

  • StackOverFlowError: 请求的栈深度过深
  • OutOfMemoryError:内存溢出

存放在栈内的叫栈桢,栈桢是数据结构(桶形式),存储执行虚拟机方法(标记执行); 每个栈桢内包含:

  • 常量区: 存放方法的常量
  • 操作栈: 执行操作方法的行为记录
  • 动态链接:一个方法的标记在方法内存中,另一个方便调用
  • 返回方法区: 一个方法结束,返回到开始的地方,执行程序的顺性执行

4. 程序计数器

当多cpu 多线程的对同一方法的时,来标记程序运行的进度,当切回线程运行

5. 本地方法栈

本地方法栈和上面介绍的虚拟栈基本相同,只不过是针对本地(native)方法。在开发中如果涉及 JNI 可能接触本地方法栈多一些,在有些虚拟机的实现中已经将两个合二为一了——HotSpot

6 堆

性质:共享 我们比较了解的jvm 比较大的内存,存放实例对象:由于对象大量存在,所以也是GC 垃圾回收器的主战场,我们也可以说是GC堆,

方法区

性质:共享 类信息(版本、字段、方法、接口)、常量、静态变量、即时编译器编译后的代码和数据