java内存区域与内存异常(jvm学习)

用Zotero+B站Kimi,我如何把一篇顶会论文快速做成组会PPT(含完整提示词) 本文介绍如何利用Zotero和Kimi快速将顶会论文转化为组会PPT,提升学术汇报效率。通过Zotero的文献管理插件和Kimi的AI提炼技术,实现从论文阅读到PPT生成的全流程自动化,帮助研究者在90分钟内完成高质量汇报准备。 阅读详情

深入学习java虚拟机笔记

java虚拟机运行时数据区域

这里写图片描述

java虚拟机在执行java程序的时候,会把它所管理的内存区域划分成若干不同的数据区域。这些区域有不同的用途,和创建销毁时间,有的区域随着进程的启动而存在,有些区域依赖用户线程的启动和结束而建立和销毁。
java虚拟机所管理的内存将会包括以下几个运行时数据区域:

  1. 程序计数器
  2. java虚拟机栈
  3. 本地方法栈
  4. java堆
  5. 方法区

1、程序计数器

程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指令器。在虚拟机的概念模型里,字节码解释器的工作就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,导常处理,线程回复等基础功能都需要依赖这个计数器来完成。

些内存区域是唯一一个在java虚拟机规范中没有规定任何OutMenoryEorry(OOM)情况的区域。

2、java虚拟机栈

栈描述的是java方法的内存模型:每一个方法在执行时都会创建一个栈帧用于存储局部变量,操作栈数,动态链接,方法出口等信息。

每一个方法从调用直到执行完的过程,就对应一个栈帧中入栈到出栈的过程。

局部变量表
1、编译期可知的各种基本数据类型(byte,short,int,long,float,double,boolean,char)
2、对象引用(reference)类型,它不等于对象本身,可能是一个指向对象的起始地址的引用指针,也可能是指向一个代表对象的句柄或劳动其他与些相关的位置

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

在java虚拟机规范中,对这个区域规定了两种异常:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常,如果虚拟机可以动态的扩展(当前大部分java虚拟机都是可动态扩展的,只不过java虚拟机中也允许固定长度的虚拟机栈)如果扩展时无法申请到足够的内存空间,就会抛出OutofMemoryError异常。

3、java堆

1、java堆是java虚拟机所管理的内存中最大的一块。java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。些内存的目的主是存放对象实例,几乎所有的对象实例都在这里分配内存。

2、所有的对象实例都在这里分配内存空间。

3、如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutofMemoryError异常。

这里写图片描述

4、本地方法栈

本地方法栈(Native Method Stack)与虚拟机栈所发挥的作用是非常相似的,它们的区别不过是虚拟机栈为虚拟机执行的java方法服务,而本地方法栈为虚拟机使用的Native方法服务。有的虚拟机(HotSpot)直接把本地方法栈和虚拟机栈合二为一。与虚拟机栈一样,本地方法区也会抛出OutofMemory和StackOverflowError

5、方法区

方法区和java堆一样,是各个线程共享的内存区域,它用于存储已经被虚拟机加载的类的信息,常量,静态变量,即时编译后的代码等数据。
当方法区无法满足内存分配的需求的时候,将抛出OutofMemoryError异常。

运行时常量池

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

运行时常量池对于Class文件常量池的另一个重要的特性是具备动态性,java语言并不要求常量一定只有编译期才产生,也就是并非预置Class文件中常量池的内容才能进入方法区运行时常量池,运行期间也可能将新的常量放入池中 :String类的intern()方法,就可以向常量池中添加常量。

Delft3D从入门到实践:安装、编译与首次模拟指南 本文为Delft3D初学者提供了一份详尽的从零开始指南。内容涵盖软件获取、许可证申请、图形界面安装、核心计算内核的编译环境搭建与编译步骤,以及最终整合运行首个水动力模拟的全流程。重点解决了Windows系统下Delft3D安装与编译的常见问题,帮助用户快速上手这一开源水动力与泥沙输运模拟工具。 阅读详情

相关推荐

centos8 安装新版bind9源码

bind一直在更新,使用了比较多的新架构 本文记录新版本的bind怎么安装,以及其依赖库的安装 1. 在https://www.isc.org/download/ 下载最新stable版本bind,本文以bind-9.17.9.tar.xz为例。将软件传到/root目录下。 也可以到https://ftp.isc.org/isc/bind9/ 下载更多历史版本 2. 安装基本的依赖库,像gcc、amake等 3. 需要安装libuv库,但直接用yum时可能安装不全 建议使用源码安装,需要安..

linggang_123的博客 2539

JVM内存模型

