一文解析总结Java虚拟机内存区域模型

一文带你搞懂JVM虚拟机的内存区域划分 阅读详情

最近抽空看了一点《深入理解Java虚拟机》,本篇文章主要来总结一下Java虚拟机内存的各个区域,以及这些区域的作用、服务对象以及其中可能产生的问题,作为大家的面试宝典。

首先我们来看一下Java运行时的数据区域,Java虚拟机在执行Java程序的过程中会把它所管理的内存划分成若干个不同的数据区域,这些区域都有各自的用途,各自的创建和销毁的时间。有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。

我们来看一下Java虚拟机运行时的数据区

 

 

 

结合这张图,下面逐个来分析一下每个数据区域的特点。

1. 程序计数器

程序计数器是一块较小的内存空间,**可以看作是当前线程所执行的字节码的行号指示器。**什么意思呢?我们知道,CPU的计算时间是以分片的方式给到每个线程的(换句话说,所谓并行其实本质上还是串行),比如线程A执行到一个地方,CPU将控制权给了线程B,那么线程A重新获得CPU的资源时,如何恢复到刚才执行的地方呢?这就是程序计数器要干的事了!它能帮助线程A找到刚刚执行的地方,从而继续刚刚的执行。

为了线程切换后能恢复到正确的执行位置,就要求每个线程都需要有个独立的程序计数器,各条线程之间的计数器互不影响,独立存储。所以程序计数器是线程私有的。

另外,程序计数器是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

2. Java虚拟机栈

Java虚拟机栈占有的内存空间也就是我们平常所说的“栈内存”,并且也是线程私有的,生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时,都会创建一个栈帧,用于存储局部变量表(基本数据类型,对象的引用和returnAddress类型)、操作数栈、动态链接、方法出口等信息。

局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在栈帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。

**每个方法被调用直至执行完成的过程,就对应着一个栈帧从虚拟机栈中从入栈到出栈的过程。**对于Java虚拟机栈,有两种以尝情况:

  • 如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverFlowError异常。

  • 如果虚拟机栈在动态扩展时,无法申请到足够的内存,就会抛出OutOfMemoryError异常。

3. 本地方法栈

本地方法栈和虚拟机栈所发挥的作用非常相似,它们之间的区别主要是:虚拟机栈是为虚拟机执行的Java方法(即字节码)服务的,而本地方法栈则为虚拟机使用到的Native方法服务。

与虚拟机栈类似,本地方法栈也会抛出StackOverFlowError和OutOfMemoryError异常。

4. Java堆

Java堆是Java虚拟机所管理的内存中最大的一块。Java堆在主内存中,是被所有线程共享的一块内存区域,其随着JVM的创建而创建,堆内存的唯一目的是存放对象实例和数组。同时Java堆也是GC管理的主要区域。

Java堆在物理上不需要连续的内存,只要逻辑上连续即可。如果堆中没有内存完成实例分配,并且也无法再扩展时,将会抛出OutOfMemoryError异常。

5. 方法区

方法区是所有线程共享的一块内存区域。**用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。**方法区也有一个别名叫Non-heap(非堆),用来与Java堆区分。对于HotSpot虚拟机来说,方法区又习惯成为“永久代(Permancent Generation)”,但这只是对于HotSpot虚拟机来说的,其他虚拟机的实现上并没有这个概念。相对而言,垃圾收集行为在这个区域比较少出现,但也并非不会来收集,这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载上。

根据Java 虚拟机规范的规定,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError 异常。

6 运行时常量池

运行时常量池属于方法区。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量表,用于存放编译期生成的各种字面常量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放**(JDK1.7开始,常量池已经被移到了堆内存中了)。**

也就是说,这部分内容,在编译时只是放入到了常量池信息中,到了加载时,才会放到运行时常量池中去。运行时常量池县归于Class文件常量池的另外一个重要特征是具备动态性,Java语言并不要求常量一定只有编译期才能产生,也就是并非预置入Class文件中常量池的内容才能进入方法区的运行时常量池,运行期间也可能将新的常量放入池中,这种特性被开发人员利用的比较多的是String类的intern()方法。

当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常,常量池属于方法区,同样可能抛出OutOfMemoryError异常。

下面针对Java内存区域模型做一下简单的总结。

Java虚拟机-内存区域 JVM内存区域概述运行时的数据区域线程私有内存区域程序计数器java虚拟机栈线程公有内存区域本地方法栈java堆方法区直接内存对象访问 概述 c和c++拥有内存管理的权利,而java则是通过虚拟机的自动内存管理机制去管理内存,不需要我们手动进行内存管理。自动内存管理机制不容易出现内存泄露问题,但是一旦出现内存泄露和内存溢出问题,排查问题就需要java虚拟的相关知识。 运行时的数据区域 这里借助一张书里的图片 线程私有内存区域 程序计数器 程序计数器这个概念是在计算机组成原理课程中首次见到。在jvm里,程序 阅读详情

相关推荐

一篇文章总结Java虚拟机内存区域模型

