java执行原理

学了那么就java却一直不清楚java代码的运行过程,现在写篇博客,对java的执行过程做一下简单的分析。

究竟什么是java语言呢,sun给出了定义:一种简单的,面相对象,跨平台,半编译半解释,健壮,安全,性能高,多线程的动态语言。

清楚定义之后来看看java的开发流程。Java是一种高级语言,平时我们所写出来的是面对开发者的,而计算机并无法识别,我们叫它源代码,那怎样才能让计算机识别这些源代码呢。首先要利用java编译器(jdk自带的工具)将源代码转换成字节码(.class文件),这个过程就是编译。但编译后的这些字节码仍不能直接在计算机上运行,这些.class文件是面相虚拟机(JVM)的,只有虚拟机才能读懂它,然后虚拟机对这些字节码进行翻译,根据具体计算机的平台把它们翻译成对应机器指令,再由计算机来执行。这就是为什么要在电脑上运行java代码时首先要安装虚拟机。因为虚拟机和java必要的类库构成了java的运行环境。

我们所学的任何一门计算机语言几乎都是从hello world 开始的,下面我们通过一张图来看看一个java代码的运行过程。



HelloWorld

新建记事本,将后缀名改成.java,编写代码,这里要注意两点:1后缀名必须为.java2文件名必须和类名相同。然后通过编译器编译成面向虚拟机的字节码(javac HelloWorld.java),在这一步之前,无论你是在任何平台上都是一样的,没有差异,因为任何平台上的虚拟机都是一样的,这也是java实现跨平台的原因。最后通过虚拟机把字节码翻译成对应平台的机器指令,虽然方便实现跨平台,但也因此降低了执行效率,毕竟它的执行要通过虚拟机这个中转站。举个简单的例子,在源文件与编译之后的.class 文件之间有一个翻译员,在任何平台上都是这个翻译员进行翻译,而在.class文件和机器指令之间有多个翻译员,不同的平台上有不同的翻译员进行翻译。

下面来看看java虚拟机的工作流程:

1装载

java虚拟机使用类装载器找到相应的class文件,然后读取这个class文件,再把它传入到虚拟机中,然后虚拟机会再提取其他的信息,比如:该类的类名,方法名,变量名,修饰符,方法的返回类型等等这些信息保存在一个叫方法区的一个地方,还有一个地方叫常量池,它里面保存了类中的所有常量以及对其他类型的引用,最终形成class的实例,而这个实例就保存在内存中的堆区。通过一个简单的示例来解释一下这个过程:

 

  public class Test{
      private int size;
      public User user;
      public static void main(String []arg){
          user = new User();
          ... ...
      }
  }
  
  public class User{
      private String name;
      private int age;
      ... ...
  }

 

当虚拟机读取Test类的class文件时,会读取其中的信息,例如private public这些修饰符,而name, age , User , size这些都会保存到常量池中,而这些信息都保存到方法区中,最终形成Test的实例就在java堆里。

 

JVM图解:


链接

1检验:确定所加载的类型符合java语言,不会出现语法错误。

2准备:虚拟机为该类型分配内存空间,设置默认值。

3解析:在该类型的常量池中寻找该类的类名,接口,方法。

3初始化

虚拟机调用方法来初始化该类的静态变量,要注意的是在初始化之前要确定该类的父类已经被初始化。

Java的执行过程大致就是这样,当然还有很多没有涉及到,后面会继续深入研究javajvm,先写下学习过程来帮助自己更好理解,更好回顾。


 

猜你喜欢

转载自lsx111.iteye.com/blog/1871370
今日推荐