JVM内存结构

悲观者从机会中看到困难。乐观者从困难中看到机会。
——温斯顿·丘吉尔

类加载器Loading

-- 虚拟机自带的加载器

1.Boot Strap Class Loader : 启动类(根加载器)

2.Extension Class Loader: 扩展类加载器

3.Application Class Loader : 应用程序加载器

JVM的内存结构主要分为以下几个部分:

  • 程序计数器:可以看作是当前线程所执行的字节码的行号指示器,用于存储当前线程正在执行的 Java方法的 JVM 指令地址。如果线程执行的是 Native 方法,计数器值为 null。是唯--个在 Java 虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域,生命周期与线程相同。
  • Java 虚拟机栈:每个线程都有自己独立的 Java 虚拟机栈,生命周期与线程相同。每个方法在执行时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。可能会抛出StackOverflowError 和OutOfMemoryError 异常。
  • 本地方法栈:与 Java 虚拟机栈类似,主要为虚拟机使用到的 Native 方法服务,在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。本地方法执行时也会创建栈帧,同样可能出现 StackOverflowError 和OutOfMemoryError 两种错误。
  • Java 堆:是 JVM 中最大的一块内存区域,被所有线程共享,在虚拟机启动时创建,用于存放对象实例。从内存回收角度,堆被划分为新生代和老年代,新生代又分为 Eden 区和两个 Survivor 区(FromSurvivor 和 To Survivor)。如果在堆中没有内存完成实例分配,并且堆也无法扩展时会抛出OutOfMemoryError 异常。
  • 方法区(元空间):在 JDK 1.8及以后的版本中,方法区被元空间取代,使用本地内存。用于存储已被虚拟机加载的类信息、常量、静态变量等数据。虽然方法区被描述为堆的逻辑部分,但有“非堆”的别名。方法区可以选择不实现垃圾收集,内存不足时会抛出 OutOfMemoryError 异常。
  • 运行时常量池:是方法区的一部分,用于存放编译期生成的各种字面量和符号引用,具有动态性,运行时也可将新的常量放入池中。当无法申请到足够内存时,会抛出OutOfMemoryError 异常。
  • 直接内存:不属于 JVM 运行时数据区的一部分,通过 NI0 类引入,是一种堆外内存,可以显著提高I/0 性能。直接内存的使用受到本机总内存的限制,若分配不当,可能导致 OutOfMemoryError 异常
posted @ 2025-03-29 14:08  Tsukinor  阅读(19)  评论(0)    收藏  举报