zoukankan      html  css  js  c++  java
  • JVM中的Hello World运行机制:

    栗子:

    package zagoo;
    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();
    }
    }
    
    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"(垃圾回收器)来释放那些无用的对象。
    

      

  • 相关阅读:
    Clojure实现的简单短网址服务(Compojure、Ring、Korma库演示样例)
    android4.4系统解决“ERRORcouldn't find native method”方法
    JS window.open()属性
    网页视频播放器代码大全 + 21个为您的站点和博客提供的免费视频播放器
    理解Java的GC日志
    图像识别技术
    堆排序原理及算法实现(最大堆)
    什么是依赖注入
    Cocos2d-x3.1下实现相似iOS页面滑动指示圆点
    [Bootstrap] 6. Navigation
  • 原文地址:https://www.cnblogs.com/ipetergo/p/6513180.html
Copyright © 2011-2022 走看看