前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java面试-JVM虚拟机内存布局

Java面试-JVM虚拟机内存布局

作者头像
颍川
发布2021-03-20 14:00:55
4310
发布2021-03-20 14:00:55
举报
文章被收录于专栏:颍川颍川

文章目录

  • 内存布局
    • 本地方法栈
    • 程序计数器
    • 虚拟机栈
    • 元空间(MetasSpace)

内存布局

JVM内存布局规定了Java在运行过程中内存申请,分配,管理策略,保证了JVM的高效平稳运行。不同JVM对于内存的划分方式和管理机制存在着部分差异。结合JVM虚拟机规范,来探讨一下经典的JVM内存布局。

  1. 本地方法栈
  2. 程序计数器
  3. 虚拟机栈
  4. 堆(Heap)
  5. 元空间(MetasSpace)

本地方法栈

本地方法栈在JVM内存布局中,也是线程对象私有的,但是虚拟机栈’主内’,而本地方法栈’主外’,这个内外之别是针对JVM来说的,本地方法栈为Native方法服务。线程开始调用本地方法栈时,会进入一个不受JVM约束的世界。本地方法可以通过JNI来访问虚拟机运行时的数据区,甚至可以调用寄存器,具有和JVM相同能力和权限。当大量本地方法栈出现时,势必会削弱JVM对系统的控制力,因为他的出错信息都比较黑盒。对于内存不足本地方法栈会抛出OOM

程序计数器

每个线程创建后,都会产生自己的程序计数器和栈帧,程序计数器用来存放执行指令的偏移量和行号指示器等,线程执行或恢复都要依赖程序计数器。程序计数器在各个线程之间互不影响。此区域不会发生内存溢出异常。

虚拟机栈

栈是一个先入后出的数据结构,就像子弹的弹夹,最后压入的子弹先反射,压在底部的子弹最后发射,撞针只能访问位于顶部的那一颗子弹。

相对于寄存器的运行环境来说,JVM是基于栈结构的运行环境,栈结构移植性更好,可控性更强。JVM中的虚拟机栈是描述Java方法执行的内存区域,它是线程私有的。栈中的元素用于支持虚拟机进行方法的调用,每个方法从开始调用到执行完成的过程,就是栈帧从入栈到出栈的过程。

在活动线程中,只有位于栈顶的帧才是有效的,称为当前栈帧。正在执行的方法称为当前方法。栈帧是方法运行的基本结构。在执行引擎运行时,所有指令只能针对当前栈帧进行操作。

虚拟机栈通过出栈和入栈的方式,对每个方法对应的活动栈帧进行运算处理。方法正常执行结束后,肯定会跳转到另一个栈帧上。在执行的过程中,如果出现异常会进行异常回朔,返回地址通过异常处理表确认。

栈帧在整个JVM体系中地位颇高,包括局部变量表,操作栈,动态链接,方法返回地址。

  • 局部变量表  局部变量表是存放方法参数和局部变量的区域。
  • 操作栈  操作栈是一个初始化状态为桶式结构栈.在方法执行过程中,会有各种指令往栈中写入和提取信息。JVM的执行引擎是基于栈的执行引擎。其中的栈值的就是操作栈。字节码指令是基于栈类型的,栈的深度在方法原信息的stack属性中。
  • 动态连接  每个栈帧中包含一个常量池中对当前方法的引用。目的是支持方法调用过程的动态连接
  • 方法返回地址  方法执行对应两种退出情况1. 第一种正常退出 第二种 异常退出

堆是OOM故障最主要的发源地,他存储着几乎所有实例对象,堆有垃圾收集器自动回收垃圾,堆区有各个子线程共享使用。

堆区分成两大块,新生代和老年代,对象产生之初在新生代,不如暮年进入老年代,但是老年代也接纳在新生代无法容纳的大对象。新生代有1个Edea区+2个Survior区。绝大部分对象在Edea区生成,当Edea区装填满后,会触发YGC。垃圾回收的时候,在Edea区实现清除策略,没有被引用的对象则直接回收,依然存活的对象被移送到Survior区,这个区被分为S0与S1两块内存空间。每次YGC的时候,他们将存活的对象复制到未被使用的那块空间,然后将正在使用的那块空间完全清除,然后交互两块区域的使用状态。如果YGC移送的对象大于Survior区容量上限,则直接移交给老年代,S0与S1区存活对象来回交换超过设置参数后会被移动到老年代。

如果新生代移送的超大对象的阀值超过上限,则尝试在老年代中进行分配,如果老年代也无法放下,则触发FGC,如果依然无法放下,则抛出OOM。

元空间(MetasSpace)

元空间的前身是Perm区,Perm区在JDK8中被淘汰,因为它启动时固定大小,很难进行调优,并且FGC时会移动类元信息。在某些场景下动态加载类过多会触发Perm区OOM。

区别与永久代,元空间在本地内存中分配。JDK8里,Perm区中所有内容中字符串常量移动到堆内存,其他内存包括类元信息,字段,静态属性,方法,常量等都移动到元空间。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-03-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 内存布局
    • 本地方法栈
      • 程序计数器
        • 虚拟机栈
            • 元空间(MetasSpace)
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档