点击上方“程序人生”,选择“置顶公众号”第一时间关注程序猿(媛)身边的故事作者倪升武如需转载,请联系原作者。最近抽空看了一点《深入理解Java虚拟机》,本篇文章主要来总...

程序人生的博客 1060

基于STM32的多路火灾报警系统设计

本文设计了一款基于STM32的多路火灾报警系统,利用多个传感器组合(如烟雾传感器、温度传感器等)进行数据采集与处理,精确判断火灾情况,并及时发出报警信号,保障生命与财产安全。本系统设计了一款基于STM32的多路火灾报警系统,通过结合烟雾传感器和温度传感器,提升了火灾检测的准确性和可靠性。未来,系统可以进一步集成更多传感器,如气体传感器、湿度传感器等,进一步提升火灾报警系统的智能化水平。本系统采用STM32F103单片机作为核心处理单元,结合烟雾传感器、温度传感器和报警模块,实现多通道火灾报警功能。

stm32d1219的博客 2030

Java虚拟机内存模型的理解

这两天学习了jvm方面的知识,今天对内存模型做一个学习的总结。 在Java的运行时内存中主要分为两大块,线程共享区和线程独享区 ①线程共享区 线程共享区顾名思义就是所有线程共享的一片内存区域,在这个区域中有Java的方法区和Java堆。 ②线程独享区 线程独享区,也就是每个线程都有属于自己的那一份的内存区域。在线程独享区中有这个线程的虚拟机栈,本地方法栈和程序计数器 ③方法区 方...

yan245294305的博客 2326

Python表白代码:“ 星光月夜烟花皆归你,我也归你”(满天烟花盛开、附番外玫瑰)

导语 "慢品人间烟火色 闲观人间岁月长" ———致自己​​​ ​ ???? 遇见我以后,我们的故事就开始了,愿你历经山河,仍觉得人间值得????。 ​ 星光月夜烟花皆归你,我也归你。关于烟花????大家都​知道多少?有多少表白故事情节都发生在烟 花下,想必木木子????不用说大家也知道叭~​​ 今天这则小短文就是关于烟花的故事!你准备好跟我一起进入烟花的世界了嘛? ​正文 “每一句文案,都有一个故事,你仔细听” ​ 1)环境安装???? 准备好:.

顾木子吖的博客 5万+

【Microchip】微芯 MPLAB® X IDE开发环境新建项目(点亮1颗LED灯)(常用右键菜单快捷键)

1.新建项目2. 选择芯片型号和调试器3.选择编译器4.项目命名和选择文件路径5.新建成功,给项目添加main.c7.将新建的mainXC16.c文件添加进项目6000000UL这三个就是。

Naiva的博客 452

《深入理解Java虚拟机》—— JVM内存模型(运行时数据区)

JVM运行时数据区(又称JVM内存模型) 程序计数器 (Program Counter Register, PCR) 由于多线程是通过线程切换争夺CPU的方式执行的,故在任一时刻,CPU其实只会执行一个线程。所以为了切换线程后CPU还能回到正确的执行位置,每一个线程都应该又一个独立的PCR,互不影响。所以 PCR是线程私有的一块较小的内存空间, 可以看作是当前线程所执行的字节码的行号指示器。 若...

Stay Hungry Stay Foolish 257

网络发生环路了,别慌,这些步骤一定要安排起来!

网络环路是指在计算机网络中,数据包因为某种原因在多个网络设备之间不断循环,形成了一个闭环。这样数据包就永远也无法到达目标,导致网络的流量滞留,设备间的资源耗尽,最终网络性能受到严重影响。网络环路虽然是常见的网络故障,但只要掌握正确的排查和解决方法,面对环路问题时,你就能冷静应对,迅速恢复网络的正常运行。希望这篇文章能帮助你更好地理解和处理网络环路的问题,让你的网络环境更加稳定可靠!🚀📡如果你有任何疑问,或者在实际操作中遇到困难,随时可以联系我,我们一起攻克技术难题!

网络技术联盟站 1968

Java 虚拟机内存管理模型