JVM内存区域与内存溢出异常 程序计数器 虚拟机栈 本地方法栈 java堆 方法区 运行常量池 直接内存 对象的创建与内存布局 对象的访问定位 OOM异常 运行时数据区域 java虚拟机运行过程产生的数据区域中主要包括:堆、方法区、虚拟机栈、本地方法栈、程序计数器。其中程序计数器、虚拟机栈、本地方法栈为线程私有;堆、方法区为线程共有,也是发生垃圾收集的区域。 程序计数器 程序计数器可以看作是字节码文件里的行号指示器,字节码解释器工作就是改变计数器的值来控制执行的字节码指令。 程序计数器是唯一不会发生OO

EMH瞎逼逼栏目 416

DDR4 硬件设计笔记

DDR4-DRAM是第四代支持双倍数据读取,支持随机位置存取的静态存储器。DDR4-DRAM的工作原理。DDR之T拓扑和Fly-by拓扑。DDR的硬件设计。DDR4 PCB设计要点介绍。DDR4之PCB走线间距的串扰评估。DDR4之内存通道(channel)和内存列(rank)。

qq_26815321的博客 1万+

说一说 JVM 内存区域划分,哪些区域可能发生 OOM

通常情况下,我们可以把 JVM 的内存区域划分为以下几个部分,其中,有的区域是以线程作为单位,而有的区域则是整个 JVM 进程唯一的:1.程序计数器在 JVM 规范中,每...

犬小哈 3259

IPSec Over GRE和GRE Over IPSec技术

IPSec Over GRE 和 GRE Over IPSec 一. 技术介绍 IPsec     主要作用是对数据进行加密,因为他能提供所有有时候被单独用作实现加密的一种方法!IPsec建立的是一个逻辑隧道,并不是真正意义上的隧道!并且不能提供路由功能,因为IPsec不支持非ip流量,也不支持广播(组播)! GRE     (通用路由封装)能很好的提供一个真正意义上的点对点的隧道,GRE是一种三层VPN封装技术。GRE可以对某些网络层协议(如IPX、Apple Talk、IP等)的报文进行封装,使封装后

qq_56228347的博客 9870

Transformers在自动驾驶领域的应用(High-level like in scene)

Transformers uses global attention mechanism to capture long-range interaction information. Two core modules in Transformers are Self-Attention and Cross-Attention, which defined asAttn(Q,K,V)=softmax(QK⊤dk)VSelfAttn(X)=Attn(WQX,WKX,WVX)CrossAttn(X,Y)=Attn

qq_39337332的博客 1775

【JVM】Java内存区域与OOM

引入Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来。Java虚拟机运行时数据区如图所示1.程序计数器(线程私有) 作用 记录当前线程所执行到的字节码的行号。字节码解释器工作的时候就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。 意义 JVM的多线程是通过线程轮流切换并分配处理器来实现的,对于我们来说的并行事实上一个处理

白夜行 1937

手把手教你学Simulink--复杂环境适应的四足机器人领域仿真建模实例:构建一个基于Simulink的四足机器人动态平衡保持仿真模型

通过上述步骤,你可以构建一个基本的基于Simulink的四足机器人动态平衡保持仿真模型。此模型不仅有助于理解四足机器人在复杂环境中的动态平衡控制原理,也为进一步优化提供了基础。随着技术的发展,还可以探索更多高级功能,如自适应步态调整、强化学习等,以提高机器人的智能性和适应性。

MHD0815的博客 236

Java快速定位排查OOM,OOM区域:堆内存、元空间、本地方法栈、虚拟机栈、直接内存。

1、什么是OOM? java.lang.OutOfMemoryError,即内存溢出。 2、哪些内存区域会发生OOM? 五个区域会发生OOM:直接内存、元空间、本地方法栈、虚拟机栈、元空间。 JVM运行时数据区五个区域中,除了程序计数器不会发生OOM,其他区域都有可能。 除了元空间、本地方法栈、虚拟机栈、堆外,还有一块区域大家容易忽略,即直接内存。 (紫色)区域线程共有、发生GC; (绿色)线程私有,内存很小,几乎不需要GC 程序计数器不会OOM,记录了方法之间的条用和执行情况。存储

Be_insighted的博客 6468

作物生长模型Oryza V3实战9:控制文件参数详解

control.dat是ORYZA水稻模型的核心配置文件,主要包含三部分:1)基础参数设置与模拟时间定义;2)关键文件路径配置,包括土壤参数文件(soil.sol)、作物参数文件(cultivar.crp)、田间管理文件(manage.exp)及气象数据目录,同时指定输出结果文件(res.dat)和运行日志(model.log);3)可选参数和输出控制选项。该文件通过关联各类输入数据(气象、土壤、品种特性等)和输出结果,实现模型运行的全流程控制,支持参数调整后继续模拟和中断恢复功能。

