第2章 Java内存区域与内存溢出异常

AD9361 官方例程 文章目录一、官方资料1.1 介绍1.2 下载 和 使用1.3 相关资料二、步骤2.1 在Vivado中构建HDL2.2 在SDK中构建No- OS总结 一、官方资料 1.1 介绍 HDL参考设计介绍:AD9361 HDL Reference Designs 无操作系统介绍:AD9361 No-OS Software 1.2 下载 和 使用 HDL下载:Download HDL 在Vivado中构建HDL:Building HDL No-OS下载:Download No-OS 1.3 相关资料 AD 阅读详情

目录

Java内存区域与内存溢出异常

2.1 概述

2.2 运行时数据区域

2.2.1 程序计数器

2.2.2 Java虚拟机栈

2.2.3 本地方法栈

2.2.4 Java堆

2.2.5 方法区

2.2.6 运行时常量池

2.2.7 直接内存

2.3 HotSpot虚拟机对象探秘

2.3.1 对象的创建

2.3.2 对象的内存布局

2.3.3 对象的访问定位

2.4 实战:OutOfMemoryError异常

2.4.1 Java堆溢出

2.4.2 虚拟机栈和本地方法栈溢出

2.4.3 方法区和运行时常量池溢出

2.4.4 本机直接内存溢出


Java内存区域与内存溢出异常

Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来。

2.1 概述

2.2 运行时数据区域

2.2.1 程序计数器

2.2.2 Java虚拟机栈

2.2.3 本地方法栈

2.2.4 Java堆

2.2.5 方法区

方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是与Java堆区分开来。

2.2.6 运行时常量池

运行时常量池(Runtime Constant Pool)是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。

Java虚拟机对Class文件每一部分(自然也包括常量池)的格式都有严格规定,每一个字节用于存储哪种数据都必须符合规范上的要求才会被虚拟机认可、装载和执行,但对于运行时常量池,Java虚拟机规范没有做任何细节的要求,不同的提供商实现的虚拟机可以按照自己的需要来实现这个内存区域。不过,一般来说,除了保存Class文件中描述的符号引用外,还会把翻译出来的直接引用也存储在运行时常量池中。

运行时常量池相对于Class文件常量池的另外一个重要特征是具备动态性,Java语言并不要求常量一定是编译期才产生,也就是并非预置入Class文件中常量池的内容才能进入方法区运行时常量池,运行期间也可能将新的常量放入池中,这种特性被开发人员利用的比较多的便是Stirng类的intern()方法。

既然运行时常量池是方法区的一部分,自然受到方法区内存的限制,当常量池无法再申请到内存时会抛出OutOfMemoryError异常。

2.2.7 直接内存

2.3 HotSpot虚拟机对象探秘

2.3.1 对象的创建

2.3.2 对象的内存布局

在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)(对象自身的运行时数据、类型指针)、实例数据(Instance Data)和对齐填充(Padding)。

HotSpot虚拟机的对象头包括两部分信息,第一部分用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这部分数据的长度在32位和64位的虚拟机(未开启压缩指针)中分别位32bit和64bit,官方称它为“Mark Word”。对象需要存储的运行时数据很多,其实已经超出了32位、64位的Bitmap结构所能记录的限度,但是对象头信息是与对象自身定义的数据无关的额外存储成本,考虑到虚拟机空间的效率,Mark Word被设计成一个非固定的数据结构以便在极小HotSpot虚拟机中,如果对象处于未被锁定的状态下,那么Mark Word的32bit空间中的25bit用于存储对象哈希码,4bit用于存储对象分代年龄,2bit用于存储锁标志位,1bit固定位0,而在其他状态(轻量级锁定、重量级锁定、GC标记、可偏向)下对象的存储内容见表2-1。

表 2-1 HotSpot虚拟机对象头Mark Word
存储内容标志位固定位状态
对象哈希码(25bit)、对象分代年龄(4bit)01(2bit)0(1bit)未锁定
指向锁记录的指针00 轻量级锁定
指向重量级锁的指针10 膨胀(重量级锁定)
空,不需要记录信息11 GC标记
偏向线程ID、偏向时间戳、对象分代年龄01 可偏向

