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. Forrester Wave™报告:天翼云三项产品能力获评最高分!

    8月5日,国际权威研究机构Forrester发布了<Forrester Wave: 中国公有云平台厂商评测,2024Q3>报告.中国电信天翼云凭借前瞻性的发展战略和领先的产品能力,跻身行业 ...

  2. JMeter非GUI模式执行,jtl文件请求与响应数据为空?这里有答案!

    JMeter非GUI模式执行,jtl文件请求与响应数据为空?这里有答案! 问题描述 在使用JMeter进行性能测试时,很多用户会选择非GUI(图形用户界面)模式来执行测试,因为这样可以减少客户端的负担 ...

  3. P10353 [PA2024] Grupa permutacji 题解

    神秘!在这些排列生成的置换群 \(G\) 里,若 \(\exists \pi \in G\) 使得 \(\pi_i=k,\pi_j=l\),则所有这些 \((k,l)\) 被同样数量的 \(\pi\i ...

  4. linux--安装zeppelin

    可以下载源码安装也可以用docker安装 http://zeppelin.apache.org/download.html Zeppelin 安装目录的bin文件夹下,使用以下命令启动进程: /opt ...

  5. DeepSeek R1本地与线上满血版部署:超详细手把手指南

    一.DeepSeek R1本地部署 1.下载ollama下载地址 本人是Mac电脑,所以选第一项,下面都是以Mac环境介绍部署,下载好把ollama运行起来即可启动Ollama服务. Ollama默认 ...

  6. 解决easyexcel合并单元格数组求和重复问题

    背景 EasyExcel(根据条件动态合并单元格的重复数据))_Violet-CSDN博客_easyexcel动态合并单元格现有的订单导出是使用的easyExcel完成的.对于相同单元格的合并是自定义 ...

  7. 【Unity】热更新原理与Xlua配置

    [Unity]热更新原理与 Xlua 配置 热更新 直接理解即是让代码可以像资源包一样被运行时更新.当然它其实还一个名称叫热修复,即实现不重新打包项目也能把 Bug 修好,这也正是它常用的地方. 原理 ...

  8. CF1793E题解

    \(\text{Problem - 1793E - Codeforces}\) \(\text{*2600}\) 备注 2024.10.19 考试 T2.考场未能想出正解,找到性质但没有根据性质往 d ...

  9. 什么是git,什么是github,git和github的使用

    Git实战 注意:本项目是学习笔记,来自于哔哩哔哩武沛齐老师的Git实战视频, 网址:[武沛齐老师讲git,看完绝对上瘾!!!] https://www.bilibili.com/video/BV1n ...

  10. FastAPI路由:微服务架构下的路由艺术与工程实践 🌐

    title: FastAPI路由专家课:微服务架构下的路由艺术与工程实践 date: 2025/3/4 updated: 2025/3/4 author: cmdragon excerpt: 用API ...