源文件和字节码的组成方式

源文件: 拓展名后跟java的文件即java的源文件.

Java 源码编译由以下三个过程组成:

1、分析和输入到符号表

2、注解处理

3、语义分析和生成class文件

流程图如下所示:

字节码:拓展名后跟class的文件即java的字节码文件.

最后生成的class文件由以下部分组成:

  • 结构信息。class文件由class文件格式,版本号以及各部分的数量和大小信息组成。

  • 元数据。java的源码中的声明和常量信息,包含了父类,实现接口,声明,作用域和常量池

  • 方法信息。java源码中语句和表达式对应的信息,包含字节码,异常处理器表,求值栈,求值栈的类型记录,局部变量区大小,调试符号信息

Java编译机制和运行机制

Java编译运行机制流程图:

第一步(编译):首先创建源文件,创建完源文件后从JVM中的java编译器编译成.class文件.java编译一个类时,如果这个类所依赖的类还没有被编译,编译器会自动的先编译这个所依赖的类,然后引用。如果java编译器在指定的目录下找不到该类所依赖的类的 .class文件或者 .java源文件,就会报"Cant found sysbol"的异常错误。

第二步(运行):java类运行的过程大概分为两个步骤:(1)类的加载 (2)类的执行。需要说明的一点的是:JVM主要在程序第一次运行时主动使用类的时候,才会立即去加载。换言之,JVM并不是在运行时就会把所有使用到的类都加载到内存中,而是用到,不得不加载的时候,才加载进来,而且只加载一次!

根据上面的程序,详解该程序运行的详细步骤:

(1)在类路径下找到编译好的 java 程序中得到 Test.class 字节码文件后,在命令行上敲 java Test,系统就会启动一个 JVM 进程,JVM进程从classpath

路径下找到一个名为Test.class的二进制文件,将Test.class文件中的类信息加载到运行时数据区的方法区中,这一过程叫做类的加载。(只有类信息在方法区

中,才能创建对象,使用类中的成员变量)

(2)JVM 找到main方法的主函数入口, 持有一个指向当前类(Test)常量池的指针,而常量池中的第一项是发现是一个对Animal对象的符号引用,并且

main方法中第一条指令是Animal animal = new Animal("super_yc"),就是让JVM创建一个Animal对象,但是方法区中还没有Animal类的类信息,于是

JVM就要马上的加载Animal类,将Animal类信息放入到方法区中,于是JVM 以一个直接指向方法区 Animal类的指针替换了常量池中第一项的符号引用。

(3)加载完Animal类的信息以后,JVM虚拟机就会在堆内存中为一个Animal类实例分配内存,然后调用其构造函数初始化Animal实例,这个实例持有指向

方法区的Animal类的类型信息(其中包含有方发表,java动态绑定的底层实现)的引用。(animal指向了Animal对象的引用会自动的放在栈中,字符串常量

"super_yc"会自动的放在方法区的常量池中,对象会自动的放入堆区)

(4)当使用 animal.pringName()的时候,JVM根据栈中animal引用找到Animal对象,然后根据Animal对象持有的引用定位到方法区中Animal类的类型

信息方法表,获得pringName()函数的字节码地址,然后开始运行函数。

最新文章

  1. 取两个String数组的交集
  2. 等宽字体延伸到的 ch 长度单位和动画 animation-timing-function
  3. thinkphp 实现无限极分类
  4. #使用while循环输入1 2 3 4 5 6 8 9 10
  5. 开始安装 ASP.NET (4.0.30319.18408)。 出现了错误: 0x8007b799 必须具有此计算机的管理员权限才能运行此工具
  6. 《从零开始学习jQuery》及《jQuery风暴》学习笔记
  7. Banach—steinhaus定理的应用
  8. 关于.NET编译的目标平台(AnyCPU,x86,x64)
  9. c# 关于10进制和16进制转换以及显示
  10. javascript将base64编码的图片数据转换为file并提交
  11. python 时间转换相关
  12. 教你一招:更新/替换系统 hosts,轻松访问国外站点
  13. shell 整数条件判断
  14. Unity中UI界面颤抖解决方法
  15. 2.1Python基础语法(一)之注释与数据类型:
  16. ubuntu下安装android sdk运行模拟器出现错误:
  17. 查看linux系统类型、版本、位数
  18. day01(静态、代码块、类变量和实类变量辨析 )
  19. python编译模块为2禁制
  20. 跟我学Spring3(9.1):Spring的事务之数据库事务概述

热门文章

  1. iPad Pro 10.5+Apple Pencil之专注文献阅读与笔记效率的App综述
  2. qt窗口的切换
  3. Html5本地存储和本地数据库
  4. elk安装配置
  5. iterm2 快捷键大全
  6. java设计模式-----1、简单工厂模式
  7. linux下安装jdk,tomcat以及mysql
  8. <url-pattern>/</url-pattern>和<url-pattern>/*</url-pattern>区别
  9. Codeforces785E - Anton and Permutation
  10. gogogo