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

别再死磕NFP了!用Python+遗传算法搞定异形件自动排版(附完整代码) 本文介绍了如何利用Python和遗传算法实现异形件智能排版,解决传统NFP方法计算复杂的问题。通过Shapely库处理几何运算和DEAP库搭建遗传算法框架,结合模拟退火策略避免局部最优,显著提升材料利用率。附完整代码和优化技巧,适用于服装裁剪、金属加工等行业。 阅读详情

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。

RU DOS版、EFI版32bit/64bit BIOS常用工具 DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。 立即下载

相关推荐

系统-等保三级-CentOS Linux 7合规基线检查 shell脚本

系统-等保三级-CentOS Linux 7合规基线检查 shell脚本

swindy博客 2408

应用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

无感健康监测的未来:毫米波雷达如何重新定义睡眠科技与居家养老

毫米波雷达技术正重新定义无感健康监测,特别是在睡眠科技与居家养老领域。通过精准监测呼吸、心率和体动,无需穿戴设备即可实现临床级精度。结合合宙Air700E开发板,构建了完整的远程看护解决方案,为老年人提供跌倒检测、异常报警等安全保障,同时保护用户隐私。

cake8的博客 568

【搞定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

永久关闭Windows更新的5种方法

很多家用电脑,如果系统自动更新的话,会变得越来越卡顿,且硬件型号兼容也并不完美。那么我们该如何彻底关闭Win11的自动更新呢?以下准备了5种方法,您可以根据自身实际情况选择合适的方法!

qq_43652793的博客 1万+

不刷机!Jetson AGX Orin无损更新内核与设备树的两种安全方法(附备份恢复脚本)

本文详细介绍了Jetson AGX Orin在不刷机的情况下安全更新内核与设备树的两种方法,包括extlinux.conf动态加载和分区精准刷新方案。通过备份恢复脚本和工业级灾备方案,确保零数据丢失,适用于边缘AI和机器人等关键场景。

weixin_40192258的博客 308

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

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

jcw的博客 271

银河麒麟V10离线安装VLC播放器:依赖处理与3.0.9.2版本实操指南

在国产化操作系统日益普及的背景下,软件安装方式成为政企内网用户关注的重点。离线安装作为一种不依赖公网源的部署手段,常用于解决内网环境下的软件获取问题。其核心在于理解Linux包管理机制,如dpkg与apt对依赖关系的处理逻辑。掌握这一原理,不仅能应对多媒体软件的部署,也能提升系统维护效率。VLC作为跨平台多媒体播放器,凭借强大的解码能力与协议支持,广泛应用于本地视频播放、RTSP拉流及监控大屏等场景。本文从离线安装的通用概念出发,结合银河麒麟V10桌面版的实际环境,详细梳理了VLC 3.0.9.2离线包的获

weixin_32247165的博客 370

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

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

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

网络流量异常信息分析方法研究

本课题针对网络安全中网络流量异常的分析方法进行研究,提出一种基于机器学习和深度学习的异常检测算法。该算法采用卷积神经网络(CNN)和长短时记忆神经网络(LSTM)结合的方式,通过训练得到二分类模型,从而实现对网络流量异常的检测。随着互联网的飞速发展,网络攻击事件日益增多,网络安全问题成为了亟待解决的问题之一。常见的网络攻击手段包括 DDoS 攻击、SQL 注入、XSS 攻击等,这些攻击手段可能导致网络系统发生异常,给网络运维、数据安全带来极大的挑战。

肥晨开发的学习之路 1036

【人工智能】RAG如何根据实际需求选择和进行文档解析(如 PDF、Word、TXT、网页等)?

文档解析的核心在于根据解析目标、文档类型和处理量选择合适工具。PDF、Word、TXT和网页各有特性:PDF需区分可编辑与扫描版,Word需处理结构化内容,TXT简单但需注意编码,网页需应对动态内容。解析场景包括提取纯文本、结构化数据、保留格式和批量处理。非技术用户可借助工具如Adobe Acrobat、WPS和在线OCR,技术用户可通过编程实现自动化。通用流程为:明确目标、分析文档属性、选择工具并测试优化。核心是“工具适配需求”,无需追求万能方案。

奶爸的编程之路,也就一周冷个三天 506

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

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

qq_36186068的博客 169

基于Cesium实现,动态水面+大坝排水动画

一、绘制面状水域,使用水波纹理,进行渲染,水体透明,可以看到底色。三、使用粒子系统,将喷泉改变方向,加上重力设置,实现排水动画。二、绘制线状三维体,用作模拟大坝拦截效果。四、最后,模拟水位上升,进行淹没分析,

一醉千秋的专栏 1420

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

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

chubishi4192的博客 145

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

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

蔚是蔚蓝的蔚 66

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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

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

2401_86224057的博客 1786

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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、付费专栏及课程。

余额充值