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

相关推荐
无尽的大道23 分钟前
Java反射原理及其性能优化
jvm·性能优化
AAA 建材批发王哥(天道酬勤)7 小时前
JVM 由多个模块组成,每个模块负责特定的功能
jvm
JavaNice哥13 小时前
1初识别jvm
jvm
涛粒子13 小时前
JVM垃圾回收详解
jvm
YUJIANYUE13 小时前
PHP将指定文件夹下多csv文件[即多表]导入到sqlite单文件
jvm·sqlite·php
逊嘘14 小时前
【Java语言】抽象类与接口
java·开发语言·jvm
鱼跃鹰飞1 天前
大厂面试真题-简单说说线程池接到新任务之后的操作流程
java·jvm·面试
王佑辉1 天前
【jvm】Major GC
jvm
阿维的博客日记1 天前
jvm学习笔记-轻量级锁内存模型
jvm·cas·轻量级锁