JVM 内存布局

内存区域分布介绍:

jvm内存布局是理解Java应用程序运行时内存管理的重要一部分。JVM内存分为几个区域,每个区域有不同的作用。以下是JVM内存布局详细说明:

JVM内存分布图:

JVM内存区域详细说明:

  1. 方法区(Method Area) / 元空间(Metaspace):

    • 用于存储类信息、常量、静态变量和即时编译器编译后的代码。
    • 在HotSpot虚拟机中,方法区被划分为永久代(Permanent Generation)和元空间(Metaspace)两部分。

元空间的大小取决于应用程序的类和元数据的数量。

  1. 堆(Heap):

    • 存储对象实例,包括通过new关键字创建的对象和数组。
    • 在堆中,可以分为新生代(Young Generation)和老年代(Old Generation)。
    • 新生代又分为Eden区和两个Survivor区(S0和S1)。

JVM内存分配给堆是最多的,因为堆用于存储对象实例。在堆内新生代(Young Generation)和老年代(Old Generation)的分配比例也会根据应用程序的性质和工作负载进行调整。通常情况下,新生代分配的内存较小,老年代分配的内存较大。调整生代与老年代的内存区域时会影响GC 与 FGC 的次数,是JVM调优的关键。

  1. 栈(Stack):

    • 存储局部变量、方法调用和部分结果。
    • 栈被线程私有化,每个线程都有自己的栈。

栈的内存占用相对较小,但是在多线程的情况下,总体的栈内存占用可能会比较大。另外 要是代码中存在递归时,如果有逻辑错误时可能会直接耗尽内存从而引发报错。

  1. 程序计数器(Program Counter Register):

    • 记录当前线程执行的字节码指令的地址。
    • 在多线程环境下,每个线程都有独立的程序计数器。
  2. 本地方法栈(Native Method Stack):

    • 与虚拟机栈类似,但是为本地方法服务。
  3. 直接内存(Direct Memory):

    • 由操作系统管理的内存区域,不受JVM内存限制。
    • 主要用于NIO(New I/O)等操作。

直接内存的使用与具体应用程序的I/O操作和内存映射等有关。一般直接内存的占用较小,但也取决于应用程序的具体需求。

相关推荐
invicinble8 小时前
jar包在执行的时候需要关注的细节(提供一个解构jvm问题的视角)
java·jvm·jar
Evan芙9 小时前
JVM原理总结
jvm
fei_sun9 小时前
【总结】【OS】成组链接法
jvm·数据结构
7ioik11 小时前
JVM 核心参数调优清单
jvm
CodeAmaz13 小时前
JVM一次完整GC流程详解
java·jvm·gc流程
笃行客从不躺平15 小时前
JVM 类加载机制复习
jvm
飞火流星0202715 小时前
【Arthas工具】使用Trace命令分析Java JVM方法调用链路及耗时
java·jvm·arthas·jvm性能调优·java方法调用链路分析及耗时·jvm实时分析·jvm方法调用实时分析
7ioik15 小时前
JVM 调优工具深度指南:从监控到诊断的全流程实战
jvm
喵手16 小时前
JVM 基础知识:深入理解 Java 的运行时环境!
java·jvm·jvm基础·java运行环境
WizLC1 天前
【JAVA】JVM类加载器知识笔记
java·jvm·笔记