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

学习STM32的CAN总线通信 在配置时,确保您启用了CAN总线功能。CAN节点是CAN总线上的一个设备,每个节点都有唯一的标识符。在CAN总线中,有两种类型的节点:CAN控制器和CAN外设。步骤2:配置CAN总线 在STM32CubeMX中,选择CAN总线模块并进行必要的配置。在CAN总线中,有两个重要的概念:CAN节点和CAN帧。步骤5:测试CAN总线通信 在成功编译和烧录代码后,您可以使用串口调试助手或其他CAN总线工具来测试CAN总线通信。步骤3:编写CAN总线通信代码 在项目的主代码文件中,我们将编写CAN总线通信的示例代码。 阅读详情

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

一.Java技术体系

JDK:Java程序设计语言、JVM、Java类库三部分所构成 支持Java程序开发的最小的环境
JRE:JVM以及Java类库API的Java SE API子集两部分所构成 支持程序运行的标准环境

二.JVM内存区域分布

Java虚拟机运行时的数据区

1.程序计数器

程序计数器本质上是标记下一条需要执行的字节码指令。特点:
1.线程私有,每个线程都有自己的程序计数器,因此线程安全。
2.如果执行Java方法,记录的是字节码指针的地址;如果执行的是Native方法,计数器值应该为Undefined(本地方法是由C++或者C实现的)。
3.不会发生内存溢出。

2.Java虚拟机栈

虚拟机栈是Java方法执行的线程内存模型。
特点:
1.线程私有,寿命与线程相同。
2.每个方法被执行都有一个栈帧,里面有局部变量表、操作数栈、动态连接、方法出口等。
3.局部变量表存放了各种基本数据类型,空间上以局部变量槽(Slot)表示。
4.栈深度超过允许深度,报StackOverflowError错误;如果是动态扩展,超过内存时报OutofMemoryError。

3.本地方法栈

与虚拟机栈类似,但其中存放的是Native方法。在hotspot中本地方法栈与虚拟机栈是同一个。

4.Java堆

存放对象实例处。
特点:
1.是由垃圾管理器所管理的区域,因此也被称作GC堆。
2.通过将JAVA堆根据线程划分出不同的内存区域,即为TLAB,可以提高分配时的效率。
3.Java堆中的内存可以是连续的,也可以不是连续的。

5.方法区

存储的是被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存。
特点:
1.1.8前存在“永久代”,及Java堆中的一块区域,1.8后将方法区放在元空间,及本地内存中的一片区域(原则上不会发生溢出)。
2.对于方法区的约束比较宽松,可以不进行垃圾回收,但是会有Bug因为未完全垃圾回收产生。

运行时常量池

形式上像键值对,是方法区的一部分,主要存放着编译期生成的各种字面量和符号的引用。
特点:
1.保存的不只是描述的符号引用,还有些符号引用翻译出来的直接引用。
2.具有动态性。即不一定要编译器产生,运行中也可以放入,例如String的intern()方法。

6.直接内存

不是虚拟机数据区的一部分,主要作用是加快JAVA堆和Native堆之间复制数据的速度。

三.HotSpot虚拟机内部对象创造过程

1.当虚拟机遇到new等指令时,先会检查符号指向的类是否被加载、解析和初始化过,若没有,则先初始化。

2.虚拟机为新对象在JAVA堆中分配内存。

1.内存大小的确定以及分配。堆中的主要可以分成三部分:1️⃣对象头。第一类是用于储存对象自身运行时的数据,包括哈希码、GC分代年龄、锁状态等,被称为“Mark Word”,是一个有着动态定义的数据结构。第二类是类型指针。用来指向方法区中的类,但并不是所有对象都需要类型指针。需要注意的是如果是数组,则对象头中必须记录数组长度。2️⃣实例数据。真正储存的信息,所定义的各种类型的字段内容。3️⃣对齐填充。没有含义,任何对象都需要是8的整数倍,需要补齐。
大小基本上是在类结构确定下来的时候就已知了。

2.在Java堆中划分的方法。1️⃣对于连续的内存空间,用“指针碰撞”。2️⃣对于不连续的用“空闲列表”。
保证线程安全的方法:1️⃣进行同步处理,例如CAS。2️⃣采用TLAB。

3.初始化对象

调用CLASS文件中的()方法。

4.对象的访问定位

