Java虚拟机内存区详解

Java内存结构详解

Java内存也称为运行时数据区,先来看一下Java内存结构图:
在这里插入图片描述

1:程序计数器

程序计数器是属于线程私有的,所占空间不大,每个线程一份,用来保存当前线程要执行的下一条指令的地址,
在多线程中,线程的执行是轮流切换来获取CPU的执行时间的,因此任意时刻一个CPU内核只会执行一条线程中的指令,为了在线程切换后可以恢复到正确的执行位置,所以每个线程都需要独立的程序计数器

2:Java虚拟机栈

Java虚拟机栈是线程私有的,里面是一个个栈帧,每一个栈帧对应的是一个个方法,当线程执行一个方法是,会创建一个对应的栈帧,将其压入栈中,将方法执行完成后会将该栈帧从栈中移除,栈是一种先进后出的数据结构,所以当前执行的方法对应的栈帧必然是在Java虚拟机栈的顶部
栈帧中包含以下5个部分:

在这里插入图片描述

(1):局部变量表
该表中存储的是方法中的局部变量,包括方法的参数;对于基本数据类型的变量,存储的是变量的值,对于引用类型的变量,存储的是对象的引用,局部变量表的大小,在编译期间确定,程序执行期间,他的大小不会改变

(2)操作数栈
操作数栈是用来执行表达式的计算,当一个方法刚开始执行的时候,这个方法的操作数栈是空的,在方法执行过程中,会有各种字节码指令往操作数栈中写入和提取数据,也就是入栈和出栈操作。例如在做算术运算的时候是通过操作数栈来进行的,又或者调用其他方法时是通过操作数栈来进行参数的传递

(3)指向运行时常量池的引用
当前方法所属的类的运行时常量池的引用,引用其他的常量类或者使用字符串常量池中的字符串。

(4)方法返回地址
方法执行完毕后需要返回到方法调用的位置,程序才能继续向下执行,方法返回地址保存了一些用来帮助恢复上层方法的执行状态和信息。

(5)动态链接
每一个栈帧都包含了一个指向运行时常量池中该方法的引用,持有这个引用是为了支持方法调用过程中
的动态链接

(6)java虚拟机栈会出现的两种错误
StackOverFlowError : 当前线程请求栈的深度超过Java虚拟机栈的最大深度时抛出

OutOfMemoryErroe :如果Java虚拟机支持动态扩容,当栈扩容时申请不到足够的内存时抛出,最有名的HotSpot虚拟机是不允许动态扩容的,所以HotSpot是不会出现该异常的。

3:本地方法栈

本地方法栈与Java虚拟机类似,区别是本地方法栈执行的是本地方法,也就是带有native关键字修饰的方法
在HotSpot虚拟机中,本地方法栈和Java虚拟机不做区分

4:堆

堆是所有线程共享的一块区域,在Java虚拟机启动时创建,用来存储对象(数组也是一个对象)
之前的Java中几乎所有的对象都会在队中分配但随着 JIT 编译器的发展和逃逸技术的逐渐成熟,所有的对象都在堆上分配就不那么绝对了。从JDK 1.7 开始,Java虚拟机已经默认开启逃逸分析了,意味着某些方法中的对象引用没有被返回或者没有在外界使用(也就是未逃逸出去),那么对象将直接在栈中分配内存;

堆是Java垃圾回收器管理的主要区域,因此也被称为GC堆,从垃圾回收器的角度,由于垃圾回收器基本都采用了分代垃圾收集算法,所以对还可以细分为:新生代,老年代; 新生代又可以细分为:Eden空间,From SUrvivor ,To Survivor空间等。。为的就是更好的进行垃圾回收,更块的分配内存;

堆最容易出现的就是OutOFMemoryError错误,分为以下两种形式:
• OutOfMemoryError:GC Overhead Limit Exceeded :当JVM花太多的时间执行垃圾回收,并且只能回收很少的堆空间时,就会发生该错误。
• java.lang.OutOfMemoryError:Java heap space :假如在创建新的对象时,堆内存中的空间不足以防止新创建的对象,就会引发该错误,和本机的物理内存无关,和我们配置的虚拟机内存大小有关

5:元空间

JDK1.8的时候,原有的方法区被彻底移除,取而代之的就是元空间。元空间和堆一样,是线程的共享区域,它用来存储已经被Java虚拟机加载到类信息,常量,静态变量,以及编译器编译后的代码等

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值