对象头的另外一部分是类型指针(配合2.3.3 对象的访问定位:直接指针来理解),即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。 并不是所有的虚拟机实现都必须在对象数据上保留类型指针,换句话说,查找对象的元数据信息并不一定要经过对象本身,这点将在2.3.3节讨论。另外,如果对象是一个java数组,那在对象中还必须有一块用于记录长度的数据,因为虚拟机可以通过普通Java对象的元数据信息确定Java对象的大小,但是从数组的元数据中却无法确定数组的大小。

代码清单。。。

接下来的实例数据部分。。。

第三部分对齐填充。。。

2.3.3 对象的访问定位

2.4 实战:OutOfMemoryError异常

2.4.1 Java堆溢出

2.4.2 虚拟机栈和本地方法栈溢出

2.4.3 方法区和运行时常量池溢出

2.4.4 本机直接内存溢出

KUKA机器人在自动运行时,动作不流畅,每个点位都有停顿的解决办法 阅读详情

相关推荐

内存优化--LOGBACK导致内存告警

一.故事背景 由于开辟新市场需要,开发了新的项部署在海外平台,其中最消耗内存的功能是消费kafka消息(最开始预计一天有1千万的量),部署完之后运行一段时间发现出现内存告警问题。 二.分析问题 出现内存告警,(新项目是低配置机器 2C4G * 2台)第一个念头是去查看堆空间设置的情况,看到jvm启动命令中堆空间都是直接指定大小,说明问题不是出在堆空间 -Xmx3g -Xms3g 先不管这些,去查看总的内存使用情况,发现总的内存空间使用将近有92% = 3.68G,那么这多出来使用的0.6

qq_33199919的博客 6050

第2章 Java内存区域与内存溢出异常

第2章 Java内存区域与内存溢出异常 (一)运行时数据区域(Java虚拟机内存模型) Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。 根据《Java虚拟机规范》的规定,Java虚拟机所管理的内存将会包括以下几个运...

小咸白鱼的博客 564

告别虚拟机!用ZYNQ7000和PYNQ 2.6.0打造一个能实时识别人脸的“智能摄像头”

本文详细介绍了如何利用Xilinx ZYNQ7000开发板和PYNQ 2.6.0框架构建实时人脸识别系统。通过硬件加速和嵌入式开发技术,该系统实现了低延迟、低功耗的独立运行能力,适用于边缘计算和物联网应用。文章包含从环境搭建到核心功能实现的完整指南,并提供了性能优化和问题排查的实用技巧。

weixin_42543046的博客 389

第2章-Java内存区域和内存溢出异常

第二章·Java内存区域和内存溢出异常 1.JDK8中的JVM内存布局图 1.1程序计数器 简介: 程序计数器是一块比较小的内存空间,可以看作是当前线程所执行字节码指令的行号指示器。 字节码解释器在工作时通过改变这个计数器的数值,完成字节码指令的跳转,从而完成分支、循环、跳转等操作。 多线程与线程私有: JVM中多线程的实现,是通过线程之间轮流切换并分配处理器执行时间来完成的,所以在视觉上,感觉是同步的。实际上,在特定时刻,只有一个线程在执行。 因此,为了保证线程恢复之后,能够从上次的断点位置,继续执行

何以解忧 唯有专注 271

为什么你的Mac蓝牙总断连?深入解析硬件干扰与系统设置避坑

本文深入解析Mac蓝牙频繁断连的原因,包括硬件干扰(如WiFi同频干扰、USB设备电磁干扰)和系统设置问题,并提供详细的优化方案和诊断工具(如blueutil)使用指南,帮助用户有效解决蓝牙稳定性问题。

ik67890123的博客 679

别再到处找离线包了!Visual Studio 2022 企业版/社区版离线安装保姆级教程(含工作负载选择指南)

本文提供Visual Studio 2022企业版/社区版离线安装的详细教程,包括工作负载选择指南和批量安装优化策略。针对网络隔离或带宽受限环境,介绍如何制作离线安装包、选择合适的工作负载组合,并分享高级技巧如增量更新和自动化部署,帮助团队高效统一开发环境配置。

weixin_28745821的博客 726

