每一个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文件中提取出了一下信息。
以上信息都被存在"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
文章名称:JVM中的HelloWorld是如何运行的?
分享链接:http://www.36103.cn/qtweb/news20/9770.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联