首页 > 系统相关 >JVM 的内存区域是如何划分的?

JVM 的内存区域是如何划分的?

时间:2024-12-10 19:09:31浏览次数:8  
标签:存储 Java 划分 线程 内存 JVM 方法

JVM 的内存区域划分

JVM 在运行时会将内存划分为多个区域,用于管理程序运行时的不同类型数据。以下是 JVM 内存的主要划分:


1. 方法区(Method Area)

  • 定义
    方法区是运行时数据区的一部分,用于存储类的元信息(元数据)以及与类相关的常量。

  • 存储内容

    • 类的元信息(类名、访问修饰符、方法描述等)。
    • 静态变量。
    • 运行时常量池(编译时生成的常量,如字符串常量)。
    • 方法的字节码。
  • 特点

    • 是线程共享的区域。
    • JDK 8 之前称为永久代(PermGen),JDK 8 之后改为元空间(Metaspace),并从堆内存移到本地内存。

2. 堆区(Heap Area)

  • 定义
    堆是 JVM 中最大的内存区域,主要用于存储对象实例和数组。

  • 存储内容

    • 所有的对象实例。
    • 数组。
  • 特点

    • 是线程共享的区域。
    • 垃圾回收(GC)主要针对堆区。
    • 通常分为两部分:
      • 年轻代(Young Generation)
        • 分为 Eden 区、From Survivor 区、To Survivor 区。
        • 新生对象首先分配在 Eden 区。
      • 老年代(Old Generation)
        • 存放生命周期较长的对象。
      • (JDK 8 之前还包括永久代,JDK 8 后移除)

3. Java 栈区(Java Stack Area)

  • 定义
    每个线程在创建时会分配一个独立的 Java 栈,存储线程执行的局部变量和方法调用信息。

  • 存储内容

    • 方法调用的局部变量。
    • 每个方法调用对应一个栈帧(Frame),存储局部变量表、操作数栈、方法返回值等。
  • 特点

    • 是线程私有的。
    • 方法调用结束后,栈帧会被销毁。
    • 内存回收由系统自动完成。

4. 程序计数器(Program Counter Register)

  • 定义
    程序计数器是一个小内存区域,用于记录当前线程正在执行的字节码指令地址。

  • 存储内容

    • 当前线程执行的字节码指令地址。
    • 如果正在执行本地方法(Native Method),此计数器值为空。
  • 特点

    • 是线程私有的。
    • 不会发生内存溢出。

5. 本地方法栈(Native Method Stack)

  • 定义
    本地方法栈为本地方法(非 Java 方法,如通过 JNI 调用的 C 或 C++ 方法)提供服务。

  • 存储内容

    • 本地方法的调用信息。
    • 本地方法的变量和数据。
  • 特点

    • 是线程私有的。
    • 类似于 Java 栈,但专用于本地方法。

JVM 内存结构示意图

+--------------------+ 
|      方法区        | <- 类的元信息、静态变量等(线程共享)
+--------------------+
|       堆区         | <- 对象实例和数组(线程共享)
+--------------------+
|    本地方法栈      | <- 本地方法调用信息(线程私有)
+--------------------+
|      Java 栈       | <- 方法调用的局部变量(线程私有)
+--------------------+
|   程序计数器       | <- 当前字节码指令地址(线程私有)
+--------------------+

总结

  • 方法区和堆区

    • 是线程共享的,存储全局数据和对象实例。
  • Java 栈、程序计数器、本地方法栈

    • 是线程私有的,存储局部数据和执行上下文。
  • 垃圾回收

    • 主要针对堆区,其他区域的内存由 JVM 自动管理。

JVM 的内存划分提供了强大的运行时支持,不同区域分工明确,保证了程序的高效运行和内存管理的安全性。

标签:存储,Java,划分,线程,内存,JVM,方法
From: https://www.cnblogs.com/eiffelzero/p/18597886