Java程序会通过栈上的reference来访问。1️⃣将JAVA堆中划分出一块特别的区域当做句柄池。好处是容易改变指针的指向,坏处是时间空间开销变大。2️⃣直接通过对象指针进行访问。

四.实战

1.Java堆溢出

通过-Xms来设置堆的最小值,通过-Xmx来设置堆的最大值
若报Java heap space,主要有两个原因:1️⃣内存泄露,泄露对象与QC Roots或者其他的引用路径相连,导致垃圾回收器无法回收。2️⃣内存不够,适当增大Xmx或者寻找程序中是否有不合理的对象。

2.虚拟机栈和本地方法栈溢出

-Xoss来设置本地方法栈的大小(但是没有任何用)。-Xss来设置栈容量。
若栈允许动态扩展,那么只有当栈容量无法申请到足够的内存时,会抛出OutOfMemoryError。
若栈不允许动态扩展,当栈容量超过最大深度时,会抛出StackOverflowError。
无论是虚拟机栈容量太小或者是栈帧太大,都会抛出错误。
每个栈内存越大,就意味着可以建立的线程越少。

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

1.8前可以通过-XX:MaxPermSize来限制永久代的大小来间接限制常量池容量。1.8后方法区在元空间,常量池在Java堆中。
1.6中intern()方法会把首次遇到的字符串实例复制到永久代的字符串常量池中储存,返回的是永久代中的引用的拷贝。但1.6后返回的直接是永久代的引用。
-XX:MaxMetaspaceSize 可以设置元空间大小 -XX:MetaspaceSize 指定元空间的初始空间大小,达到该值会触发垃圾回收 -XX:MinMetaspaceFreeRatio 垃圾收集后控制最小的元空间剩余容量的百分比。

4.直接内存溢出

-XX:MaxDirectMemorySize 可以来设置直接内存的大小。默认与-Xmx大小一致。
一个溢出的明显特征是发现内存溢出之后产生的Dump文件很小,而程序中又间接或者直接使用了DirectMemory。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片 基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正 立即下载

相关推荐

QGroundControl或者华科尔地面站安装完打不开问题解决

QGroundControl 华科尔 打不开

wv112406的博客 4910

应用jacob组件造成的内存溢出解决方案(java.lang.OutOfMemoryError: Java heap space)

