内存模型、JVM

Java 内存模型

Java虚拟机在运行Java程序时,会管理着一块内存区域:运行时数据区。在运行时数据区里,会根据用途进行划分:

  1. Java虚拟机栈(栈区)
  2. 本地方法栈
  3. Java堆(堆区)
  4. 方法区
  5. 程序计数器

20201016195350581.png

Java 堆

Java 堆堆内存(Heap),是垃圾收集器管理的主要区域,因此也叫 GC 堆,是 JVM 内存中最大,线程共享的,用于存放 Java 对象实例,从内存回收的角度分为新生代老年代,从内存分配的角度,相当于多个线程私有的分配缓冲区。在堆中没有足够内存完成对象实例的分配和堆无法再扩展时,会抛出 OutOfMemoryError 异常

20201016195432476.png

Java虚拟机栈

Java 虚拟机栈栈内存(Stack),是Stack、Java 方法执行的内存模型,是线程私有的,生命周期与线程相同。主要以栈帧的形式用于存储 Java 方法执行时的局部变量(含数据类型、对象的引用),在方法执行结束后释放。在虚拟机栈扩展无法申请到内存空间时,抛出 OutOfMemoryError 异常。线程请求栈深度大于虚拟机允许的深度抛出 **StackOverflowError 异常。**每个 Java 方法执行时都会创建一个栈帧,一个方法从被调用到执行完成相当于一个栈帧从入栈到出栈,局部变量表所需内存空间在方法编译时就会完成分配,在方法运行时不会改变大小
2020101619545964.png

本地方法栈

与 Java虚拟机栈类似,区别在于:服务对象,即Java虚拟机栈为执行 Java 方法服务;本地方法栈为执行 Native方法服务20201016195523886.png

方法区

方法区是堆的一个逻辑部分,为了与 Java 堆区分,又称**"非堆"区域(Non-Heap),用于存储已虚拟机加载类信息、常量、静态变量等数据,是线程共享的,该区域的内存回收主要是针对运行时常量池和对类的卸载,又称永久代**,回收条件苛刻,很少出现垃圾收集。当方法区无法满足内存分配需求时,会抛出OutOfMemoryError异常
20201016195539754.png
方法区内部包含一个运行时的常量池是方法区的一部分,用于存放类文件在编译时生成的各种字面量和符号引用,具有动态性(运行时也可以添加新的常量),当常量池无法申请到内存时,会抛出OutOfMemoryError异常

程序计数器

当前线程所执行的字节码的行号指示器,通过改变计数器的值,来选取下一条执行的字节码指令,用于实现异常处理、线程恢复等基础功能。程序计数器是线程私有的,内存空间小。唯一一个在 JVM 中无任何 OutOfMemoryError 异常的内存区域
为了使得线程切换后恢复到正确的执行位置,每条线程都配有一个独立的程序计数器,各个线程互不影响,独立存储的内存区域

https://www.yuque.com/wanghl-suxaf/obsqmm/qw0dmf8yrbbqmu69

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值