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()
相关文章