221

RT-DETR 跨模态检测改进:融合红外数据提升 R50 夜间检测效果

本文提出跨模态自适应融合RT-DETR(CMF-RTDETR-R50),通过双分支骨干网络、可变形模态对齐和门控注意力融合三大模块,将红外数据融入RT-DETR-R50检测器,显著提升夜间目标检测性能。该方法在夜间场景下mAP@0.5提升11.7%,小目标检测AP_S提升15.3%,同时保持实时性(38 FPS)。关键技术包括:1)独立提取可见光与红外特征;2)可变形卷积解决模态对齐问题;3)动态门控机制自适应融合双模态特征。该方案适用于安防监控、自动驾驶等夜间检测场景,为跨模态实时检测提供实用解决方案。

走向CTO的路上... 1446

JVM中唯一一个不会发生GC和OOM的存储区域

PC寄存器 JVM中的PC寄存器是对物理PC寄存器的的一种抽象模拟。用来存储指向下一条指令的地址,也是即将要执行的指令代码。由执行引擎读取下一条指令。 占用内存很小,运行速度最快。线程私有。 唯一一个没有OOM的区域。 ...

weixin_43933456的博客 4833

PCL 建筑物点云立面和平面分割提取【2025最新版】

在建筑物点云中,立面点和平面点的法向量存在明显的差异,根据法向量在Z方向的分量设置相应得阈值即可实现立面点与平面点的分割。

点云侠的博客 1961

JVM学习(一)Java内存区域与内存溢出异常

Java内存区域与内存溢出异常 文章目录Java内存区域与内存溢出异常????运行时数据区域程序计数器Java虚拟机栈本地方法栈Java堆方法区运行时常量池直接内存????HotSpot虚拟机对象对象的创建对象的内存布局对象的访问定位????实战:OutOfMemoryError异常Java堆溢出虚拟机栈和本地方法栈溢出方法区和运行时常量池溢出本机直接内存溢出????JVM参数设定 ????运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的

像写诗一样优雅地写代码~ 5615

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

JVM学习—Java内存区域与溢出异常

1、为什么要学习java内存区域? ​ 作为一名java程序员在日常的工作中确实很少接触到内存管理的实际操作,因为在虚拟机的自动内存管理机制的帮助下,不再需要我们手动的去管理内存。不过,也正是因为我们将内存管理交给了虚拟机,当出现内存泄漏等方面的问题,如果不了解虚拟机是怎样管理内存的,那排查错误将会是一件非常艰难的工作。另外,要成为一名高级Java程序员,学好Java虚拟机方面的知...

u010679043的博客 138

NTscan扫描工具

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

JVM学习笔记——java内存区域与内存溢出异常

JVM学习笔记——java内存区域与内存溢出异常java内存区域程序计数器Java虚拟机栈本地方法栈Java堆方法区 学习《深入理解Java虚拟机:JVM高级特性与最佳实践》的笔记。 java内存区域 程序计数器 程序计数器是一块较小的内存空间,可以看做是当前线程执行字节码的行号指示器。为保证每次线程切换过程中,都会恢复到该线程正确的位置,每条线程都需要一个程序计数器。因此,程序计数器是线程私有的。 Java虚拟机栈 Java虚拟机栈,虚拟接栈描述的是java方法执行的线程内存模型:每个方法被执行的时候,J

weixin_43110854的博客 372

jre9下载 jdk9

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

JVM学习之一:Java内存区域与内存溢出异常

《深入理解Java虚拟机》 1 Java内存区域与内存溢出异常 1.1 运行时数据区域 Java运行时,虚拟机内存存放的东西: 1.1.1 程序计数器(Program Counter Register) 作用 可以看作是当前线程所执行字节码的行号指示器。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器完成 如果线程正在执行的是一个 Java 方法,计数器记录的是正在执行的...

214

JVM学习-java内存区域与异常

java是一门跨硬件平台的面向对象高级编程语言,java程序运行在java虚拟机上(JVM),由JVM管理内存,这点是和C++最大区别;虽然内存有JVM管理,但是我们也必须要理解JVM是如何管理内存的;JVM不是只有一种,当前存在的虚拟机可能达几十款,但是一个符合规范的虚拟机设计是必须遵循《java 虚拟机规范》的,本文是基于HotSpot虚拟机描述

智公博客的专栏 2553