相关文章

  • JVM 的组成
    JVM的组成JVM(JavaVirtualMachine)是Java的核心组件,负责执行Java字节码程序。以下是JVM的主要组成部分:1.类加载子系统(ClassLoaderSubsystem)作用:负责加载.class文件到JVM,将其转换为JVM能识别的内部数据结构。组成:BootstrapClassLoader(引导类加载器):加载JDK......
  • JVM 的 TLAB(Thread-Local Allocation Buffer)是什么?
    JVM的TLAB(Thread-LocalAllocationBuffer)是什么?TLAB(Thread-LocalAllocationBuffer)简介TLAB(Thread-LocalAllocationBuffer)是JVM中堆内存管理的一种优化技术,用于减少多线程环境下对象分配的竞争,提高分配对象的效率。它为每个线程分配一块独立的小堆空间,专门用于分配新对......
  • 分布式锁有哪些实现方式?它们各自的优缺点是什么? JVM调优的基本步骤有哪些如何实现OAut
    本人详解作者:王文峰,参加过CSDN2020年度博客之星,《Java王大师王天师》公众号:JAVA开发王大师,专注于天道酬勤的Java开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯山峯转载说明:务必注明来源(注明:作者:王文峰哦)分布式锁有哪......
  • 案例分享,由于研发的代码逻辑问题,导致redis内存急速飙升
    群582337768分享的一个实际案例由于研发的逻辑处理不当,导致内存急速飙升。ps:研发排查了N天,没查出来,群友三下五除二就搞定了。你确定不加一下吗研发【想法】的代码逻辑-客户端请求:如果redis有数据,就在redis进行查询。如果redis没有数据,就在MySQL进行查询,并插入redis当中......
  • Vmware系列&虚拟机系列【仅供参考】:Windows 内存完整性无法开启,有不兼容的驱动程序解
    内存完整性无法开启,有不兼容的驱动程序解决办法内存完整性无法开启,有不兼容的驱动程序解决办法摘要由于安全中心一直黄色感叹号,强迫症犯了。点击一看是内核隔离-内存完整性已经关闭1.不兼容驱动程序inf文件可以用pnputil命令卸载2.还有些麻烦sys文件使用注册表......
  • js中的数字在电脑内存储为多少Byte?
    在JavaScript中,所有的数字都以64位双精度浮点数的形式存储,符合IEEE754标准。这意味着它们占用8个字节(8bytes*8bits/byte=64bits)的内存。需要注意的是,即使是整数,在JavaScript内部也以这种浮点数格式存储。没有独立的整数类型。这与一些其他语言(如C或Ja......
  • XCVM1302-3HSEVFVB1369通过业界领先的 DDR 内存接口实现高数据吞吐量 - AMD Versal Pr
    XCVM1302-2MLIVSVF1369XCVM1302-2MSEVSVF1369XCVM1302-2MSIVFVB1369XCVM1302-2MSIVSVF1369XCVM1302-3HSEVFVB1369明佳达Versal自适应SoC兼具可编程逻辑和加速引擎的灵活处理能力,以及先进的内存和接口技术,可为各类应用实现定制化、强大的异构加速。VersalPrime系列是基......
  • lwIP 内存管理
    文章目录一、内存管理概述二、lwIP内存管理策略内存池(POOL)内存堆(HEAP)三、lwIP内存管理应用数据接收:发送数据:用户调用:接口控制块:四、lwIP内存管理原理内存池原理内存堆原理五、结论lwIP内存管理一、内存管理概述内存管理是指软件运行时对计算机内存资源的分配......
  • 23蓝帽杯:内存取证(纯volatility)
    开个新坑,因为之后的比赛会涉及到取证,所以这里会有一个取证的合集,因为是穷苦学生莫得马内去买那些一键软件,所以这里我会使用volatility等一些有学习版的软件,如果涉及到其他软件会贴出下载地址。取证比赛的网址Forensics-Wiki题目1:请给出计算机内存创建北京时间?[答案格式:2000-0......
  • 浅谈C/C++内存管理
    目录一、C语言和C++内存管理方式        1、C语言和C++内存管理方式区别     2、【new】和【delete】的好处二、使用【new】来分配内存三、使用【new】来创建动态数组    1、创建动态数组        2、使用动态数组 四、使用【delete......