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操作和内存映射等有关。一般直接内存的占用较小,但也取决于应用程序的具体需求。

相关推荐
Flynt10 小时前
Java 27 升级实测:默认值动得比新特性多,有个老参数会让 JVM 直接起不来
java·jvm·后端
用户0942485680314 小时前
第10章:OpenJDK异常体系、栈轨迹与错误诊断入门
java·jvm
杨杨杨大侠16 小时前
Java 不再需要 JVM?一文看懂 GraalVM Native Image、Substrate VM 与 JDK
java·jvm·java ee
顺风尿一寸1 天前
从 ls -U 到 Tomcat libs加载jar包:ext4 目录哈希序如何影响 Java 文件排序顺序
linux·jvm
刘天远1 天前
Agent最小权限实现:策略表、临时令牌与撤权回归
java·jvm·人工智能·sqlite
用户094248568032 天前
第9章:OpenJDK堆分代与 Serial/Parallel GC 基础
java·jvm
小陈不好吃2 天前
深入理解 JVM 内存模型:从堆栈结构到 GC 日志分析实战
java·jvm·java-ee·jdk
liangbo72 天前
12-JVM 调优方法论与参数速查
java·jvm
用户094248568032 天前
第8章:Java 内存模型(JMM)入门——可见性、有序性、原子性
java·jvm
西峰u2 天前
Java多线程从入门到线程安全
java·开发语言·jvm