转自(http://www.myexception.cn/ruby-rails/903889.html) 使用jacob组件造成的内存溢出解决方案(java.lang.OutOfMemoryError: Java heap space) 都说内存泄漏是C++的通病,内存溢出是Java的硬伤,这个头疼的问题算是让我给碰到了。我在做的这个功能涉及到修改word文档,因为微软没有公开word

小兀的博客 4656

模电(十四)差分放大电路

目录 差分放大电路 双端输入双端输出 Q点分析 抑制共模信号 放大差模信号 双端输入单端输出 Q点分析 差模信号分析 共模信号分析 单端输入双端输出 单端输入单端输出 四种接法比较 具有恒流源的差分放大电路 差分放大电路的改进 差分放大电路 采用引入支流负反馈,温度补偿来克服零点漂移(温度变化,直流电源波动,元器件老化产生的输入电压为零,输出电压不为零的...

weixin_43674847的博客 2万+

【搞定JVM】第二章 Java内存区域和溢出异常

目录 转载:https://blog.youkuaiyun.com/pcwl1206/article/details/83990008 一、走进Java 1、Java技术体系 3、Java虚拟机发展史:Sun和BEA被Oracle收购 HotSpot VM [Sun] 4、 Java的优点 5、 编译器与解释器的区别 6、内存泄漏和内存溢出 二、Java内存区域和溢出异常 1、 运行时数据...

ZHAOJING1234567的博客 319

保姆级图解:FD-SOI工艺流程中的关键三步(外延生长、应变硅、HKMG)

本文详细解析了FD-SOI工艺流程中的三大关键技术:外延生长、应变硅工程和HKMG集成。通过选择性外延生长技术优化接触电阻,利用应变硅提升载流子迁移率,并结合先栅高k金属栅工艺实现精准栅极控制,FD-SOI技术在智能手机处理器和自动驾驶芯片制造中展现出卓越的低功耗与高性能平衡。

weixin_29267307的博客 491

总结:知识图谱KG+大模型LLM

知识图谱KG+大模型LLM

安静的软件工程师 4210

java虚拟机:详解jvm的内存布局和内存溢出异常

运行时数据区域 主要包括如下几部分: 堆(Heap) 在这个多线程的架构体系中,咱们知道有的区域是线程私有的,而有的区域是线程共享的。对于堆区,就是线程共享的,不管是堆还是栈,底层都是一个物理机的主存而已,在此基础上,JVM进行了逻辑分块,有了堆、栈的概念,比如JVM认为物理地址0x0000~0x2321为堆区,他就是堆区了。堆是用来干什么的呢?java是面向对象的语言,所以用new创建一个对象...

jcw的博客 271

C2000 CLA协处理器:嵌入式实时控制性能优化与实战指南

在嵌入式实时控制系统中,主CPU常因高频率、低延迟的控制算法而面临性能瓶颈。为解决此问题,协处理器技术应运而生,它通过硬件并行架构分担计算密集型任务,从而提升系统整体性能。其核心原理在于独立的计算单元与总线设计,能够实现近乎零延迟的响应,这对于电机驱动、数字电源等闭环控制场景具有极高的技术价值。本文聚焦于德州仪器C2000系列微控制器中的控制律加速器(CLA),深入解析其作为独立浮点协处理器如何通过任务调度与消息RAM通信机制,有效实现性能倍增,并提供了从内存配置到代码调试的完整工程实践方案。

weixin_29192211的博客 305

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

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

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

支付宝域名如何加入白名单(扫码老是弹窗)

支付宝扫码之后,遇到非支付宝官方网页,请确认是否继续访问弹窗,问题解决办法。本章教程提供解决办法,亲测有效。

猿小白的博客 9196

OceanBase数据迁移(OMS)深度解析:异构数据库迁移方案、核心原理与实战优化指南

OceanBase迁移服务(OMS)提供异构数据库间全量+增量数据迁移与实时同步能力,核心价值在于保障业务连续性、数据一致性和异构兼容性。其分层架构包含服务接入层、流程编排层和组件链路层,支持Oracle/MySQL/DB2等与OceanBase的数据交互。关键技术包括DBCat引擎处理结构转换、并行分片实现全量迁移、以及日志解析保障增量同步。OMS通过类型映射、批量提交和断点续传等优化手段,确保迁移过程高效可靠,典型应用于去O迁移、数据库升级等场景。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 849

JVM 学习一:JAVA内存区域及内存溢出异常

老生常谈 最近快要写完毕业论文了 来学习一波JVM 开始正题: Java内存区域主要值得是运行时数据区---> 1、程序计数器、 2、java虚拟机栈、 3、本地方法栈 4、堆 5、方法区 6、运行时常量池。 下面我们会按照这个循序进行介绍 1.程序计数器 程序计数器是一块较小的内存空间,当做是当前线程执行的字节码指示器(线程私有)。分支、循环、递归、转跳都需要以来...

qq_36186068的博客 169

YOLO11-pose关键点检测:训练实战篇 | 自己数据集从labelme标注到生成yolo格式的关键点数据以及训练教程

教会你如何用自己的数据集转换成对应格式的数据集以及如何训练YOLO11-pose关键点检测

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 5418

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

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。根据《Java虚拟机规范(Jave SE 7 版)》的规定,Java虚...

chubishi4192的博客 145

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JVM学习系列(一) JAVA内存区域和内存溢出异常

JAVA内存区域介绍 程序计数器: 线程私有,很小的内存空间,可以看做是当前线程所执行的字节码的行号指示器; 每个线程都有一个独立的程序计数器,各个线程之间的计数器相互不影响,独立存储; 如果线程执行的是Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址,如果是一个Native方法,那么这个计数器的值则为undefined; 该内存区域不会发生任何的OutOfMemoryEr...

蔚是蔚蓝的蔚 66

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

在学习Java的过程中,了解Java虚拟机(JVM)的内存管理机制是至关重要的。特别是在处理大型项目或复杂应用时,对JVM内存区域的深入理解能够帮助我们更好地优化代码,避免内存泄漏和内存溢出等问题。

2401_86224057的博客 1786

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

JVM-JAVA内存区域与内存溢出异常

C/C++拥有着绝对的内存管理权限,但是也正因如此控制这些内存从无到有,再从有到无就异常繁琐。但是java不需要担心这些,他们把他全权交给了虚拟机去实现,也正因如此,如果你不了解java虚拟机,那么一旦出现了内存泄漏和溢出方面的问题,解决起来将会异常繁琐。

qq_74763440的博客 1371

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

例如,在JDK 6或更早版本中,String.intern() 方法会将其内容复制到永久代的字符串常量池中,如果调用 intern() 的字符串过多,也会导致永久代溢出。检查应用是否使用了动态生成类的技术,或者是否存在类加载器泄漏(例如,在Web容器中重复部署应用时,旧的类加载器及其加载的类没有被卸载)。,是指程序在申请内存时,没有足够的内存空间供其使用。如果是内存溢出,检查业务逻辑是否合理,或者考虑增加堆内存大小(-Xmx),优化数据结构(如使用更节省内存的结构),或者分批处理大数据。

2301_77037373的博客 830

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

对于Java程序员来说,Java虚拟机是再熟悉不过了,尤其是对Hotspot VM最熟悉了,因为它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广泛的Java虚拟机。相比C、C++开发人员来说,有了JVM,Java程序员不再需要为每一个new操作去写配对的delete/free代码,不容易出现内存泄漏和内存溢出的问题。但也正因为内存控制完全交由JVM,一旦出现内存泄漏和溢出的问...

Helon的博客 1180

JVM-java内存区域与内存溢出异常

JVM-java内存区域与内存溢出异常 说明 运行时数据区域 1 程序计数器 2 java虚拟机栈 3 本地方法栈 4 java堆 5 方法区 对象的创建 一个有意思的现象 JVM-java内存区域与内存溢出异常1 说明java 与 c++之间有一堵由内存动态分配和垃圾回收技术所围成的高墙,墙外的人想进来, 墙内的人想出去。然而java的使用者就是这些墙里的人。这篇文章就是介绍java虚拟机内存的各

努力在追梦的路上 1327

Java内存区域与内存溢出异常详解(jvm详解1)

在Java编程中,理解Java虚拟机的内存布局及其管理机制对于开发高效、稳定的应用程序至关重要。Java虚拟机的内存主要分为几个运行时区域,这些区域各司其职,共同支撑起Java程序的运行。本文将详细探讨Java虚拟机的内存区域以及这些区域如何与内存溢出异常相关联。

hs_1024的博客 1200

Java内存区域与内存溢出异常分析与解决

摘要:本文深入分析Java内存区域的划分及常见内存溢出问题。详细介绍了堆内存、方法区(元空间)和虚拟机栈的功能特点,以及对应的OutOfMemoryError和StackOverflowError异常。通过数学公式描述了内存使用模型,并提供了典型错误场景的代码示例和解决方案。文章还推荐了诊断工具和预防策略,包括JVM参数调优、内存泄漏检查等技术手段,帮助开发者有效应对内存管理问题。最后总结了常见错误信息与处理方法的对照表,为快速定位问题提供参考。

专注于与编程相关的知识内容分享 782

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

程序计数器是当前线程所执行的字节码的行号指示器。它不会出现内存溢出问题。Java 内存区域分为多个部分,每个区域都有其特定用途和限制。了解这些内存区域及其对应的内存溢出异常,能够帮助我们更好地管理内存,优化应用性能。在实际开发中,我们可以通过合理配置虚拟机参数、优化代码等方式来预防和解决内存溢出问题。希望本文能帮助你深入理解 Java 内存管理和内存溢出异常,提升你的开发技能。

C_V_Better的博客 945

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

目录 jvm虚拟机内存划分 一、java内存区域 1.程序计数器 2.Java虚拟机栈 3.本地方法栈 4.Java堆 5.方法区 6.运行时常量池 7.直接内存 二、对象探秘 1.对象的创建(我简单的分为5小步) 2.对象的内存布局 3.对象的访问定位 jvm虚拟机内存划分 一、java内存区域 1.程序计数器 程序计数器是一小块较小的内存空间,可以看作是当前线程多执行的字节码的行号指示器。因为Java是多线程执行程序的,由处理器分配时间片来处理数据,当切换到另一个线程处

Me_xuan的博客 645

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

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

weixin_43110854的博客 372

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

文章目录1. JVM简介2. JVM内存区域划分线程私有内存I. 程序计数器 :II. 虚拟机栈 :III. 本地方法栈线程共享内存I. Java堆II. 方法区III. 运行时常量池 1. JVM简介 虚拟机简介 :JVM(Java Virtual Machine的简称,意为Java虚拟机) 虚拟机 :指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统 常见的虚拟机 ...

iqqcode 751
下一篇: JVM学习--(二)垃圾收集器与内存分配策略
jacobbbbbbbb
博客等级 码龄7年 6粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值