转自: http://blog.youkuaiyun.com/luanlouis/article/details/50412126
Java虚拟机文章太长,如何快速理解。可以从一段程序如何运行的,来理解JVM做了什么事。参靠这位叫亦山的博客,图画得是相当的好。
- package org.louis.jvm.codeset;
- /**
- * JVM 原理简单用例
- * @author louis
- *
- */
- public class Bootstrap {
- public static void main(String[] args) {
- String name = "Louis";
- greeting(name);
- }
- public static void greeting(String name)
- {
- System.out.println("Hello,"+name);
- }
- }
当我们将Bootstrap.java 编译成Bootstrap.class 并运行这段程序的时候,在JVM复杂的运行逻辑中,会有以下几步:
1. Class文件load到方法区
首先JVM会先将这个Bootstrap.class 信息加载到 内存中的方法区(Method Area)中。
Bootstrap.class 中包含了常量池信息,方法的定义 以及编译后的方法实现的二进制形式的机器指令,所有的线程共享一个方法区,从中读取方法定义和方法的指令集。
2. 在堆上创建对象
接着,JVM会在Heap堆上为Bootstrap.class 创建一个Class<Bootstrap>实例用来表示Bootstrap.class 的 类实例。
3. 在虚拟机栈上创建一个栈帧,运行main方法
JVM开始执行main方法,这时会为main方法创建一个栈帧,以表示main方法的整个执行过程(我会在后面章节中详细展开这个过程);
4. 创建另外的栈帧运行被调用得方法
main方法在执行的过程之中,调用了greeting静态方法,则JVM会为greeting方法创建一个栈帧,推到虚拟机栈顶(我会在后面章节中详细展开这个过程)。
5. 运行完所以方法后,回到main
当greeting方法运行完成后,则greeting方法出栈,main方法继续运行;
见图:
本地方法栈没有出现在线程1的数据区里,因为本地方法栈是用于Java调用其他语言代码用的,在上面例子里没有用到。