我的编程空间,编程开发者的网络收藏夹
学习永远不晚

深入浅出JVM内存数据区域

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

深入浅出JVM内存数据区域

JAVA程序运行于虚拟机之上,运行时需要内存空间。虚拟机执行JAVA程序的过程中会把它管理的内存划分为不同的数据区域方便管理。虚拟机管理内存数据区域划分如下图:

3a89185296ee298e090970cfb188b8a.png

java学习视频推荐:java在线教程

一、程序计数器(Program Counter Register)

行号指示器,字节码指令的分支、循环、跳转、异常处理、线程恢复(CPU切换),每条线程都需要一个独立的计数器,线程私有内存互不影响,该区域不会发生内存溢出异常。

二、虚拟机栈(VM Stack)

虚拟机栈(VM Stack)是线程私有的,声明周期与线程相同,虚拟机栈是Java方法执行的内存模型,每个方法被执行时都会创建一个栈帧,即方法运行期间的基础数据结构。

栈帧用于存储:局部变量表、操作数栈、动态链接、方法出口等,每个方法执行中都对应虚拟机栈帧从入栈到处栈的过程。是一种数据结构,是虚拟机中的局部变量表,对应物理层之上的程序数据模型。

局部变量表,是一种程序运行数据模型,存放了编译期可知的各种数据类型例如:

Boolean、byte、char、short、int、float、long、double、对象引用类型(对象内存地址变量,指针或句柄)。程序运行时,根据局部变量表分配栈帧空间大小。在运行中,大小是不变的异常类型:stackOverFlowError 线程请求栈深度大于虚拟机允许深度 OutOfMemory 内存空间耗尽无法进行扩展。

三、本地方法栈(Native Method Stack)

与虚拟机栈类似,虚拟机栈为Java程序服务,本地方法栈支持虚拟机的运行服务,具体实现由虚拟机厂商决定,也会抛出 stackOverFlowErrorOutOfMemory异常。

四、堆(Heap)

堆(Heap)是虚拟机管理内存中最大的一部分,被所有线程共享,用于存放对象实例(对象、数组),物理上不连续的内存空间,由于GC收集器,分代收集,所以划分为:新生代 Eden、From SurVivor空间、To SurVivor空间,allot buffer(分配空间),可能会划分出多个线程私有的缓冲区,老年代。

五、方法区(Method Area)

方法区(Method Area)与堆区一样属于线程共享的内存区域,用于存储虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码(动态加载OSGI)等数据。理论上属于java虚拟机的一部分,为了区分开来叫做 Non-Heap非堆。

这个区域可以选择不进行垃圾回收,该区域回收目的主要是常量池的回收,及类型的卸载class,内存区不足时会抛出OutOfMemory异常。

运行时常量池:方法区的一部分,Class的版本、字段、接口、方法等,及编译期生成的各种字面量、符号引用,编译类加载后存放在该区域。会抛出OutOfMemory异常。

六、直接内存(Direct Memory)

直接内存(Direct Memory)不属于虚拟内存区域,是一种基于通道与缓冲区的IO方式,可以使用本地函数直接分配堆外内存,在堆中存储引用的外部内存地址,通过引用完成对直接引用内存的操作,1.4之后提供的NIO显著提高效率,避免了堆内存与Native内存的来回复制操作,不受虚拟机内存控制,会抛出OUTOfMemory异常。

相关文章教程推荐:java开发入门

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

深入浅出JVM内存数据区域

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

深入浅出JVM内存数据区域

JAVA程序运行于虚拟机之上,运行时需要内存空间。虚拟机执行JAVA程序的过程中会把它管理的内存划分为不同的数据区域方便管理。虚拟机管理内存数据区域划分如下图:java学习视频推荐:java在线教程一、程序计数器(Program Counter Registe
深入浅出JVM内存数据区域
2021-02-14

如何浅析JVM内存结构和6大区域

如何浅析JVM内存结构和6大区域,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。其实对于我们一般理解的计算机内存,它算是CPU与计算机打交道最频繁的区域,所有数据
2023-06-17

JVM中内存区域与内存溢出的示例分析

小编给大家分享一下JVM中内存区域与内存溢出的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Java内存区域与内存溢出异常运行时数据区域程序计数器当前线程
2023-06-17

JVM 运行时数据区与JMM 内存模型

这篇文章主要介绍了JVM 运行时数据区与JMM 内存模型,文章围绕主题展开详细的内容介绍,具有一定的参考价值。需要的朋友可以参考一下
2022-11-13

深入浅出:了解时序数据库 InfluxDB

时序数据库经常应用于机房运维监控、物联网IoT设备采集存储、互联网广告点击分析等基于时间线且多源数据连续涌入数据平台的应用场景,InfluxDB专为时序数据存储而生,尤其是在工业领域的智能制造,未来应用潜力巨大。数据模型 1.时序数据的特征时序数据应用场景就是
深入浅出:了解时序数据库 InfluxDB
2021-08-02

深入浅出ASP数据缓存:剖析其工作原理和应用技巧

ASP数据缓存是一种高效的缓存机制,可显著提升Web应用程序的性能。深入解析了ASP数据缓存的工作原理,并提供了丰富的应用技巧,以帮助开发者充分利用缓存机制,优化应用程序的性能。
深入浅出ASP数据缓存:剖析其工作原理和应用技巧
2024-02-04

深入浅出数据库连接池:提升数据库性能的利器!

数据库连接池:提升数据库性能的秘密武器
深入浅出数据库连接池:提升数据库性能的利器!
2024-03-03

java元数据区内存溢出如何解决

Java中的元数据区是指方法区(Method Area),主要用于存储类的信息、常量、静态变量等数据。当元数据区内存溢出时,通常会抛出java.lang.OutOfMemoryError: PermGen space异常。解决方法如下:增
2023-10-23

C++深入分析数据在内存中的存储形态

使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保留一些空间。您可能需要存储各种数据类型的信息,操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么
2023-01-06

数据保护的基石:数据库备份与恢复策略深入浅出

数据库备份与恢复是企业维护数据完整性和业务连续性不可或缺的关键策略,本文将深入浅出地讲解数据库备份与恢复策略、方法和最佳实践,帮助企业建立全面的数据保护机制。
数据保护的基石:数据库备份与恢复策略深入浅出
2024-02-10

C语言数据在内存中的存储流程深入分析

使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保留一些空间。您可能需要存储各种数据类型的信息,操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么
2022-11-13

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录