前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JVM内存模型详解

JVM内存模型详解

作者头像
小土豆Yuki
发布2021-01-18 11:35:40
4140
发布2021-01-18 11:35:40
举报
文章被收录于专栏:洁癖是一只狗洁癖是一只狗

在Java中,JVM内存模型主要分为堆,方法区,程序计数器,虚拟机栈,本地方法栈,如下图

今天我们就分别讲解一下这几个区域的作用

堆是JVM内存中最大的一块内存,该内存是被多有线程共享,几乎所有的对象和数组都在堆上分配,堆被划分为新生代和老年代,新生代又分为Eden和Survivor区,最后Survivor分为From Survivor和To Survivor组成

java6中,永久代放在非堆内存去,java7把永久代的静态变量和运行时常量放在了堆中,java8永久代被元空间代替了,结构如下图

程序计数器

程序计数器是一块很小的内存空间,主要记录了线程的字节码资质,如分支,循环,跳转,异常,线程恢复等会依赖程序计数器

比如,在多线程中,当线程的数量多于CPU的数量的时候,线程之间就会发生CPU抢占,比如一个线程的时间片用完了,或者其他原因此线程的CPU资源被提前抢夺,那么这个线程退出就需要一个程序计数器记录下一次被唤醒的指令,且是唯一一个没有规定任何OutOfMemoryError情况的区域.

方法区

很多开发者都习惯将方法区成为永久代,但是这两者并不等价。

HotSpot虚拟机使用永久代实现方法区,但是在其他虚拟机中,例如Oracle的JRockit,IBM的J9就不存在永久代的说法,可以说,HotSpot虚拟机中,设计人员使用永久代实现JVM内存模型的方法区。

方法区是用来存储加载类的相关信息,包括类信息,运行时常量,字符串常量池,类信息包括类的版本,字段,方法,接口和父类信息

JVM在执行某个类的时候,必须经过加载,连接,初始化,而连接又分为验证,准备,解析三个阶段,在加载类的时候,JVM会先加载class文件,而在class文件中除了有类的版本,字段,方法和接口等描述信息,还有一项信息就是常量池,为常量池存放的是字面量和符号引用

  • 字面量就是字符串,基本类型的常量(final修饰的变量)
  • 符号应用则包括类和方法的权限定名,字段的名称和描述以及方法的名称和描述符

同时类加载到内存之后,JVM将class文件的常量池放到了运行时常量池,在解析阶段,JVM会把符号引用替换为直接引用

例如,类中的一个字符串常量在class文件中,存放在class文件常量池中,在类加载完之后,JVM把这个字符串常量放到了运行时常量池,而在解析阶段,会指定该字符串对象的索引值,运行时常量是共享的,所以class文件中常量池多个相同的字符串在运行时常量池只有一份.

运行池常量是方法区的一部分,运行时常量相对于class中的常量池有一个另外的特性,就是具备动态性,java语言并不要求常量一定在编译期才会产生,运行期间也可以将新的常量放入池中,比如我们使用String.intern().

方法区和堆一样是线程共享的,因此如两个线程同时访问方法区的同一个类信息,而这个类还没有装入JVM,那么只有一个线程允许加载他,另外一个等待

同时在java7中已经把静态变量和运行池常量放到了堆中,其他部分存储在JVM的非堆内存中,但是在java8版本,使用元空间替代了永久代,除了静态变量和运行时常量还放在堆中,其余在方法区的信息都迁移到了元空间,而元空间是本地内存.

为什么用元空间替换永久代

  1. 移除永久代是为了以后可以融合HotSpot JVM与JRockit VM做准备,因为JRockit没有永久代
  2. 永久代内存经常溢出,爆出异常java.lang.OutOfMemoryError: PermGen,这是因为java7指定永久代的大小是8M,而每次FULL GC的回收率偏低,不是很好,并且永久代的大小也依赖很多因素,如JVM加载的class总数,常量池的大小和方法的大小.

虚拟机栈

java虚拟机是线程私有的内存空间,他和java线程一起创建,和销毁,当一个线程创建的时候,会在虚拟机栈中申请一个线程栈,存放方法的局部变量,操作数栈,动态链接方法和返回地址等信息,并参与方法的调用和返回,每一个方法的调用伴随着入栈,调出伴随着出栈

本地方法栈

本地方法栈和虚拟机栈功能类似,但是他是管理本地方法的调用,java虚拟机用于管理java函数的调用,且本地方法栈是有c语言实现,而虚拟机栈是有java实现

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-01-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 洁癖是一只狗 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档