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

AD:2013云计算架构师峰会课程资料下载

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


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

在使用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

JVM中的Hello World是如何运行的?的更多相关文章

  1. 牛客网Java刷题知识点之什么是进程、什么是线程、什么是多线程、多线程的好处和弊端、多线程的创建方式、JVM中的多线程解析、多线程运行图解

    不多说,直接上干货! 什么是进程? 正在进行中的程序(直译). 什么是线程? 就是进程中一个负责程序执行的控制单元(执行路径). 见 牛客网Java刷题知识点之进程和线程的区别 什么是多线程? 一个进 ...

  2. 【转】JVM运行原理及JVM中的Stack和Heap的实现过程

    来自: http://blog.csdn.net//u011067360/article/details/46047521 Java语言写的源程序通过Java编译器,编译成与平台无关的‘字节码程序’( ...

  3. java笔记--关于多线程如何查看JVM中运行的线程

    查看JVM中的线程 --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3890280.html "谢谢-- ThreadGrou ...

  4. JVM中的Hello World运行机制:

    栗子: package zagoo; public class HelloWorld { public static String HELLOWORLD="Hello World" ...

  5. jvm中的年轻代 老年代 持久代 gc

    虚拟机中的共划分为三个代:年轻代(Young Generation).老年代(Old Generation)和持久代(Permanent Generation).其中持久代主要存放的是Java类的类信 ...

  6. 浅析JVM中的GC日志

    目录 一.GC日志的格式分析 二.运行时开启GC日志 一.GC日志的格式分析 在讲述GC日志之前,我们先来运行下面这段代码 package com.example; public class Test ...

  7. 《深入Java虚拟机学习笔记》- 第7章 类型的生命周期/对象在JVM中的生命周期

    一.类型生命周期的开始 如图所示 初始化时机 所有Java虚拟机实现必须在每个类或接口首次主动使用时初始化: 以下几种情形符合主动使用的要求: 当创建某个类的新实例时(或者通过在字节码中执行new指令 ...

  8. 改变JVM中的参数以提高Eclipse的运行速度

    首先建立评估体系,将workspace里所有的项目close掉,关闭eclipse.优化的用例就是启动eclipse,open一个项目,eclipse会自动build这个项目,保证没有感觉到明显的卡, ...

  9. JVM中内存回收深入分析,各种垃圾收集器

    JVM启动有两种模式,client和server 一般JVM启动时会根据主机情况分析选择采用那种模式启动 可发现是server模式 JVM中尤其需要关注的就是HEAP堆区 堆区分为新生代和老年代 新生 ...

  10. 你需要简单了解JVM中的内存长什么样子

    下面有关JVM内存,说法错误的是? 1.程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,是线程隔离的 2.Java方法执行内存模型,用于存储局部变量,操作数栈,动态链接 ...

随机推荐

  1. Android 执行shell命令 非root

    一个开源的项目已经完成了这个功能 app_process-shell-use,这个项目网上讲解的,很多,我这边就把操作时一些简要步骤说明一下 但是该方式有缺点:必须要先USB连接,debug的时候,运 ...

  2. 使用 nuxi info 查看 Nuxt 项目详细信息

    title: 使用 nuxi info 查看 Nuxt 项目详细信息 date: 2024/9/5 updated: 2024/9/5 author: cmdragon excerpt: 摘要:文章介 ...

  3. CCIA数安委等组织发起“个人信息保护影响评估专题工作”,合合信息首批入选试点

    近期,"个人信息保护影响评估专题工作"(简称"PIA专题工作")试点评估结果正式发布.PIA专题工作组由中国电子技术标准化研究院.中国信息通信院等单位的法律与技 ...

  4. SEO – 大杂烩

    参考: Google SEO 官网 Docs Zac 大神博客 Globalization 国际化语言 The Ultimate Guide to Multilingual and Multiregi ...

  5. SqlEs-像使用数据库一样使用Elasticsearch

    SqlEs SqlEs是Elasticsearch的客户端JDBC驱动程序,支持采用sql语法操作Elasticsearch.SqlEs构建在RestHighLevelClient,屏蔽了RestHi ...

  6. centos 下安装pip pip3

    centos 下安装pip pip3 上一篇说过了如何在centos7 上安装python3 并与python2.7共存. 这篇说一下 安装python2.7 下安装的pip 以及python3 下的 ...

  7. CAS存在的问题及在Java中的解决方式

    CAS 介绍 CAS 可以保证对共享变量操作的原子性 CAS全称Compare And Swap,比较与交换,是乐观锁的主要实现方式.CAS在不使用锁的情况下实现多线程之间的变量同步.Reentran ...

  8. Linux内核源码阅读:AArch64的异常处理机制详谈(内核版本6.11)

    ​ 任何玩过Arm64架构的朋友都知道,我们的ARM64架构有异常:Exception Levels, ELs,它是其异常处理机制的核心组成部分,允许系统在不同的特权级别下执行代码.ARM64定义了四 ...

  9. 2021年11月数据库排行解读:openGauss跃居第三,人大金仓晋身前十

    2021年11月墨天轮国产数据库流行度排行榜出炉,本月前三的数据库产品分别是:TiDB.达梦.openGauss,openGauss 数据库是首次跻身前三强. TiDB 自2020年以来,持续稳居榜首 ...

  10. wpf之样式

    在Window.Resources中书写样式 : <Window.Resources> <Style TargetType="Button" > </ ...