Java执行原理
先记录参考的文档,谢谢他们
http://qing.blog.sina.com.cn/2494474521/94aea91933002vg2.html
http://www.importnew.com/1486.html 这个强烈推荐看
看个java文件编译和执行全程:
虚拟机是一种通过模拟方式来实现物理计算机体系架构的软件。
Java虚拟机是保障Java程序能跨平台运行的虚拟计算机。
Java虚拟机规范是对异构硬件、多样os 的 抽象、是一种 软件层次的计算机体系架构的约定描述,你可以依照该规范实现自己的java虚拟机。
通常的物理计算机体系架构是经典的冯诺依曼,基于寄存器的计算架构,能执行有限的机器指令码
jvm有自己的指令系统,jvm是基于堆栈的计算架构
Java堆栈要求Java程序执行中的每个线程都有一个独立的堆栈,每个当前执行的方法是当前线程堆栈的一个片断(Frame), 最终还是jvm将自己的指令翻译为物理计算机的机器指令才能执行的
不直接写机器指令码是因为难懂难记难看难维护
□ JVM和其它任何虚拟机一样,都是完成资源的封装,从而提高资源的利用率和可管理性。
□ JVM是Java平台体系的核心基础设施。Java语言编写的程序在JVM上被解释和执行。
□ JVM在JSR-924中进行了规范,在JSR-202中维护更新。JVM规范使JVM的具体实现和建立在JVM之上的应用之间耦合性降低。
□ JVM规范主要从Java字节码规范、基本的执行过程、JVM指令集和抽象架构四个层面进行描述。
□ JVM实现中的关键问题是内存管理和垃圾回收、JVM指令到机器指令翻译方法、多线程支持
Java虚拟机根据jvm规范将Java源程序编译为jvm操作指令的Java字节码,这种指令不是机器码指令
在装有jvm的机器上,运行Java程序实际是jvm加载编译好的java字节码文件,然后将字节码文件中的指令翻译为机器码执行。
首先大概看一下JVM的抽象架构
可以看出jvm进程占用的物理内存 主要分为 三大块:
1、类加载器 :从入口处开始按需加载字节码文件,填充这些数据到运行时数据区
2、运行时数据区:核心区,运行的时候操作所分配的内存区
3、执行引擎 :jvm的cpu,不断地取指令,JIT编译翻译,执行
外围
1、编译好的字节码文件,一般为.class
2、native功能库
java字节码.class 文件结构
类加载器 怎么加载类文件的,jvm的类加载采用父类委托制,子加载器能查询父加载器已缓存类,反之不行。
运行时数据区,公有:对象实例都在 heap里,方法区还包括常量池,
每个线程私有 程序计数器,jvm 栈 本地方法栈
jvm栈中压入的是栈帧Frame这个frame包含了很多数据:局部变量、操作数栈、常用引用
除了pc计数器区 其他区都有可能产生oom,栈区还有可能stackoverflow
执行引擎,将字节码即时编译 优化 为本地代码, 然后执行
执行命令: java Test 背后到底做了什么