JVM学习笔记(一)内存模型

概述

Java虚拟机在执行Java任务时,会把它所管理的内存分为不同区域。这些区域有各自的用途,以及创建和销毁时间,有的区域随着虚拟机进程的启动一直存在,有的区域依赖线程的启动和结束而建立和销毁。Java虚拟机所管理的内存将会包括以下几个运行时数据区域。
在这里插入图片描述

程序计数器

程序计数器(Program Counter Register)是一块比较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器完成。
由于Java虚拟机的多线程是通过线程轮流切换、分配处理器执行时间实现的,所以一个处理器(对于多核处理器来说是一个内核)某一时刻只会执行一个线程。为每个线程分配程序计数器,记录线程执行到的代码行数,保证在多线程切换时可以找到正确的执行位置。各个程序计数器之间互不影响,独立存储,称之为“线程私有的内存”。
如果线程执行的是一个Java方法,这个计数器记录的是字节码指令的地址,如果是Native方法,则这个计数器值为空。此内存区域是唯一不存在OutOfMemoryError情况的区域。

Java虚拟机栈

Java虚拟机栈也是线程私有的,生命周期和程序计数器一样。每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法的调用直至执行完毕,都伴随着一个栈帧在虚拟机栈中从入栈和出栈的过程。
局部变量表存放了编译期可知的各种Java虚拟机基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference指向地址的引用指针或者句柄)和returnAddress类型(指向了一条字节码指令的地址)
这些数据类型在局部变量表中的存储空间以局部变量槽(Slot)表示,long和double占用2个Slot,其他类型都只占1个Slot。当进入一个方法时,在栈帧中分配多大的局部变量空间是完全确定的。
Java虚拟机栈规定了两类异常状况:如果线程请求的栈深度大于虚拟机栈所允许的深度,将抛出StackOverflowError异常;如果Java虚拟机栈容量可以动态扩展,当扩展时无法申请到足够的内存会抛出OutOfMemoryError异常

本地方法栈

本地方法栈和虚拟机栈类似,不同在于本地方法栈为虚拟机使用的本地(Native)方法服务,虚拟机栈为使用的Java方法服务。

Java堆

对于Java应用程序说,Java堆是最大的内存区域。Java堆是线程共享的,当Java虚拟机启动时创建。此内存的唯一目的就是存放对象实例。Java堆即可以被实现成固定大小的,也可以是可扩展的。如果在Java堆中没有内存完成实例分配,并且堆也无法扩展时,会抛出OutOfMemoryError异常
Java堆是垃圾收集器管理的内存区域,从回收内存的角度分析,由于现代垃圾收集器大部分都是基于分代收集理论设计的,所以Java堆中经常会出现“新生代”“老年代”“永久代”“元空间”“Eden空间”“From Survivor空间”“To Survivor空间”等名词。这些名词只是为了更好的描述垃圾收集时的具体过程,并非是Java虚拟机具体实现的固有内存布局,更不是对Java堆的进一步细分。

方法区

方法区和Java堆一样是线程共享的,主要存储已被虚拟机加载类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据
说到方法区,不得不提一下“永久代”的概念。在JDK 8以前,HotSpot虚拟机设计团队选择将收集器的分代设计扩展到方法去,这样使得垃圾收集器能像管理Java堆内存一样管理方法区。所以在Java堆需要内存回收时,方法区也会一起被回收。在JDK 8以后用“元空间”取代了“永久代”,将Java堆和方法区分离。

运行时常量池

运行时常量池是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池表,用于存放编译期生成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。
运行时常量池对与Class常量池的另一个重要特性是具备动态性,并不一定只有在编译器才能产生,运行期间也可以将新的常量放入池中,这种特性被开发人员利用得比较多的便是String类的intern()方法。(在JDK 7以前属于方法区,JDK 7以及以后放在了Java堆中)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值