深入理解Java虚拟机 第2章 Java内存区域与内存溢出异常

第2章 Java内存区域与内存溢出异常 2.1 概述 对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,不容易出现内存泄漏和内存溢出问题,由虚拟机管理内存这一切看起来都很美好。不过,也正是因为Java程序员把内存控制的权力交给了Java虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会成为一项异常艰难的工作。 2.2 运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的

wang_yong_zhang的博客 316

河洛理数【陈抟】每月月卦推演每日运卦

Step2:每卦中的日爻遇到二十四节气中的当日为节(月初)或气(月中)的时候,所代表的日期需要变更。正常来说,屯卦分别代表初一到初六,但是由于当月初二时立秋节,所以初爻就不能作为初一、而是要作为立秋节开始时(文中还精算到了立秋是从初二的午时开始),如下。说的代表月运的基础卦上进行当月日卦的推演方式。老样子,我们还是按照书中举得例子卦在这边进行一步步的推演,最后做总结。Step1:从月卦爻下一爻开始,自下而上,进行五个爻的爻变,新推演的每个卦代表六天,如下。假设当月月卦是即济卦,月爻在二爻,如图所示(

Daniel专栏 762

《深入理解java虚拟机》第2章 Java内存区域与内存溢出异常

Java与C++之间有- -堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来。 2.1 概述 对于从事C、C++程序开发的开发人员来说,在内存管理领域,他们既是拥有最高权力的“皇帝”又是从事最基础工作的“劳动人民"一既拥有每一 个对象的“所有权”,又担负着每-一个对象生命开始到终结的维护责任。对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要...

ywl470812087的博客 9万+

基于扣子3.0复刻MIT“AI股神团队版”:实时股票数据API接入与策略选股复盘系统

基于扣子3.0的AI量化投资系统摘要 本文提出了一种基于扣子(Coze)3.0平台的AI量化投资解决方案,整合实时股票数据与策略选股功能。系统采用三层架构: 数据层:通过AKShare等开源工具获取A股实时行情和历史K线数据,支持批量数据抓取和清洗 策略层:内置多因子选股模型和技术指标分析模块,实现自动化标的筛选 应用层:利用扣子3.0的插件和工作流功能,构建从数据采集到投资建议的完整流程 系统特点包括:完全开源的数据接入方案、Python实现的策略计算模块、以及扣子平台提供的可视化编排能力~~~~~~~~

huanghm88的专栏 261

国产化操作系统shell常用脚本

国产操作系统常用脚本:统信、麒麟。

Reyn_观极 590

第 2 章 Java内存区域与内存溢出异常

运行时数据区域 Java虚拟机在执行 Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域, 这些区域都有各自的用途,以及创建和销毁的时间 ,有的区域随着虚拟机进程的启动而存在, 有些区域则依赖用户线程的启动和结束而建立和销毁。 图源:https://zhuanlan.zhihu.com/p/38414929 2.2.1 程序计数器 程序计数器(Program Counter Reg...

qq_44587855的博客 123

零基础吃透!Python爬虫实战:超详细爬取小红书图文,解析封面+标题+文案全流程

本文为零基础开发者提供小红书图文爬取全流程指南,针对动态加载、严格反爬等核心痛点,从环境配置到数据解析详细讲解。主要内容包括: 核心特性分析:动态加载机制需抓包获取真实接口,严格反爬依赖Cookie验证和请求头伪装 环境准备:Python 3.8-3.10环境,使用requests/beautifulsoup4等库,通过浏览器开发者工具获取有效Cookie 实战步骤: 定位关键API接口(note/list) 配置请求头(含Cookie/User-Agent/Referer) 实现分页爬取和异常处理 解析封

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 728

内存溢出_第2章 Java内存区域与内存溢出异常

2.1 概述2.2 运行时数据区域Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。Java虚拟机所管理的内存将会包括以下几个运行时数据区域,如图2-1所示。2.2.1 程序计数器程序计数器(Program Counter Register)可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令...

weixin_34270668的博客 97

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: 第7章 虚拟机类加载机制
下一篇: 第六章 类文件结构
limeOracle
博客等级 码龄10年 11粉丝 566原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值