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

JVM 的内存区域是如何划分的?的更多相关文章

  1. JVM的内存区域划分

            JVM的内存区域划分 学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆.栈以及静态数据区.那么在Java语言当中,内存又是如何划分的 ...

  2. JVM的内存区域划分以及垃圾回收机制详解

    在我们写Java代码时,大部分情况下是不用关心你New的对象是否被释放掉,或者什么时候被释放掉.因为JVM中有垃圾自动回收机制.在之前的博客中我们聊过Objective-C中的MRC(手动引用计数)以 ...

  3. JVM的内存区域划分(转)

    原文链接:JVM的内存区域划分 JVM的内存区域划分 学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆.栈以及静态数据区.那么在Java语言当中,内 ...

  4. 【java】JVM的内存区域划分

    学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆.栈以及静态数据区.那么在Java语言当中,内存又是如何划分的呢? 由于Java程序是交由JVM执行 ...

  5. JVM的内存区域模型

    首先要明白一个概念,就是JVM的内存区域划分与java的内存区域模型是两个不同的概念,前者指的是在java中jvm会将一个程序划分为哪些块来存储对应的数据,后者是一个更宏观上的j概念,指的是java线 ...

  6. 第1篇--基于jdk7和jdk8分析 JVM的内存区域

     基于jdk7和jdk8分析 JVM的内存区域 目录前言1.什么是JVM2.JRE/JDK/JVM是什么关系3.JVM执行程序的过程4. JVM的生命周期5.JVM垃圾回收一.运行时数据区的组成1.程 ...

  7. JVM(二)-内存区域之线程私有区

    概述: 对于从事C.C++开发的程序员来说,在内存管理领域,他们既是拥有最高权力的"皇帝",又是从事最基础工作的劳动人民--既拥有每个对象的"所有权", 又担负 ...

  8. 01 深入理解JVM的内存区域

    先来看看JVM运行时候的内存区域,如下图: 大多数 JVM 将内存区域划分为 Heap(堆).方法区.Stack(栈).本地方法栈.程序计数器.其中 Heap 和 方法区 是线程共享的,Stack.本 ...

  9. 5.JVM的内存区域划分

    一.JVM介绍 1. 什么是JVM? JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟 ...

  10. 第2篇--JVM的内存区域划分

    学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆.栈以及静态数据区.那么在Java语言当中,内存又是如何划分的呢? 由于Java程序是交由JVM执行 ...

随机推荐

  1. Spring AI + Ollama 实现 deepseek-r1 的API服务和调用

    最近DeepSeek开源了对openai-o1的第一代开源推理大模型:deepseek-r1,因其极低的成本和与openai-o1相当的性能引发了国内外的激烈讨论.DD在做独立产品的时候也一直都有用D ...

  2. Project Euler 588 题解

    这玩意好像甚至有递推式--不太懂 (为什么是图片?cnblogs 第一个公式没渲染成功) 时间复杂度是 \(O(4^{\deg F}\log K)\) 的. #include<bits/stdc ...

  3. USACO24DEC Cake Game S 题解 [ 黄 ] [ 前缀和 ] [ adhoc ]

    Cake Game:小清新前缀和题,但是我场上想了半天优先队列贪心假完了 /ll/ll/ll. 观察 本题有三个重要的结论,我们依次进行观察. 不难发现,第二个牛一定会拿 \(\frac{n}{2}- ...

  4. macOS Monterey(MacOS 12) 系统升级cocoapods

    老款MacBook系统Monterey(MacOS 12)由于brew停止了从上游下载cocoapods提示不支持os12系统,无法安装最新版cocoapods,本文讲述了另一种方法来更新cocoap ...

  5. FANUC发那科机器人主板维修,故障问题检测

    电容损坏引发的故障在电子设备中是特别高的,其中尤其以电解电容的损坏为常见 电容损坏表现为:1.容量变小:2.完全失去容量:3.漏电:4.短路. 电容在电路中所起的作用不同,引起的故障也各有特点.在发那 ...

  6. c/c++ 2019公司面试题目录

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/12131500.html c++面试题中经常被面试官面试的小问题总结(一)(本篇偏向基础知识) ...

  7. java 8 lamdba 表达式list集合的BigDecimal求和操作

  8. Mybatis之Select Count(*)的获取 返回int 的值

    本文将介绍,SSM中mybatis 框架如何获取Select Count(*)返回int 的值.1. Service 代码: public boolean queryByunitclass(Strin ...

  9. Linux - Centos6/7忘记root密码怎么办?

    转载:https://www.cnblogs.com/witz/p/10183533.html 一.Centos6.x (1)查看操作系统版本以及内核版本 (2)重启服务器,到如下界面 (3)好吧.. ...

  10. 阿里巴巴开源ETL(数据的抽取、转换、加载)工具-----DataX

    一个比Sqoop好用的数据传输工具 下载maven的时候,加一个 -P让下载的压缩包到指定目录 而要让档案自动储存到指令的目录下,则需要借用-P这个参数wget -p 目录 网址wget -P /ro ...