天天看点

java虚拟机(一) java虚拟机的基本结构

笔记1   java虚拟机的基本结构

1、数据类型

基本数据类型:byte、short、int、long、char、float、double

引用数据类型:类或接口、泛型类型、数组类型。

其中:byte、short、int、long是8、16、32、64位有符号整数;char是16位无符号整数(占两个字节),表示UTF-16的字符;布尔型:true、false;float、double是32位和64位浮点数。

int、short、byte、对象引用占用一个字;long和double在局部变量表中占2个字。

字(word):计算机内存中占据一个单独的内存单元编号的一组二进制串。一般32位计算机上一个字为4个字节长度。

2、java虚拟机基本结构

java虚拟机(一) java虚拟机的基本结构

类加载子系统:从文件系统或者网络中加载Class信息,加载的类信息放在方法去的内存空间。方法区中也存放运行时常量池信息,包括字符串字面量和数字常量(Class文件中常量池部分的内存映射)。

Java堆:java虚拟机启动时创建,是java最主要的内存工作区域。存放几乎所有的java对象实例。堆空间是所有线程共享,与java应用密切相关。

java的NIO库允许java程序使用直接内存。

直接内存是在java堆外、直接向系统申请的内存区间。访问速度优于java堆,大小不直接受限于Xmx指定的堆大小,而受限于操作系统能给出的最大内存。

垃圾回收系统:重要组成部分,堆方法去、java堆(回收重点)和直接内存回收。

java栈:线程私有,在线程创建时创建,保存帧信息、局部变量、方法参数,和java方法的调用和返回密切相关。

本地方法栈:用于本地调用,java虚拟机允许java直接调用本地方法栈。

PC(program counter)寄存器:线程私有。

执行引擎:java虚拟机最核心组件之一,负责执行虚拟机的字节码。若当前方法(正在执行的方法)不是本地方法,PC寄存器会指向当前正在被执行的指令;若当前方法是本地方法,PC寄存器的值是undefined。

3、堆空间的一般结构

java虚拟机(一) java虚拟机的基本结构

堆空间分新生代和老年代。新生代存放新生对象或年龄不大对象,老年代存放老年对象。新生代分eden区、s0区、s1区,s0和s1区称为from和to区域,是两块大小相等、可以互换角色的内存空间。

多数情况下,对象首先分配在eden区,在一次新生代回收后,若对象存活,进入s0或者s1,之后,每经过一次新生代回收,若对象存活,年龄加1,年龄达到一定条件,认为是老年对象,进入老年代。

java堆、方法区、栈的关系如:

public class SimpleHeap{

        private int id;

        public SimpleHeap(int id){

                this.id=id;

        }

        public void show(){

                Sysytem.out.println(''My ID is '' + id);

        }

        public static void main(String[] args){

                SimpleHeap  s1=new  SimpleHeap(1);

                SimpleHeap  s2=new SimpleHeap(2);

                s1.show();

                s2.show();

        }

}

以上声明了一个SimpleHeap类,在main()函数中创建了两个SimpelHeap实例。SimpleHeap实例分配在堆中,描述SimpleHeap类的信息存放在方法区,main()函数中s1和s2局部变量存放在java栈中,并指向堆中的两个实例。

java虚拟机(一) java虚拟机的基本结构

java方法返回函数的方式:①正常的函数返回,使用return指令;②抛出异常。

在一个栈帧中,至少包含局部变量表、操作数栈和帧数据区。

java虚拟机(一) java虚拟机的基本结构

当请求的栈深度大于最大可用栈深度时,系统将抛出StackOverflowError栈溢出错误。

局部变量表:用于保存函数的参数和局部变量。

操作数栈:用于保存计算过程的中间结果,同时作为计算过程中变量临时的存储空间。

帧数据区:保存访问常量池的指针,方便程序访问常量池。

方法区:线程共享的内存区域。用于保存系统的类信息,如类的字段、方法和常量池。

来源:《实战java虚拟机》—— 葛一鸣 著

继续阅读