jvm内存模型

(1)java虚拟机栈

和程序计数器一样,都属于线程私有,生命周期与线程相同,描述的是 java方法执行的内存模型,每个方法执行都会创建一个栈帧,用于存储局部变量表,操作栈,动态链接,方法出口等信息,每一个方法被调用直至执行完成的过程,就对应一个栈帧在jvm stack 从入栈到出栈的过程.局部变量表存放了编译期可知的各种数据基本类型(Boolean,byte,char,short,int,float,long,double),以及对象的引用。这个区域中定义了2种异常情况,如果线程请求的栈深度大于jvm所允许的深度,将抛出StackOverflowError异常,如果jvm可以动态扩张,当扩张无法申请到足够的内存空间是会抛出OutOfMemoryError异常。
每次方法调用都会有一个栈帧压入虚拟机栈,操作系统给JVM分配的内存是有限的,JVM分配给“虚拟机栈”的内存是有限的。
如果方法调用过多,导致虚拟机栈满了就会溢出。
这里栈深度就是指栈帧的数量。


(2)本地方法栈
任何本地方法接口都会使用某种本地方法栈。当线程调用Java方法时,虚拟机会创建一个新的栈帧并压入Java栈。然而当它调用的是本地方法时,虚拟机会保持Java栈不变,不再在线程的Java栈中压入新的帧,虚拟机只是简单地动态连接并直接调用指定的本地方法。


(3)程序计数器
线程私有, 每个线程单独一个, 不存在OutOfMemoryError
是当前线程锁执行的字节码的行号指示器
java多线程是通过在一个内核中轮流执行实现的, 计数器就保证了切换线程可以回到原来正确的执行位置.


(4)堆
线程共享
唯一目的:存放对象实例
分类:新生代、老生代,或者Eden空间、From Survior 空间、To Survivor空间
分类目的:更好的回收和分配内存
没有内存完成实例分配,或者不能再扩展,报OutOfMemoryError异常
可以自己配置大小(-Xmx和-Xms)


(5)方法区
目的:存储类信息、常量、静态变量、即时编译器编译后的代码等数据;
该区内存回收目标:主要针对常量池的回收和对类型的卸载;
无法满足内存分配要求时,报OutOfMemoryError异常


运行时常量池
注意:运行时常量池属于方法区
目的:存储编译期生成的各种字面量和符号引用
特征:并非只有编译期置入Class文件中的常量池内容才能进入运行时常量池,在运行期间也可以置入新的常量,比如String的intern()方法;
无法申请足够内存时,报OutOfMemoryError异常




2.对象的创建
1. 当虚拟机遇到内存创建指令的时候, 来到方法区.找到方法区中有没有符号引用(类信息的原始形式字符串).
2.检查该符号引用有没有被加载, 解析和初始化过, 如果没有则执行类的加载过程. 否则直接准备为新的对象分配内存.
3.分配内存分为指针碰撞和空闲列表两种方式, 分配内存还要保证并发安全
指针碰撞:前提是堆内存中的空闲空间十分规整, 使用和未使用的空间全部为连续可读, 只要移动一下指针就可以了
空闲列表:针对堆内存中的空间零散的存在, 虚拟机维护一个列表, 记录着哪里被分配了, 哪里还空闲着,
4.分配完内存之后, 要对对象的头进行初始化, 这些信息包括:该对象对应类的元数据, 该对象的GC代, 对象的hash码.
5.最后, 一个新对象的产生后还需要执行构造器中的命令, 来完成java层面的初始化, 在jvm中为方法. 到此一个新对象就创建完了.


3.对象的内存模型
1.对象的头
在对象头中有两类信息:标志信息(Mark Word)和元信息指针(Kclass Pointer)
标识信息用来存放对象一些固有属性的状态,这些属性从对象创建就有,而不是 Java 的使用者定义的:
哈希码:对象的唯一标识符
对象的分代年龄:与垃圾回收有关
线程持有的锁
锁的状态
偏向线程 ID、偏向时间戳
数组长度:如果该对象是数组,会有数组长度信息
元信息指针是指向方法区中类元信息的指针。
2.实例的信息
实例的信息存放的是一些对 Java 使用者真正有效的信息,也就是类中定义的各个字段,其中还包括从父类继承的字段。
3.对齐填充
对其填充这段内存段存在与否取决于前面两部分的长度,为了保证对象内存模型的长度为 8 字节的整数倍,这也是虚拟机自动内存管理的要求。
4.使用对象
对象创建起来之后,就会在虚拟机栈中维护一个本地变量表,用于存储基础类型和基础类型的值,引用类型与引用类型的值。
其中引用类型的值就是堆中对象地址。如何引用堆中地址有两种方式:
句柄:在堆中维护一个句柄池,句柄中包含了对象地址,当对象改变的时候,只需改变句柄,不需要改变栈中本地变量表的引用
直接指针:对象的地址直接存储在栈中,这样做的好处就是访问速度变快
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值