以下内容来自《深入理解Java虚拟机》,整理如下: 1.JVM组成 1.1 虚拟机栈 虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈等。每个方法从调用到执行完成的过程,对应着一个栈帧在虚拟机栈中入栈到出栈的过程。平时说的栈内存指的是虚拟机栈的局部变量表部分,存储的是基本数据类型、对象引用和returnAddress类型(指向了一条...

Cary_1029的博客 455

在 ABAP 环境中创建 Job Catalog Entry 和 Job Template 的完整实践指南

摘要:本文介绍了SAP BTP ABAP环境中Application Job的云原生解决方案,对比传统后台作业模式。重点阐述了Job Catalog Entry和Job Template两大核心概念,通过库存重估业务场景演示如何实现可调度类、创建Job Catalog Entry及Job Template。文章详细说明了从ABAP类到Job Catalog Entry再到Job Template的完整链路,并分享实际项目中的设计经验和注意事项,帮助开发者将传统后台作业迁移到Application Job框架

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 234

AI 模型优化与部署秘籍:从理论到实战

本文系统介绍了AI模型优化与部署的关键技术。模型剪枝通过去除冗余参数减小模型规模,量化技术降低计算精度以提升效率,蒸馏方法实现知识从大模型到小模型的迁移。TensorRT通过层融合和精度校准加速GPU推理,ONNX格式实现跨框架模型转换,TFLite则优化移动端部署。这些技术共同解决了AI模型在资源受限环境下的部署难题,显著提升了模型运行效率,为AI应用落地提供了重要支撑。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 247

一文解析Java虚拟机内存区域模型

首先我们来看一下Java运行时的数据区域,Java虚拟机在执行Java程序的过程中会把它所管理的内存划分成若干个不同的数据区域,这些区域都有各自的用途,各自的创建和销毁的时间。有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。我们来看一下Java虚拟机运行时的数据区结合这张图,下面逐个来分析一下每个数据区域的特点。1. 程序计数器程序计数器是...

weixin_33778778的博客 124

【WLAN】【调试】再谈如何使用Wireshark解密WiFi数据包——使用TK信息

- 本文介绍了一种wireshark使用TK信息解密空口报文的方式,该方式对是否有关联过程的报文没有要求。

一介草民,只为生活。 1190

java类 左上角有个小锤子是什么意思_一文解析总结Java虚拟机内存区域模型

最近抽空看了一点《深入理解Java虚拟机》,本篇文章主要来总结一下Java虚拟机内存的各个区域,以及这些区域的作用、服务对象以及其中可能产生的问题,作为大家的面试宝典。首先我们来看一下Java运行时的数据区域,Java虚拟机在执行Java程序的过程中会把它所管理的内存划分成若干个不同的数据区域,这些区域都有各自的用途,各自的创建和销毁的时间。有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线...

weixin_32758601的博客 358

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

深入理解Java虚拟机-Java内存区域透彻分析

Java虚拟机深入理解系列全部文章更新中... 深入理解Java虚拟机-Java内存区域透彻分析 深入理解Java虚拟机-常用vm参数分析 深入理解Java虚拟机-JVM内存分配与回收策略原理,从此告别JVM内存分配文盲 深入理解Java虚拟机-如何利用JDK自带的命令行工具监控上百万的高并发的虚拟机性能 深入理解Java虚拟机-如何利用VisualVM对高并发项目进行性能分析 深入理解J...

好好学java 1931

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java 内存区域详解

对于Java程序员来说,在虚拟自动内存管理机制下,不再需要像C/C++程序开发程序员这样为每一个new操作去写对应的delete/free操作,不容易出现内存泄漏和内存溢出问题。正是因为Java程序员把内存控制的权力交给Java虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一个非常艰巨的任务。

rc1596919047的博客 1410

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

java虚拟机中的内存区域划分

一、概述 Java虚拟机规范规定的java虚拟机内存其实就是java虚拟机运行时数据区,其架构如下: 其中方法区和堆是由所有线程共享的数据区。 虚拟机栈,本地方法栈和程序计数器是线程隔离的数据区。 二、详解 下面来具体介绍这几个数据区。 1、程序计数器 程序计数器是一块较小的内存空间,其作用可以看作是当前线程所执行的字节码的行号指示器。字节码解析器工作时通过改变程序计数器的值

想作会飞的鱼的博客 2575

java虚拟机系列:java虚拟机内存模型

java内存模型,分为程序计数器,虚拟机栈,本地方法栈,java堆,java栈。根据受访的权限不同设置,可以分为线程共享和线程私有。线程共享指可以允许所有的线程共享访问的一类内存区域,包括堆内存区,方法区,运行的常量池。 程序计数器(Program Counter Register) 在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通...

程序员ZZ的源码 6365

Java虚拟机(JVM):内存区域

Java虚拟机(JVM):内存区域

m0_64694079的博客 1140

Java虚拟机的内存区域

1、程序计数器(线程私有) 一块较小的内存空间, 是当前线程所执行的字节码的行号指示器,每条线程都要有一个独立的 程序计数器,这类内存也称为“线程私有”的内存。 正在执行 java 方法的话,计数器记录的是虚拟机字节码指令的地址(当前指令的地址)。如果还是 Native 方法,则为空。 这个内存区域是唯一一个在虚拟机中没有规定任何 OutOfMemoryError (内存溢出)情况的区域...

ppBlog 239

Java内存区域和内存模型

写在最前 Java 内存区域和内存模型是不一样的东西。 内存区域:JVM 运行时将数据分区域存储,强调对内存空间的划分。 内存模型(Java Memory Model,简称 JMM ):定义了线程和主内存之间的抽象关系,即 JMM 定义了 JVM 在计算机内存(RAM)中的工作方式。 内存区域 下图是 JDK 1.8 之前的 JVM 运行时数据区域分布图: 下图是 JDK 1.8 之后的 JVM 运行时数据区域分布图: 通过 JDK 1.8 之前与 JDK 1.8 之后的 JVM 运行时数据区域

csp732171109的博客 863
上一篇: 一次 JVM FullGC 的排查过程及解决方案!
下一篇: 数据库分表后需要注意的二三事!
加班不秃顶
博客等级 码龄7年 1822粉丝 599原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值