hello world 执行原理

1 public class HelloWorld {
2     public static void main(String[] args)
3     {    
4             String  s ;
5               s = “Hello World!”;  //定义字符串s
6           System.out.println(s); 
7     }
8 }
↑↑↑是一个简单的java程序 HelloWorld 
Java代码编译是由Java源码编译器来完成,流程图如下所示:

Java字节码的执行是由JVM执行引擎来完成,流程图如下所示:

程序执行分析如下: 

①  使用 javac  对 HelloWorld.java 源文件进行编译为 HelloWorld.class 字节码文件。( jdk 开发工具箱中包含 javac 编译工具和 jre 运行时环境)

 ②  类的加载阶段,加载至JVM内存中,Main方法就是程序的入口,然后由JVM虚拟机来解释执行,在一些虚拟机的实现中,还会被JVM利用字节码解释器特定系统的机器码执行,从而提高执行效率。

  java语言里负责解释执行字节码文件的是java虚拟机,既 JVM(java Virtual Machine)。(JVM是可运行java字节码文件的虚拟计算机)

 ③  虚拟机通过类找到HelloWorld的主方法(程序的入口方法),访问权限为public(公有可用),虚拟机传递String[](字符串数组对象:空数组)类型参数的地址到主方法的args中去,并在栈区为args开辟内存空间,返回一个void的返回值;

  JVM 将内存区域划分为 Method Area(Non-Heap)(方法区) ,Heap(堆) , Program Counter Register(程序计数器) ,   VM Stack(虚拟机栈,也有翻译成JAVA 方法栈的),Native Method Stack  ( 本地方法栈 ),其中Method Area 和  Heap 是线程共享的  ,VM Stack,Native Method Stack  和Program Counter Register  是非线程共享的。

 JVM 内存中线程是否共享示意图:

④  定义一个String(标准类库中的)类型的变量(在栈区开辟空间)s,s的值不确定(垃圾值,编译无法通过);

 ⑤  s = “Hello World!”,对象“Hello World!”在方法区的常量数据区开辟空间,属性即为:Hello World!,方法即为:toString(),变量s存放对象“Hello World!”的地址;

 ⑥  虚拟机找到标准类库中的System.class类并加载到内存中(即方法区的类代码区中),System.out为标准字节输出流对象(),并调用println()方法将变量s的值打印到屏幕上。

 

PS: 虚拟机调用主方法时会创建三个默认对象:System.out(标准字节输出流对象)、System.in(标准字节输入流对象)和System.error(标准字节出错流对象).

以上共涉及:

1个java文件:HelloWorld.java

4个class类: HelloWorld.class、String[].class、String.class、System.class

5个对象: “Hello World!”、String[]、System.out、System.in、System.error

2个变量:args、s

3个方法:main()、toString()、println()

猜你喜欢

转载自www.cnblogs.com/JMrLi/p/11139498.html
今日推荐