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 后移除)
- 年轻代(Young Generation):
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 的内存区域是如何划分的?的更多相关文章
- JVM的内存区域划分
JVM的内存区域划分 学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆.栈以及静态数据区.那么在Java语言当中,内存又是如何划分的 ...
- JVM的内存区域划分以及垃圾回收机制详解
在我们写Java代码时,大部分情况下是不用关心你New的对象是否被释放掉,或者什么时候被释放掉.因为JVM中有垃圾自动回收机制.在之前的博客中我们聊过Objective-C中的MRC(手动引用计数)以 ...
- JVM的内存区域划分(转)
原文链接:JVM的内存区域划分 JVM的内存区域划分 学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆.栈以及静态数据区.那么在Java语言当中,内 ...
- 【java】JVM的内存区域划分
学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆.栈以及静态数据区.那么在Java语言当中,内存又是如何划分的呢? 由于Java程序是交由JVM执行 ...
- JVM的内存区域模型
首先要明白一个概念,就是JVM的内存区域划分与java的内存区域模型是两个不同的概念,前者指的是在java中jvm会将一个程序划分为哪些块来存储对应的数据,后者是一个更宏观上的j概念,指的是java线 ...
- 第1篇--基于jdk7和jdk8分析 JVM的内存区域
基于jdk7和jdk8分析 JVM的内存区域 目录前言1.什么是JVM2.JRE/JDK/JVM是什么关系3.JVM执行程序的过程4. JVM的生命周期5.JVM垃圾回收一.运行时数据区的组成1.程 ...
- JVM(二)-内存区域之线程私有区
概述: 对于从事C.C++开发的程序员来说,在内存管理领域,他们既是拥有最高权力的"皇帝",又是从事最基础工作的劳动人民--既拥有每个对象的"所有权", 又担负 ...
- 01 深入理解JVM的内存区域
先来看看JVM运行时候的内存区域,如下图: 大多数 JVM 将内存区域划分为 Heap(堆).方法区.Stack(栈).本地方法栈.程序计数器.其中 Heap 和 方法区 是线程共享的,Stack.本 ...
- 5.JVM的内存区域划分
一.JVM介绍 1. 什么是JVM? JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟 ...
- 第2篇--JVM的内存区域划分
学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆.栈以及静态数据区.那么在Java语言当中,内存又是如何划分的呢? 由于Java程序是交由JVM执行 ...
随机推荐
- solon-flow 你好世界!
solon-flow 是一个基础级的流处理引擎(可用于业务规则.决策处理.计算编排.流程审批等......).提供有 "开放式" 驱动定制支持,像 jdbc 有 mysql 或 p ...
- flutter如何调试夜神模拟器
1.下载夜神模拟器 地址:https://www.yeshen.com/ 下载后直接傻瓜式安装即可 2. 将夜神模拟器设置为手机版本 打开夜神模拟器,点击点击右上角的设置: 然后选择 性能设置 然后 ...
- Vmware共享文件夹安装设置方法(window与Linux使用共享文件夹)
Vmware共享文件夹安装设置方法 注意:如果按照了工具,设置了共享文件夹,Linux下面还是没有的话,可以运行下面的命令,就会加载共享文件夹了 vmhgfs-fuse .host:/ /mnt/hg ...
- Linux中ARP学习和老化机制
本文分享自天翼云开发者社区<Linux中ARP学习和老化机制> 作者:云云生息 ARP学习和老化机制在Linux网络通信中起着至关重要的作用.ARP(Address Resolution ...
- sql中的inerval函数使用方法
在SQL中,INTERVAL函数可以用于添加或减去特定的时间间隔.其基本语法如下: SELECT field1, field2, ... FROM table_name WHERE condition ...
- bash 学习
学习bash shell 第一天 在百度百科上找的解释 Bash,Unix shell的一种,在1987年由布莱恩·福克斯为了GNU计划而编写.1989年发布第一个正式版本,原先是计划用在GNU操作系 ...
- mac环境下配置jdk
1.如果你是第一次配置环境变量,可以使用"touch .bash_profile" 创建一个.bash_profile的隐藏配置文件(如果你是为编辑已存在的配置文件,则使用&quo ...
- 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-15- iframe操作--番外篇 (详细教程)
1.简介 通过前边三篇的学习,想必大家已经对iframe有了一定的认识和了解,今天这一篇主要是对iframe的一些特殊情况的介绍和讲解,主要从iframe的定位.监听事件和执行js脚本三个方面进行展开 ...
- datax从mysql迁移数据到OceanBase
datax部署 下载datax datax下载地址 安装datax tar -zxvf datax.tar.gz 使用datax 使用配置文件 { "job": { "s ...
- WinForm 多线程+委托来防止界面假死
参考: http://www.cnblogs.com/xpvincent/archive/2013/08/19/3268001.html 当有大量数据需要计算.显示在界面或者调用sleep函数时,容易 ...