JVM
来源:互联网 发布:vr图片展示软件 编辑:程序博客网 时间:2024/06/08 02:21
1. JVM => Java 语言平台无关性,“一次编译,到处运行”。
2. JRE、JDK、JVM关系
(1) JRE,java runtime Environment,java运行环境,也就是java平台,java程序都在JRE下才能运行;
(2) JDK,java development kit,程序开发者编译,调试java程序用的开发工具包。Jdk也是java程序,也需JRE才能运行。为保持jdk的独立性和完整性,jdk的安装过程中,JRE也是安装的一部分;
(3) JVM虚构出来的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现。JVM有自己完善的硬件架构。如处理器、堆栈、寄存器、相应的指令系统。
3. JVM原理
Jvm是java核心和基础,在java编译器和OS平台之间的虚处理器,可在上面执行java字节码程序。
Java编译器只需要向JVM,生成jvm理解的代码或字节码文件,java源文件经编译成字节码程序,通过jvm将每条指令翻译成不同平台机器码,通过特定的平台运行。
4. JVM体系结构
(1) 类装载器(classloader) 装载.class文件
(2) 执行引擎 执行字节码,或者执行本地方法;
(3) 运行时数据区:方法区、堆、栈、pc寄存器、本地方法栈。
5. JVM运行时数据区
(1) PC寄存器:存储下一步执行的JVM指令,若该方法为native,则pc不存储任何信息。=》线程私有,无OOM;
(2) 栈:存储基本类型变量[8种基本数据类型:boolean,char,byte,short,int,long,double,float];部分返回结构及stack Frame.非基本类型的对象在栈上仅存放一个指向堆上的地址[本地变量的私有拷贝]。=》线程私有,异常:StackOverflowError,OutOfMemoryError
(3) 堆:存储对象实例;数组值;new的对象内存都在此分配;线程共享堆,因此对象内存分配需要加锁。静态成员变量跟随着类定义一起放在堆上;一个对象的成员变量可能伴随着这个对象自身存放在堆上,不管这个成员变量是原始类型还是引用类型。=》异常:OOM
(4) 方法区:即持久代;存放加载的class类信息[名称、修饰符]、field字段信息、method方法信息;类中static静态成员变量;类中final类常量。=》异常OOM
虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是与Java堆区分开来。
(5) 运行常量池:
常量池(Constant Pool):常量池数据编译期被确定,是Class文件中的一部分。存储了类、方法、接口等中的常量,当然也包括字符串常量。
字符串池/字符串常量池(String Pool/String Constant Pool):是常量池中的一部分,存储编译期类中产生的字符串类型数据。
运行时常量池(Runtime Constant Pool):方法区的一部分,所有线程共享。虚拟机加载Class后把常量池中的数据放入到运行时常量池。
(6) 本地方法堆栈:Native Method Stacks:JVM采用本地方法堆栈来支持native方法的执行,此区域用于存储每个native方法调用的状态。