jvm那些事 一

jvm是虚拟机,也是一种规范。遵循着冯.诺依曼体系结构的设计原理。jvm是通过在操作系统上建立虚拟机,再有自己定义一套统一的数据结构和操作指令,再将统一的语言翻译给各大操作系统,进而实现跨平台。也就是说jvm是java的核心,也是java一次编译到处运行的本质所在。

一、组成和原理

从根本上来说,jvm只是一种规范,是一个虚拟机,虽然遵循着冯诺依曼的computer的设计原理,但是它却不是真实的实体计算机。那么它的构成也不是存储器、控制器、运算器、输入输出等设备。所以用合理的话说,jvm更像是运行在操作系统中的应用或者进程。那么它的组成也就是所谓的功能模块构成。现有比较流行的jvm:oracle jvm、hp jvm、ibm jvm等

java的开发人员都知道,jdk是java开发必备的,而jdk的构成中有一部分是jre,也就是java运行环境,而jvm则是jre中最核心的部分。



 那么从这个图片上可以看到jvm的重要性。同样在实际的项目应用中,性能优化、OOM处理最终处理方案都是基于此。像oracle的jvm 有两个不同实现:java hotspot client vm 和 java hotspot server vm ,区别在于前者减少启动的时间和内存占用;后者则提供更加优秀的程序运行速度。



 

接下来,来看看jvm的组成:Class Loader 、Runtime data area 、 execution engine、native interface。



 1、classloader 是负责加载class 文件的,class文件在文件开头有特定的文件标示,并且classloader只负责class文件的加载。至于运行则有execution engine决定

2、native interface 负责调用本地接口,也就是调用不同语言的接口供java使用。同时这些本地方法都会在native method stack 中有所记录,在调用该方法时,就可以通过execution engine 加载对应的本地lib。现在这些本地方法的接口调用基本采用socket通信和webservice等方式取代。

3、execution engine是执行引擎。主要是在class 文件加载完成后,会将指令和数据放入内存,那么关于这些内容的解释成操作系统所接受的内容,便有execution engine完成。

4、runtime data area 则是存放数据的,主要由:stack、 heap、method area 、pc register、native method stack 。也就是关于java的内存都集中在此。

 关于java runtime data areas:  


 上图只是jvm中关于runtime data areas 的划分,可能不同的jvm实现最终这些内容和上图是有出入。
 

我们还是使用该图进行粗略描述

1、stack是java的栈内存,等同于c的栈。注意栈的内存是不连续的,因为每一个线程都有自己的栈。栈里则存放stack frame。stackframe包括:局部变量、执行环境、操作数栈。局部变量:存放某一个类中的所用到的局部变量;执行环境:保存解析java字节码过程中所需要的信息(上次调用方法、局部变量指针、操作数栈的栈顶和栈低指针);操作数栈:用于存储运算所需的操作数和结果。一般来说,stackframe只在方法被调用时创建;在某一个线程,某一个时间点,只有一个框架是活动的,即为current frame,方法则为current method 。局部变量和操作数栈上的操作总是引用当前框架。当stackframe中方法执行完成或者调用其他stackframe中的方法时,则当前的栈变为另一个stackframe。stack大小一般分为动态和静态两种,动态按照线程需要分配;(具体看查:http://www.programering.com/a/MzM3QzNwATA.html 和 java虚拟机框架)

待续。。。。。。

猜你喜欢

转载自dalan-123.iteye.com/blog/2233469