JVM内存结构

85 阅读2分钟

JVM内存结构

JVM Java虚拟机是一种虚拟的计算机程序,为Java提供了运行环境来运行源码编译成的字节码文件。

JVM内存结构是指运行Java程序时,JVM组织和管理内存的结构。

JVM内存主要分为5个区域,分别存储不同类型的数据。

image.png

方法区

  • 主要存储类信息,类加载器,运行时常量池。
  • 运行时常量池,存储编译期生成的各种字面量和符号引用。
  • jdk7及之前中,方法区的实现是永久代,永久代在堆中。运行时常量池中存储了字符串常量池。
  • jdk8中,方法区的实现是元空间,元空间在本地内存中。字符串常量池存储在堆中。

  • 堆是线程共享的,需要考虑线程安全问题。
  • Java中几乎所有的对象实例都存储在堆中。
    • 逃逸分析:如果方法中某些对象不会返回,也没有被外界使用,就会直接在栈上分配内存。
  • 堆是垃圾回收器管理的主要区域,从垃圾回收的角度看,Java堆还可以细分为新生代和老年代。

image.png

程序计数器

  • 每个线程都有一个独立的程序计数器,线程切换时,程序计数器也会切换到相应线程的执行地址。
  • 程序计数器存储下一条指令的执行地址,解释器读取下一条指令然后执行。

虚拟机栈

  • 虚拟机栈线程私有,生命周期和线程相同,随着线程的创建而创建,随着线程的死亡而死亡。
  • 每个方法执行的时候都会创建一个栈帧来存储方法的局部变量表、操作数栈、动态链接、方法返回地址等信息。栈的大小决定了方法调用的可达深度(递归过深会导致StackOverflow)。

image.png

本地方法栈

  • jvm需要用到c或者c++写的一些本地方法(native修饰),本地方法运行时使用的内存的就是本地方法栈。
  • 本地方法被执行的时候,在本地方法栈也会创建一个栈帧,存放本地方法的一些信息。