JVM:Java内存区域

线程私有(独享区域)
1.程序计数器:

当前字节码指令的指示器,因为线程之间进行切换后,再次回到本线程时,要知道进行到哪一步了,下一步应该执行那个指令,程序计数器的功能就是如此,此区域是唯一一个没有规定任何 OOM 情况的区域
程序计数器记录的内容:
(1)如果正在执行的是一个 java 方法,那么程序计数器记录的是正在执行的虚拟机字节码指令的地址
(2)如果正在执行的是本地(Native)方法,那么程序计数器的值为空

2.Java虚拟机栈

通常所说的"栈" 就是指的是 虚拟机栈,虚拟机栈的生命周期和线程相同,java虚拟机栈描述的是 方法 执行的线程内存模型:每个方法执行的时候,java虚拟机会同步创建一个栈帧,栈帧主要储存:局部变量表,操作栈,动态链接,方法出口等信息
每个方法从调用到执行完毕的过程,就是对应的栈帧在虚拟机栈出栈和入栈的过程
局部变量表储存内容:编译器可知的java基本数据类型(byte,short,char,int,float,double,long)、引用对象(reference类型,并不是该对象示例的本身,而是该对象起始地址的引用指针,或者是指向该代表对象的句柄)、returnAddress(指向一条字节码指令的地址)
这些数据类型的储存大小单位是局部变量槽,这里的大小不是真实数据的内存大小,在不同的虚拟机下一个局部变量槽所占32个比特还是64个比特,有虚拟机自行决定,其中 long 和 double 占用 2 个变量槽,其余都占一个变量槽
并且局部变量表所需要的内存空间在编译器就完成分配,当进入一个方法时,这个方法在栈帧中所需要多大的局部变量空间就是确定的,在方法运行期间局部变量表大小也不会发生改变
两种异常:(1) 线程请求的栈深度超过JVM虚拟机允许的最大深度时,就会出现 StackOverflow 异常
(2) 如果虚拟机允许动态扩展,当扩展时无法申请到足够的内存就会抛出 OutOfMemoryError 异常

3.本地方法栈

和Native关键相关的操作,也会抛出 StackOverflow 和 OutOfMemoryError 异常

线程共享区域:
1.Java堆

java堆是虚拟机内存管理中最大一块内存区域,堆在虚拟机启动的时候创建,主要存放的是对象的实例,几乎所有的对象实例和数组都在堆上分配,但是随着技术的不断发展,java对象实例都分配在堆上也变得不那么绝对,例如逃逸技术,栈上分配,标量替换等优化手段
因为堆是线程共享的,所以存在多线程同时要在堆上分配对象实例内存的情况,此时就在新生代的 Eden 区域创建了 TLAB 本地分配缓存区 这块内存来缓解这个问题,或者通过 CAS 机制保证多线程情况下对象内存分配的安全
堆大小可以扩展,通过(参数-Xmx和-Xms设定),如果在 Java 堆上分配对象实例内存时,无法分配足够大小的内存或者堆大小也无法扩展时,就会出现 OutOfMemoryError 异常

2.方法区/元数据区

主要储存:已经被虚拟机加载的类型信息,常量,静态变量,即时编译器编译后的代码缓存等数据
JDK1.8之前,方法区也被称为 永久代,实际上永久代和方法区的概念不是等价的,是因为当时 HotSpot 虚拟机设计时选择把垃圾收集器的分代设计扩展到方法区,也就是通过永久代来实现方法区,这样就垃圾回收器就可以像收集堆一样来管理 方法区,省去了专门给方法区编写内存管理的代码工作,但是其他虚拟机就没有永久代这样的概念
方法区大小和堆一样可以通过参数选择固定的值或者进行扩展,主要回收内容:常量池中废弃的常量和类型的卸载,注意:类型的卸载条件很苛刻
方法区异常:如果方法区无法满足新的内存分配需求,抛出 OutOfMemoryError 异常

3.运行时常量池

运行时常量池储存:类的版本,字段,方法,接口等描述信息,常量池表(用于存放再编译器生成的各种字面量与符号引用)
运行时常量池是方法区的一部分,所以当常量池无法再申请到内存就会抛出 OutOfMemoryError 异常
编译期间或者运行时产生的常量放在运行时常量池中,通过 String 类的 intern() 方法在运行期间将新的常量加入运行时常量池中

4.直接内存:与Native本地方法栈有关,也会出现 OutOfMemoryError 异常
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值