JVM中的Hello World是如何运行的?

开发 后端
每一个Java开发者都是通过Hello World敲开面向对象世界的大门。但是在一开始,我们考虑的只是这个语言是什么样的,我们如何更好的编码,却很少有人关心他内部是怎么运行的。看下面一个简单的hello world。

每一个Java开发者都是通过Hello World敲开面向对象世界的大门。但是在一开始,我们考虑的只是这个语言是什么样的,我们如何更好的编码,却很少有人关心他内部是怎么运行的。看下面一个简单的hello world。

  1. package com.wordpress.kkarthikeyanblog;  
  2.  
  3. public class HelloWorld {  
  4.  
  5. public static String HELLOWORLD = "Hello World";  
  6.  
  7. public void print() {  
  8. System.out.println(HELLOWORLD);  
  9. }  
  10.  
  11. public static void main(String[] args) {  
  12. HelloWorld helloWorld = new HelloWorld();  
  13. helloWorld.print();  
  14. }  

在使用javac工具编译了以上代码后,我使用下面的命令来运行这个程序。这时候JVM就启动了。

  1. java com/wordpress/kkarthikeyanblog/HelloWorld 

JVM的自述

Hey,Guys,我是JVM,让我来给大家说说我是如何运行这个程序的。

在一开始,BoostrapperClassLoader 加载java.lang.package这个包,我内部的System Class Loader通过给定的classpath找到类"HelloWorld"。在定位到HelloWorld.class后,我将得到这个二进制流。然后我从这个class文件中提取出了一下信息。

  • constants(例如文本、常数、类型、方法的符号引用)将被放到constant pool【在这个例子中包括HelloWorld class、方法、常量的符号】
  • 包、修饰符、静态变量【在这个例子中,"HELLOWORLD"这个静态变量】
  • 字段信息(名称、类型、修饰符)
  • 方法信息(名称、返回值类型、方法参数、修饰符、方法的字节码)【在这个例子中是print、void、public和字节码】
  • ClassLoader的引用【装载这个类的classloader】
  • 引用class的类

以上信息都被存在"Method Area"中。

在装载完毕以上信息后,我(JVM)试着找出"public static void main(String [] args)"方法。

我(JVM)中的每一个线程,除了共享"Method area"和"Heap Space"之外,他们还拥有自己的"stack"和"pc register"。

我(JVM)将从Method area中获取的main()方法信息压入栈(push),程序计数寄存器(pc register)将会告诉我下一步该干什么。

然后在程序计数器的指引下,我开始执行下面这行:

  1. HelloWorld helloWorld = new HelloWorld(); 

 

我(JVM)将从constant pool中拿到HelloWorld的符号引用。然后查找Method area,获取到class信息,然后在Heap space中创建对象。

现在程序计数器将会指到

  1. helloWorld.print(); 

我(JVM)将从我自己的线程的stack中取出变量"helloworld"的引用,并且找到print()方法。在从Method Area中得到字节码信息后,我将方法"print()"压栈(push),现在我将开始执行print()方法。

一旦print()方法执行结束,这个方法将出栈(pop up),将继续执行main()方法。一旦main()方法结束。main()方法将出栈,整个程序的执行也就结束了。

总结一下以上所说,在JVM中:

Method area-存放类信息

Heap Space-只存放对象

针对每一个线程来讲:

Stack-包含一个一个的栈帧【例如方法栈】-它也存放指定方法的局部变量

程序计数寄存器-指导下一步该执行什么。

另外,除了这些,还有一个"Garbage Collector"(垃圾回收器)来释放那些无用的对象。

最后,希望你看了此文能对JVM有更深一步的了解。

英文原文:http://kkarthikeyanblog.wordpress.com/2012/08/23/helloworld-in-jvms-view-how-java-program-executed-internally-in-jvm/

本文链接:http://www.oschina.net/question/82993_66457

责任编辑:林师授 来源: OSCHINA
相关推荐

2014-09-17 11:45:20

iOS编程App运作

2009-08-11 10:32:23

什么是Groovy

2021-03-30 13:48:47

WebAssemblyWeb浏览器编程语言

2010-03-15 15:18:23

Python运行

2011-03-14 09:33:35

Mono

2017-11-28 16:57:18

2012-03-06 10:22:00

程序

2016-12-14 14:41:20

Hello World程序运行机制

2016-12-13 14:12:25

程序机制

2022-04-27 10:51:00

PythonMLCubePodman

2017-06-26 08:55:52

2015-10-27 09:47:11

2014-12-19 10:07:10

C

2017-11-23 17:45:46

Yii框架IntelYii框架深度剖析

2023-10-07 08:41:42

JavaJVM

2017-01-09 16:40:07

React NatiAndroid 开发

2011-11-21 14:10:53

C#

2019-12-12 09:23:29

Hello World操作系统函数库

2009-09-16 17:15:19

OSGi Bundle

2009-07-30 13:21:17

Scala入门Hello World
点赞
收藏

51CTO技术栈公众号