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()
上一篇: 男票家里养了只大鹅
下一篇: 除了火鸡火锅,其他好吃的火锅,你知道吗
推荐阅读
-
最快速的Android开发环境搭建ADT-Bundle及Hello World
-
typecho插件编写教程(一):Hello World
-
Kotlin开发实战之hello world
-
Android Kotlin开发实例(Hello World!)及语法详解
-
Visual studio怎么编写HELLO WORLD程序?
-
VS2010怎么新建包含两个form的HELLO WORLD项目?
-
windows程序设计编写Hello world程序教程
-
IntelliJ IDEA 创建spring boot 的Hello World 项目(图解)
-
eclipse rcp详解Hello World以及eclipse rcp和osgi的简单展示(图文)
-
SpringMVC-简介和执行原理分析(一)