摘要: 每一个Java开发者都是通过Hello World敲开面向对象世界的大门。但是在一开始,我们考虑的只是这个语言是什么样的,我们如何更好的编码,却很少有人关心他内部是怎么运行的。看下面一个简单的hello world。packagecom ...
每一个Java开发者都是通过Hello World敲开面向对象世界的大门。但是在一开始,我们考虑的只是这个语言是什么样的,我们如何更好的编码,却很少有人关心他内部是怎么运行的。看下面一个简单的hello world。
package com.wordpress.kkarthikeyanblog; public class HelloWorld { public static String HELLOWORLD = "Hello World"; public void print() { System.out.println(HELLOWORLD); } public static void main(String[] args) { HelloWorld helloWorld = new HelloWorld(); helloWorld.print(); } }
在使用javac工具编译了以上代码后,我使用下面的命令来运行这个程序。这时候JVM就启动了。
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)将会告诉我下一步该干什么。
然后在程序计数器的指引下,我开始执行下面这行:
HelloWorld helloWorld = new HelloWorld();
我(JVM)将从constant pool中拿到HelloWorld的符号引用。然后查找Method area,获取到class信息,然后在Heap space中创建对象。
现在程序计数器将会指到
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
分享到:
相关推荐
这一步会根据`HelloWorld.java`中的`native`方法自动生成对应的JNI头文件。 ##### 4. 处理JNI头文件 将生成的`com_helloworld_HelloWorld.h`文件移动到`HelloWorld.java`所在的目录: ```bash mv ...
Java 语言简介、JDK 安装和配置、第一个程序 HelloWorld 编译运行 Java 语言简介 Java是一种面向对象的程序设计语言,由Sun公司开发,主要是基于安全性和高效考虑。Java 不仅是一种语言,也是一种技术。它的原意...
gcc -shared -o hello.dll HelloWorld.c -I/usr/lib/jvm/java-8-openjdk-amd64/include -I/usr/lib/jvm/java-8-openjdk-amd64/include/linux ``` 最后,当运行Java程序时,`System.loadLibrary("hello")`会加载我们...
6. **编译与运行**:在命令行中,先使用`javac HelloWorld.java`编译源代码,生成`HelloWorld.class`字节码文件。然后,通过`java HelloWorld`运行程序,你会看到“Hello World!”的输出。 这个简单的"Hello World...
标题中的"HelloWorldApp_hellowword_world_"暗示了一个经典的编程入门示例——“Hello, World!”程序。这个程序通常在初学者接触新编程语言时使用,以展示如何编译、运行一个简单的程序并打印出“Hello, World!”这...
这会启动Java虚拟机(JVM),执行`HelloWorld`类的`main`方法,然后你会看到终端输出"Hello World!",标志着你的第一个Java程序成功运行。 总的来说,这个过程涉及了在Mac环境下配置Java开发环境,编写简单的Java源...
3. 这将在`HelloWorld.java`文件中自动生成`main`方法。在`main`方法内,输入以下代码: ```java import javax.swing.JFrame; import javax.swing.JLabel; public class HelloWorld { public static void main...
gcc -shared -o libhello.so -I/usr/lib/jvm/java-8-openjdk-amd64/include -I/usr/lib/jvm/java-8-openjdk-amd64/include/linux HelloWorld.c ``` Windows系统下则需要使用不同的编译器和选项。 5. **运行Java程序...
### 实现HELLOWORLD入门与常见错误分析 #### JAVA语言简介与编译流程 JAVA,作为一种跨平台的高级编程语言,由Sun Microsystems于1995年推出,旨在实现“一次编写,到处运行”的理念。其核心优势在于通过Java...
在第三步中,"HelloWorld"字符串被查找并在常量池中添加,然后将引用赋予`s`。 5. **共享代码区(Shared Code Area)**:这是JVM为类的字节码提供的一块内存区域,所有类的公共方法在这里共享。 6. **类代码区...
然后,通过Java虚拟机(JVM)运行编译后的字节码文件,命令为`java HelloWorld`(假设类名与文件名相同,且不包含扩展名)。 Java作为一种强类型、面向对象的语言,有着丰富的库支持和跨平台的特性。它的语法严谨,...
"Java语言简介+JDK安装+配置+第一个程序HelloWorld编译运行" 本文将对Java语言进行简介,介绍Java的历史、特点、优势和运行机制,并指导读者安装和配置JDK,编译和运行第一个Java程序HelloWorld。 Java语言简介 --...
然后在命令行中,使用`javac HelloWorld.java`编译程序,生成`HelloWorld.class`字节码文件。接着,运行`java HelloWorld`,屏幕上将显示"Hello, World!",标志着Java开发环境已成功搭建,可以开始编程之旅了。
2. **编译源代码**:在命令行中,切换到包含`HelloWorld.java`文件的目录,并运行命令`javac HelloWorld.java`。如果源代码没有语法错误,将会成功编译并生成`HelloWorld.class`文件。 #### 四、运行程序 1. **...
标题“实例1HelloWorld”指的是一个经典的编程入门示例,通常用于介绍编程语言的基本语法和运行环境。在Java编程语言中,“Hello, World!”程序是初学者的第一课,它展示了如何编写、编译和运行一个简单的Java应用...
在命令行中,导航到包含`HelloWorld.java`的目录,然后运行: ``` javac HelloWorld.java ``` 这个命令将生成一个名为`HelloWorld.class`的字节码文件,这是Java虚拟机(JVM)可执行的文件。 4. **运行Java程序...
在这个教程中,我们将深入探讨Java的基本概念和 HelloWorld 示例,帮助初学者建立起对Java编程的基础理解。 首先,让我们了解Java的起源。Java是由Sun Microsystems(后被Oracle收购)的詹姆斯·高斯林(James ...
标题中的“HelloWorld的javap -verbose HelloWorld”指的是在Java编程环境中,通过`javap`这个命令行工具来反汇编一个简单的“HelloWorld”程序,以深入理解字节码的工作原理。`javap`是Java Platform Debugger ...
在这个例子中,JVM会在`HelloWorld`类中找到`public static void main(String[] args)`方法,并执行其中的代码。具体步骤如下: 1. **编译**:首先,使用Java编译器(如javac)将源代码文件`HelloWorld.java`编译成...
在压缩包中的 `helloworld_j.java` 文件,就是包含了上述代码的源文件。在编译这个文件后(使用 `javac helloworld_j.java` 命令),会产生一个对应的字节码文件 `helloworld_j.class`。然后通过运行 `java ...