JVM-(5)JVM内存模型

JVM内存模型

JVM由 运行时数据区、类加载器、执行引擎 等部分组成,在 Class 加载过程 这篇文章中我们可以了解到,JVM是通过类加载器将 java 文件编译后的 .class 二进制文件加载到内存的,那么java程序在执行的过程中内存是如何分配的呢,本文将介绍这部分,通常说的 JVM内存模型指的就是 运行时数据区(Runtime Data Area)

运行时数据区(Runtime Data Area) 分为 线程共享区 和 线程私有区

  • 线程共享区:所有线程能访问这块内存数据,随虚拟机或者GC而创建和销毁
  • 线程私有区:每个线程都会有它独立的空间,随线程生命周期而创建和销毁

线程共享区

方法区(Method Area)

方法区(在Java8之后方法区的概念更改为元数据空间)属于线程共享的内存区域,又称Non-Heap(非堆),主要用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,根据Java 虚拟机规范的规定,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError 异常。值得注意的是在方法区中存在一个叫运行时常量池(Runtime Constant Pool)的区域,它主要用于存放编译器生成的各种字面量和符号引用,这些内容将在类加载后存放到运行时常量池中,以便后续使用。
关于方法区的变化
1、 java7之前,方法区位于永久代(PermGen),永久代和堆相互隔离,永久代的大小在启动JVM时可以设置一个固定值,不可变;
2、 java7中,static变量从永久代移到堆中;
3、 java8中,取消永久代,方法存放于元空间(Metaspace),元空间仍然与堆不相连,但与堆共享物理内存,逻辑上可认为在堆中 ,但是实际上我们说的堆指的是用于存放java对象的那些空间。元空间并不在虚拟机中,而是使用本地内存

JVM堆(Java Heap)

Java 堆也是属于线程共享的内存区域,它在虚拟机启动时创建,是Java 虚拟机所管理的内存中最大的一块,主要用于存放对象实例,几乎所有的对象实例都在这里分配内存(并不是所有新建对象new Object()在分配时都会在堆中),注意Java 堆是垃圾收集器管理的主要区域,因此很多时候也被称做GC 堆,如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError 异常。

线程私有区

程序计数器(Program Counter Register)

属于线程私有的数据区域,是一小块内存空间,主要代表当前线程所执行的字节码行号指示器。字节码解释器工作时,通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成,主要作用其实就是因为CPU的时间片在调度线程工作时会发生“中断”某个线程让另外一个线程开始工作,那么当这个“中断”的线程重新被CPU调度时如何得知上次执行到那行代码了?就是通过负责此类的程序计数器来得知。

虚拟机栈(Java Virtual Machine Stacks)

JVM是基于栈结构的运行环境,栈结构移植性更好,可控性更强。JVM中的虚拟机栈是描述Java方法执行的内存区域,属于 线程私有。当线程开始执行时,每个方法执行时都会创建一个栈桢来存储方法的的局部变量表、操作数栈、动态链接方法、返回值、返回地址等信息。每个方法从调用直结束就对于一个栈桢在虚拟机栈中的入栈和出栈过程,如下:

本地方法栈(Native Method Stacks)

本地方法栈属于线程私有的数据区域,这部分主要与虚拟机用到的 C所编写的 Native 方法相关,当有程序需要调用 Native 方法时,JVM会在本地方法栈中维护着一张本地方法登记表,这里只是做登记是哪个线程调用的哪个本地方法接口,并不会在本地方法栈中直接发生调用,因为这里只是做一个调用登记,而真正的调用需要通过本地方法接口去调用本地方法库中C编写的函数,一般情况下,我们无需关心此区域。

参考:
Java内存模型(JMM)与Volatile关键字底层原理
华为技术专家居然把JVM内存模型讲解这么细致
jdk1.8关于方法区的变化

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值