JVM(Java虚拟机)

数据类型:
同Java语言一样,JVM支持两种类型:原始数据类型(Primitive types)和引用类型(Reference types)。注意是,JVM本身支持的数据类型,而不是某种语言。
 
 
原始数据类型:
原始数据类型包括:数字类型(numeric types)、布尔类型(boolean types)和返回地址类型(returnAddress type)。
 
数字类型包括:整数类型(integral type)和浮点类型(floating-point type)。
整数类型有:byte,short,int,long,char
浮点类型有:float和double
 
布尔类型:true和false
 
返回地址类型:代表JVM指令的操作码的指针,它是原始数据类型中唯一一种和java语言数据类型没有关系的类型。
 
引用类型:
引用类型包括:类类型(class types)、数组类型(array types)和接口类型(interface types)。
 
这些类型引用动态创建的实例、数组或者实现了接口的类型实例和数组实例。引用可以是特别的null。
 
 
 
运行时数据区(Runtime Data Areas):
 
JVM定义了多个供程序执行的数据区。有一些数据区在虚拟机启动的时候就创建了,而且当虚拟机退出时才销毁。有一些是单个线程独有的,伴随线程创建而创建,伴随线程销毁而销毁。
 
1.程序计数器(The pc Register)
 
JVM支持多线程的执行,每一个JVM线程都有自己的程序计数器。每一个线程一个时刻执行一个方法,如果这个方法是本地(native)方法,程序计数器持有当前执行的JVM指令地址。如果线程当前执行的方法不是本地方法,程序计数器的值没有定义(undefined)。
 
2.虚拟机栈(Java Virtual Machine Stacks)
 
每一个线程都有一个私有的虚拟机栈,这个栈在线程创建的时候就创建了。虚拟机栈存储栈帧(frames)。
虚拟机栈持有本地变量、局部结果和参与方法的调用和结果的返回。虚拟机栈的存储空间可以是不一致的,虚拟机栈允许是一个合适的值,或者可以使动态扩展或者缩小。
 
如果虚拟机栈是一个合适的值,那么这个值必须在栈创建的时候就指定,虚拟机的实现需要提供给用户设置虚拟机栈大小的选项。如果虚拟机栈是动态扩展或者缩小的,一样需要控制栈的最大和最小值。
 
与虚拟机栈相关的一场通常有两种:
StackOverFlowError:如果线程中的操作请求栈大小超过了允许的大小,该错误就会发生。 这种是栈空间不足
OutOfMemoryError:如果栈支持动态扩展,当尝试扩展但是空间不足时,或者空间不足以提供给一个线程初始化栈时。 这种是不够空间提供给栈
 
3.堆(Heap)
 
堆是所有线程共享的一块数据区。所有的类实例和数组都都分配在堆上。
 
虚拟机启动时,堆就已经创建。堆上对象通过自动存储空间管理系统(an automatic storage management system,也就是垃圾收集器garbage collector)负责回收。JVM没有指定垃圾收集器的实现方式,可以根据具体的需求来实现。堆也可以是一个合适的大小,也可以是动态扩展和缩小。同样,堆的大小也需要提供给用户自主设置。
 
与堆相关的异常有:
OutOfMemoryError:当垃圾收集器不足以提供空间给对象分配时,该异常发生。
 
4.方法区(Method Area)
 
方法区是线程共享的。方法区存储每一个类的节诶狗,例如运行时常量池、域、方法数据、构造方法和方法代码。
 
方法区随虚拟机创建而创建。虽然方法区逻辑上是堆的一部分,但是一些虚拟机简单的实现选择不对该区域进行垃圾回收和压缩。虚拟机规格不强制规定方法区的位置和它管理编译出来的代码的策略。
 
 

 

未完,待续。。。

你可能感兴趣的:(JVM(Java虚拟机))