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

Java内存区域管理详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

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

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

看不清楚,换张图片

免费获取短信验证码

Java内存区域管理详解

1 关于自动内存管理

  • Java是由jvm来管理内存,包括自动分配以及自动回收,因此它不容易出现内存泄漏和内存溢出问题。
  • C/C++,由程序员手动管理内存,手动完成:使用前申请内存,使用后释放内存。

2 运行时数据区域

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间。

Java虚拟机所管理的内存 包括以下几个运行时数据区域:

2.1 程序计数器

  • 程序计数器(Program Counter Register):存储当前线程所执行的字节码指令的内存地址。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。【通过PC来寻找下一条要执行的指令】。
  • 程序计数器是线程私有的。cpu通过轮流分配时间片来执行线程,为了线程切换后能恢复到正确的执行位置,显然每个线程都需要有一个独立的程序计数器
  • 如果线程正在执行的是一个Java方法,PC记录的是正在执行的字节码指令的地址;如果正在执行的是本地(Native)方法,这个计数器值则应为空。【todo 为什么本地方法时为空】

2.2 虚拟机栈

  • 虚拟机栈描述的是Java方法执行的线程内存模型:每个方法被执行的时候,jvm会同步创建一个栈帧[后续章节详解](Stack Frame)用于存储局部变量表、操作数栈、动态连接、方法出口等信息
  • 虚拟机栈也是线程私有的,它的生命周期与线程相同。

2.2.1 局部变量表

JDK8之前,对jvm内存的认知只停留在:堆内存(Heap)和栈内存(Stack),而“栈”通常就是指这里讲的虚拟机栈,或者更多的情况下只是指虚拟机栈中局部变量表部分。

  • 局部变量表存储:基本数据类型(八种:boolean、byte、char、short、int、 float、long、double)、对象引用(可能是一个指向对象起始 地址的引用指针)和returnAddress 类型(指向了一条字节码指令的地址)。
  • 局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在栈帧中分配多大的局部变量空间是完全确定 的,在方法运行期间不会改变局部变量表的大小。【这里的大小仅值变量槽的数量】
  • 局部变量表以局部变量槽(Slot)来存储数据,其中64位长度的long和 double类型的数据会占用两个变量槽,其余的数据类型只占用一个。(通常一个槽占据N个字节,N大小由不同的虚拟机实现决定)。

关于栈的内存数据分析,在后续章节中会有更深入分析,在本节中这里仅引入概念。

2.2.2 操作数栈

关于方法调用时的进栈跟出栈的原理,在《深入理解计算机系统》系列笔记的后续章节中会进行总结。

2.3 本地方法栈

  • 本地方法栈(Native Method Stacks)与虚拟机栈作用是非常相似的,其区别只是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地(Native) 方法服务
  • 线程私有的。

2.4 堆

  • Java堆(Java Heap)存储对象的实例
  • Java堆是线程共享的,且比较大的一块内存区域,在虚拟机启动时创建
  • Java堆既可以被实现成固定大小的,也可以是可扩展的,不过当前主流的Java虚拟机都是按照可扩展来实现的(通过参数-Xmx和-Xms设定)。
  • 可弹性伸缩,但不会超过设定的最大容量,如果在Java堆中没有内存完成实例分配,并且堆也无法再 扩展时,Java虚拟机将会抛出OutOfMemoryError异常
  • Java堆可以处于物理上不连续的内存空间中,但在逻辑上它应该 被视为连续的。

2.5 方法区

  • 方法区存储已被虚拟机加载的class的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。
  • 方法区是线程共享
  • 方法区不需要连续的内存、可以选择固定大小或者可扩展,甚至还可以选择不实现垃圾收集(因为这部分内存通常不满足回收条件)
  • 方法区无法满足新的内存分配需求时,将抛出 OutOfMemoryError异常。

2.5.1 运行时常量池

  • 存放编译期生成的各种字面量与符号引用
  • 运行时常量池(Runtime Constant Pool)是方法区的一部分

3 直接内存

  • 首先,直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中 定义的内存区域
  • 它可能导致OutOfMemoryError异常出现,有必要了解。

在JDK 1.4中新加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区 (Buffer)的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆里面的 DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了 在Java堆和Native堆中来回复制数据。
显然,本机直接内存的分配不会受到Java堆大小的限制,但是,既然是内存,则肯定还是会受到 本机总内存(包括物理内存、SWAP分区或者分页文件)大小以及处理器寻址空间的限制,一般服务 器管理员配置虚拟机参数时,会根据实际内存去设置-Xmx等参数信息,但经常忽略掉直接内存,使得 各个内存区域总和大于物理内存限制(包括物理的和操作系统级的限制),从而导致动态扩展时出现 OutOfMemoryError异常。

4 总结

Java内存区域及其数据类别概览:

到此这篇关于Java内存区域管理详解的文章就介绍到这了,更多相关Java内存区域管理内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

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

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

Java内存区域管理详解

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

下载Word文档

猜你喜欢

Java内存区域与内存模型详解

这篇文章主要介绍“Java内存区域与内存模型详解”,在日常操作中,相信很多人在Java内存区域与内存模型详解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java内存区域与内存模型详解”的疑惑有所帮助!接下来
2023-06-02

如何理解Java内存区域

如何理解Java内存区域,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java 内存划分: 在Java内存分配中,java将内存分为:方法区,堆,虚拟机栈,本地方法栈,程序计数
2023-06-17

JVM内存管理之JAVA语言的内存管理详解

引言内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑。不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓狂的内存溢出和泄露的问题。可怕的事情还不只
2023-05-31

JVM内存区域划分相关原理详解

JVM内存区域划分是指将JVM中的内存划分为不同的区域,每个区域有不同的用途和管理方式。JVM内存区域的划分主要有以下几个方面:1. 程序计数器(Program Counter Register):程序计数器是一块较小的内存区域,用于存储当
2023-08-11

Java内存区域与内存溢出异常知识讲解

本篇内容介绍了“Java内存区域与内存溢出异常知识讲解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!正文一. 基本概念在开始讲解之前, 需要
2023-06-05

详解Linux内核内存管理架构

内存管理子系统可能是linux内核中最为复杂的一个子系统,其支持的功能需求众多,如页面映射、页面分配、页面回收、页面交换、冷热页面、紧急页面、页面碎片管理、页面缓存、页面统计等,而且对性能也有很高的要求。本文从内存管理硬件架构、地址空间划分
2022-06-04

java中内存区域的划分

什么是JVM?JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个
java中内存区域的划分
2016-07-30

JavaScript函数执行、作用域链以及内存管理详解

这篇文章主要介绍了JavaScript函数执行、作用域链以及内存管理的知识,文章内容非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-01-08

深入理解 JVM 的内存区域划分

在整个程序执行过程中,JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runtime Data Area(运行时数据区),也就是我们常说的JVM内存。
JVM内存区域2024-12-02

SQLServer的内存管理架构详解

目录一、Windows的虚拟内存管理器二、SQL Server 内存体系结构2.1、传统(虚拟)内存2.2、地址窗口扩展 (AWE) 内存三、从 SQL Server 2012 (11.x) 开始发生的改变3.1、对内存管理的更改3.2、对
2023-04-19

编程热搜

  • 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动态编译

目录