深入学习JVM- (1)理解Java内存区域与内存溢出异常

每个方法执行时会同步创建一个栈帧。不是运行时数据区的一部分。

weixin_51275389的博客 1910

Java内存区域与异常学习笔记-JVM内存模型

JVM内存模型将Java程序运行时的内存划分为多个数据区域:1)程序计数器,线程私有,记录指令地址;2)Java虚拟机栈,存储方法调用的栈帧;3)本地方法栈,为本地方法服务;4)Java堆,线程共享,存放对象实例;5)方法区,存储类信息、常量等;6)运行时常量池,存放编译期常量;7)直接内存,非JVM管理但频繁使用。各区域功能不同,可能出现StackOverflowError或OutOfMemoryError异常。

heiqiu0520的博客 620

jvm学习——java内存区域与内存溢出异常——丑九怪

jvm学习——java内存区域划分——丑九怪写在前面运行时数据区1、程序计数器 写在前面 对于java语言来说,相对于c、c++最大的区别可能就是在内存方面了,c、c++直接将内存交给了编程者,让其对所用的每字节空间“负全责”,而jvm提供了一整套自己管理自己的机制,虽然方便了编程者,但同时造成了隐患,编程者无法从内存角度清楚地认识到整个程序的执行过程,从而导致很多看起来无厘头的错误,在查错时也让...

丑九怪的博客 255

JVM学习(二)Java内存区域与内存溢出异常

JVM学习(二)Java内存区域与内存溢出异常 只记录在学习《深入理解Java虚拟机》时的一些个人理解,可能有理解错误的地方,欢迎指正。 书里面的比喻很有意思,将C++比喻为内存机制里面的皇帝和劳动者,既拥有每个对象的所有权,又担当从开始创建到消除的全部责任。这个比喻还是比较贴切的。 Java在虚拟机的帮助下,实现了内存自动管理的机制,对于一个new操作不需要手动的去delete(在写C++数据结构的时候我就经常因为忘记delete而出问题)。不容易有内存泄漏或者溢出。但是一旦出现内存问题却很难排查,

qq_44452887的博客 259

JVM学习笔记1——Java内存区域与内存溢出异常

一、内存区域 JAVA内存区域可分为两大类:线程共享区和线程隔离区。 线程共享区:顾名思义是所有线程公有的一块区域,这块区域包含两个部分:方法区和堆 线程隔离区:每个线程独占一份的区域,这块区域包含三个部分:虚拟机栈、本地方法栈和程序计数器 方法区:存放类的元数据(类的方法代码,变量名,方法名,访问权限,返回值等等),常量和静态变量,以及及时编译器编译后的代码。 虚拟机栈:存...

shumeng_xiaoyan的博客 462

JVM学习笔记——1.Java内存区域与内存溢出异常

1.1运行时数据区 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,他们有各自的用途以及创建销毁时间,一些区域随着虚拟机进程的启动一直存在,有一些则是依赖用户线程的建立和销毁。 其中云形状的为线程共享数据区,其他为线程隔离数据区 1.1.1 程序计数器 内存空间较小,当前线程所执行字节码的行号指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都要依赖这个计数器。 每条线程私有,如果线程执行是一个Java方法计数器记录的是正在执行的虚拟机字节码指令地址;如果是本

qq_45136877的博客 403

JVM学习--(一)Java内存区域与内存溢出异常

Java内存区域与内存溢出异常 一.Java技术体系 JDK:Java程序设计语言、JVM、Java类库三部分所构成 支持Java程序开发的最小的环境 JRE:JVM以及Java类库API的Java SE API子集两部分所构成 支持程序运行的标准环境 二.JVM内存区域分布 1.程序计数器 程序计数器本质上是标记下一条需要执行的字节码指令。特点: 1.线程私有,每个线程都有自己的程...

jacobbbbbbbb的博客 210

JVM学习与问题总结——java内存区域与内存溢出异常

java虚拟机将内存分为哪些区域? 根据Java SE7版本的Java虚拟机规范,虚拟机管理的内存包括5个运行时数据区域: 程序计数器 虚拟机栈 本地方法栈 方法区 堆 运行时数据区各部分的作用? 程序计数器 一个线程所执行的字节码的行号指示器。 字节码解释器会通过改变计数器的值来选取下一条将要执行的指令,那么分支、循环、跳转、异常处理、线程恢复都需要依赖计数器来完成。而J...

weixin_30337157的博客 140
上一篇: android柱状图和饼状图的简单使用(MPAndroidChart)
下一篇: EventBus3.0的使用
android_xiaogang
博客等级 码龄12年 89粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值