JVM内存结构和Java对象模型

JVM内存结构

、 

1、概述:

JVM内存结构主要包含5个部分:方法区、堆、java栈、本地方法栈、程序计数器,其中方法区和堆是线程共有的空间,而程序计数器,本地方法栈,java栈为线程私有的

2、方法区

(1)方法区存储的是类级别的所有信息,想想对一个java类文件,从头到位它包含的信息包括:类信息(类的名字,实现的接口,字段,方法),类级别的变量即static修饰的静态变量,常量等数据。

(2)由于方法区包含主要的是类级别的信息,因此它对于所有线程都应该是可见的,即它是线程间所共享的

(3)方法区中包含一块区域叫做常量池,用于存放编译生成的各种字面量(如:字符串”xyz”)和符号引用(如类名)。

2、堆

(1)堆是JVM内存结构中所占空间最大的部分,主要是用于存放对象实例和数组,几乎所有的对象实例都被存放在该区域。因此堆是线程共享的。

(2)堆是垃圾收集器管理的主要区域。

(3)堆是可扩展的,-Xms和-Xmx就是用于内存扩展的指令

(4)当堆中没有内存来完成实例分配,且堆无法再扩展时就会发生OutOf MemoryError。

3、程序计数器

程序计数器记录的是线程当前执行的字节码指令的地址,如果正在执行的是native方法,这个计数器为空。不同线程各自执行到的地址是不同的因此程序计数器是各个线程的私有空间。

4、java栈

(1)java栈描述的是java方法执行的内存模型,每个方法在执行会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等,一个方法的执行过程对应的就是一个栈帧的入栈出栈过程。

(2)局部变量表存放的数据为:基本数据类型(boolean,byte,char,short,int,float,long,double)和对象的引用(reference类型,不是对象本身,对象本身存储在堆中,它是一个引用指针指向堆中的实例对象的起始地址,也可能指向一个代表对象的句柄)

(3)如果线程所请求的栈深度大于虚拟机所允许的最大深度,就会发生StackOverFlowError错误,栈空间是可扩张的因此也有可能发生OutOf MemoryError。

(4)当进入一个方法时,局部变量空间的大小就是完全确认的。

5、native方法栈

与Java栈类似,只不过它执行的时native方法

6、对象的创建过程 

(1)类加载检查:当调用new创建一个对象时,会先去方法区的常量池中查找这个类的符号引用,如果不存在则要进行类的加载

(2)在堆中进行实例对象空间分配:类加载完成之后所需的空间大小就是完全确定的。根据垃圾收集器算法的不同会决定堆内村空间是否规整(是否所有的未使用的内存是连续的),如果空间是规整的会通过指针碰撞,即将指针移动一定距离来分配;如果空间是不规则的则通过空闲列表,来分配一块足够大的空间给实例对象

(3)对对象进行初始化

7、java的对象模型

(1)对象在内存中分为3个区域:对象头,实例数据,对齐填充

(2)对象头:对象头的长度根据操作系统的位数不同而不同,32位对应的长度是32bit,64位对应的是64bit,对象头主要包含两个部分,一个是对象自身运行时的数据(hashcode,锁状态标志等),另一部分时一个指向方法区中对应类元数据的指针。

(3)对其填充时用于补齐,让对象的大小必须是8字节的整数倍。

4、对象访问定位:

第一种直接访问对象,堆中的reference直接指向java堆中的对象,对象的对象头中包含指针指向方法区中方的对应类的元数据。Sun HotSpot 用的是该方式

 第二种通过句柄访问对象,在reference指针和实例对象中增加了句柄,句柄指向实例对象,优点:对象位置发生移动时,reference不需要修改,只要需要修改句柄(一个句柄可能对应多个reference);缺点:通过指针访问对象时要进行多一次的指针寻址。

 

9、关于 String s=new String(“xyz”)创建对象的过程(可能会创建两个实例对象)

(1)判断方法区中的常量池中是否存在字面量”xyz”,如果不存在则会创建字面量”xyz”且在堆中创建一个对象,字面量会指向这个对象

(2)创建一个对象器内容与字面量”xyz”指向的对象相同,reference指针s指向此对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值