Java执行原理

先记录参考的文档,谢谢他们

 http://qing.blog.sina.com.cn/2494474521/94aea91933002vg2.html

http://www.importnew.com/1486.html 这个强烈推荐看


看个java文件编译和执行全程:

Java执行原理_第1张图片

虚拟机是一种通过模拟方式来实现物理计算机体系架构的软件。

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的抽象架构

Java执行原理_第2张图片

Java执行原理_第3张图片

可以看出jvm进程占用的物理内存 主要分为 四大块:

1、类加载器      :从入口处开始按需加载字节码文件,填充这些数据到运行时数据区

2、运行时数据区:核心区,堆heap和方法区所有线程共享的,pc计数器、java堆栈、本地方法栈线程独占

3、执行引擎     :jvm的cpu,不断地取指令(依据pc计数器),JIT编译翻译,执行

4、垃圾回收器   :这张图上没有,其实和执行引擎 一个 圈

外围

1、编译好的字节码文件,一般为.class

2、native功能库:nio引入基于channel和buffer的io方式,是使用native函数库直接在运行时数据区以外分配内存,通过一个存储在heap中的DirectByteBuffer对象作为这部分内存的引用,从而进行操作。这部分内存称为 直接内存


看看 java字节码.class 文件结构

Java执行原理_第4张图片

类加载器 怎么加载类文件的,jvm的类加载采用父类委托制,子加载器能查询父加载器已缓存类,反之不行。

Java执行原理_第5张图片

运行时数据区:

线程共享:
             对象实例、数组的内存分配都在 heap里,堆里的对象根据实现有句柄访问和直接指针访问两种方式
             方法区:类信息,静态变量、即时编译器编译后的代码数据,还包括常量池(字面量、符号引用),

线程私有: 程序计数器:存放jvm指令码的地址
               jvm堆栈:方法的内存模型(局部变量表、操作栈、动态链接、方法出口)
               本地方法栈

Java执行原理_第6张图片

jvm栈中压入的是栈帧Frame这个frame包含了很多数据:局部变量、操作数栈、常用引用

除了pc计数器区 其他区都有可能产生oom,申请不到足够的内存了。
栈区还有可能stackoverflow,根据各个区存放的实体,可以写出针对各区oom和堆栈溢出的java代码

Java执行原理_第7张图片

执行引擎,将字节码即时编译 优化 为本地代码, 然后执行

Java执行原理_第8张图片


执行命令: java Test  背后到底做了什么

Java执行原理_第9张图片


你可能感兴趣的:(java,虚拟机,OutOfMemory,jvm原理)