美文网首页
JVM运行时内存分区

JVM运行时内存分区

作者: 小海编码日记 | 来源:发表于2023-04-24 21:51 被阅读0次

前文已经了解了对象的创建过程,对象内存空间的回收,在多线程环境下共享变量的同步等虚拟机知识,接下来我们来看下在虚拟机中是如何进行内存管理的,也就是Java虚拟机运行时内存分区。

运行时内存分区

memory space.png

如上图所示,在Java虚拟机运行时按照内存是否私有可以将内存空间分为线程私有和线程共享两大块,其中 方法区线程共享 空间, 虚拟机栈本地方法栈程序计数器线程私有 空间。

方法区

方法区主要用于存储已被加载的类,静态变量,常量和即时编译器编译后的代码等数据,是被线程共享的内存空间。运行时常量池属于方法区的一部分,用于存放编译器生成的各种字面常量和符号引用,当方法区内存不足时,会抛出OutOfMemoryError异常,在对象创建过程及类加载器这两节中,我们其实已经接触过运行时常量池了,如下图:

constants pool.png

堆空间是被线程共享的内存区域,其主要用于存放新创建的对象实例,大多数通过new指令创建的对象都在堆空间,如果创建对象是,堆上没有空间可以完成分配,就会抛出OutOfMemoryError异常,同时我们前面所说的分代回收也指的是在堆空间上针对不同年龄对象进行内存释放的策略。

虚拟机栈

虚拟机栈是线程私有的,其生命周期与线程相同,绑定唯一线程,当线程销毁时,对应的虚拟机栈所占用的空间也会被释放。在虚拟机栈中针对每一个执行的方法都会形成一个栈帧,这个方法从开始调用到调用结束正好对应着相关栈帧在虚拟机栈中出栈入栈的过程,虚拟机栈结构如下图所示:

method stack.drawio.png

从数据结构可以看出,当线程的方法调用超过虚拟机栈的最大深度,会抛出StackOverflowError异常,如果虚拟机栈实现是支持动态扩展的,扩展时申请不到内存会抛出OutOfMemoryError异常

本地方法栈

本地方法栈也是线程私有的,其作用与虚拟机栈类似,主要用于记录native方法调用,与虚拟机栈一样,本地方法栈也可能抛出StackOverflowError和OutOfMemoryError异常

程序计数器

程序计算器也是线程私有的,主要用于记录当前线程执行的位置,在线程休眠或者CPU被抢占导致线程暂停时,下次恢复执行时,通过程序计数器确定所要执行的指令位置等信息,该内存区域是唯一一个在Java虚拟机中没有规定任何OutOfMemoryError异常的区域。

完整内存分区

结合本文和对象管理中的内容,我们可以看到完整的内存分区如下图所示:

runtime memory space.png

相关文章

  • JMM与可见性

    JMM jvm运行时数据区域 Java 内存区域和内存模型是不一样的东西,内存区域是指 Jvm 运行时将数据分区域...

  • Java内存区域(运行时数据区域)和内存模型(JMM)

    Java 内存区域和内存模型是不一样的东西,内存区域是指 Jvm 运行时将数据分区域存储,强调对内存空间的划分。 ...

  • JVM基础知识点

    1. 内存模型以及分区,需要详细到每个区放什么(共分为5个)。 JVM内存模型及分区jvm内存模型和内存分配 程序...

  • 面试系列之JVM

    1.jvm内存模型 jvm内存模型主要有运行时期模型和非运行时期两部分组成,通常说的jvm内存模型是指运行时期内存...

  • java内存模型

    java代码是运行在jvm上面的,java的运行时内存结构即是jvm运行时结构。 java内存结构从内存是否共享的...

  • 【干货】java面试核心知识点精讲---jvm运行内存

    JVM的运行时内存 JVM的运行时内存也叫作JVM堆,从GC的角度可以将JVM堆分为新生代、老年代和永久代。其中新...

  • JVM 内存区域与GC

    本文思路1.JVM运行时内存划分2.对象创建内存动作3.Java线程栈4.JVM垃圾收集器 1.JVM运行时内存划...

  • JVM GC 那些事(二)- 堆上的内存分配机制

    前一篇文章JVM GC 那些事(一)- JVM 运行时内存划分介绍了 JVM 运行时的内存划分情况。本文将介绍 J...

  • Java内存模型(JMM)

    Java内存模型(JMM) 我们常说的JVM内存模式指的是JVM的内存分区;而Java内存模式是一种虚拟机规范。 ...

  • JMM内存模型详解

    Java内存模型(JMM) 我们常说的JVM内存模式指的是JVM的内存分区;而Java内存模式是一种虚拟机规范。 ...

网友评论

      本文标题:JVM运行时内存分区

      本文链接:https://www.haomeiwen.com/subject/nckpjdtx.html