JVM内存分布

使用 MATLAB/Simulink + Simscape Electrical,构建一个含储能的微电网系统,实现储能系统与并网逆变器的协同控制 摘要:本文基于Simulink平台,详细介绍了微电网中储能系统与并网逆变器的协同控制建模与仿真方法。主要内容包括:1)构建包含光伏、风电、锂电池和双向DC-DC变换器的微电网系统;2)设计并网逆变器的PQ/Vf双模式控制策略;3)实现储能系统与逆变器的协同控制逻辑,包括SOC保护和功率分配;4)通过多种工况仿真验证系统性能。结果表明,该系统能有效维持微电网稳定运行,支持并网/离网无缝切换。文章还探讨了优化方向和应用扩展,为新能源微电网控制提供了实用参考。 阅读详情

《深入理解Java虚拟机》第2章笔记


JVM

图为Java虚拟机内存划分情况。

程序计数器

当前线程所执行的字节码的行号指示器,通俗来说就是用于指示线程执行到程序的哪一步。在Java中,由于多个线程是轮流占用处理器,为了线程切换后能够恢复到正确的执行位置,每个线程都有一个独立的程序计数器用于保存各线程程序执行位置。所以该数据区是线程私有的。值得注意的是,该区域是唯一一个不会抛出OOM异常的区域。

Java虚拟机栈

Java虚拟机栈,就是我们平时所说的栈区,也是线程私有的,其生命周期与线程相同。虚拟机栈主要描述的是Java方法执行的内存模型:每个方法执行时都会创建一个栈帧,用于存储方法的局部变量表、操作数栈、动态链接、方法出口等信息,而每个方法从调用到执行完成,就对应着一个栈帧在虚拟机栈中的压入和弹出过程。其实我们平时使用IDE进行调试时,就可以非常直白地看到虚拟机栈栈帧的压入与弹出,下图展示的是IDEA中程序的调试画面:
stack
我在inc2方法打个断点,执行程序,首先创建一个“main”线程,然后依次压入ByteCode()、inc1()、inc2()对应的栈帧。

Java虚拟机规范对这个区域规定了两种异常:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果虚拟机栈可以动态扩展,只有在扩展时无法申请到足够的内存,才会抛出OutOfMemoryError异常。这里有个问题:什么是虚拟机所允许的栈深度呢?其实最大深度是由线程分配到的栈空间决定的,举个栗子:假设某个线程分配到的栈空间大小为100KB,而每个栈帧占用的空间为2KB,理论上栈的深度可达到50,只要超过50,就会抛出StackOverflowError。那什么时候才会抛出OutOfMemoryError异常?刚刚也提到,如果虚拟机栈是允许栈动态扩展的,譬如现在栈的深度已经达到50了,当栈深度继续增加时,虚拟机允许再为该线程分配栈空间,假设扩展到200KB,而如果200KB已经是虚拟机可以给线程分配的最大栈空间,一旦栈深度超过100,就会抛出OutOfMemoryError异常。注意:Java虚拟机(HotSpot虚拟机)并不支持栈空间的动态扩展。

本地方法栈

这块区域与虚拟机栈的作用与结构基本一致,唯一不同的就是本地方法栈是为native方法服务的。同样地,这块区域也会抛出StackOverflowError异常和OutOfMemoryError异常。

Java堆

Java堆唯一的目的就是存放对象实例,譬如new String()就会在堆区中产生String类的一个对象实例,它是线程共享的,所有线程产生的实例对象都存放在Java堆中。而正是由于该区域是用于存放实例对象,也就意味着这块区域是GC(垃圾回收)的“主战场”,故也可以称Java堆为GC堆。从内存回收的角度来看,由于现在的收集器基本上都是采用分代收集算法,所以堆区还可以细分为新生代和老年代,而新生代还可以分为“Eden(伊甸)区”、“From Survivor区”和“To Survivor区”,这样分区都是为了使GC执行更加快速。另外,JVM是允许Java堆动态扩展的,如果堆区没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OOM异常。

方法区

与Java堆一样,是线程共享区域,主要用于存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。Java虚拟机规范在逻辑上将方法区归属于堆区,但是方法区也称为“Non-Heap(非堆)”,目的就是为了将方法区与堆区分开。

在HotSpot虚拟机中,方法区也称为“永久代”,注意“永久代”这个概念只是在HotSpot虚拟机存在,可以理解是HotSpot虚拟机对Java虚拟机规范中方法区的实现,而在其他虚拟机中,是有不同的实现方法。对于“永久代”而言,可以通过相关参数来设置内存上限大小和是否支持动态扩展,但这也会更加容易遇到内存溢出的问题,例如:在某个程序中,设定永久代大小为128MB,且不允许动态扩展,如果该Java程序使用到了类似cglib动态生成大量的代理子类,将会抛出OOM异常。所以在JDK 1.8及之后的版本中,已经将“永久代”移除,取而代之的是元空间,直接使用本机内存来存放方法区中的信息,只要不超过本机内存上限,就不会抛出OOM异常。

对于方法区的GC回收,主要是针对常量池的回收和对类型的回收,但是往往回收的效果都不太理想,原因为对这块区域的回收条件相对苛刻。

运行时常量池

运行时常量池也是方法区的一部分,主要用于存放经由编译器编译生成的Class文件中的符号引用和字面量,程序运行时,将由类加载器将这些信息加载到虚拟机的运行时常量池。除此之外,还会存放符号引用翻译后的直接引用,和Java中的某些方法(例如String类的intern()方法)在运行期间将新的常量加入到运行常量池中。既然归属于方法区,自然受到方法区内存的限制,当常量池无法申请到内存时,会抛出OOM异常。

直接内存

直接内存并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域,但是这部分内存也会被虚拟机调用,而且可以会导致OOM异常抛出。

简单来说,这部分内存主要作为Java堆和Native堆之间的缓冲区,当Java堆需要获取Native堆中的数据时,可由存储在Java堆中的DirectByteBuffer对象作为这块内存的引用而进行操作,避免了在Java堆和Native堆之间来回复制数据导致效率低下。

直接内存之所以会导致Java程序抛出OOM异常,主要原因是开发者没有考虑到这块内存的存在,举个栗子:本机总内存为2G,假设开发者将某个Java程序初始内存占用配置为1.5G,而直接内存占用0.5G,由于开发者没有考虑到直接内存,当该Java程序内存动态扩展时,导致OOM异常抛出。

【声呐技术】基于人工智能的拖曳阵声呐声学数据处理系统 SEA公司AI辅助拖曳阵系统 KraitSense是SEA公司开发的紧凑型被动拖曳阵声呐系统,核心传感器为KraitArray细线拖曳阵列。该系统专为小型舰艇、无人水面艇(USV)和无人潜航器(UUV)设计,通过人工智能与机器学习技术实现水下声学数据的自动化采集、处理与分类。系统与Mind Foundry公司开发的软件平台深度集成,形成端到端的智能反潜战(ASW)解决方案。 阅读详情

相关推荐

DLPFC.h5ad格式数据简便获取方式+STAGATE论文复现问题

简便获取DLPFC.h5ad格式的数据方式

apple_74057836的博客 2255

JVM内存分配机制

Java虚拟机最重要的工作就是如何给对象分配内存空间,以及通过GC如何回收已经不再使用的内存空间。这篇文章主要介绍JVM中的Java对象是创建过程、对象内存的分配机制以及对象内存的回收机制。 一、对象的创建 在前面的文章《JVM类加载机制》中讲过,JVM中所有对象的创建,都需要先将对应的.class文件加载进内存,所以JVM中通常一个对象的创建包含了如下几个步骤: 1.1 检查类是否加载 当JVM执行到new字节码指令时,首先会去运行时常量池检查该指令指定的参数能够找到对应类的符号引用,并检查这个符号引用

sermonlizhi的博客 3780

2023-2024深度学习框架之争——选pytorch还是tensorflow?

深度学习是人工智能领域的一个重要分支,它利用多层神经网络来模拟人类的学习和推理能力,解决各种复杂的问题,如图像识别、自然语言处理、语音识别、推荐系统等。深度学习框架是一种软件工具,它提供了构建、训练、测试和部署深度学习模型的便利,使得开发者和研究者可以更高效地进行深度学习的开发和应用。目前,市场上有许多不同的深度学习框架,如PyTorch、TensorFlow、Keras、MXNet、Caffe2等,它们各有优劣,适用于不同的场景和需求。

flchen_nchu的博客 6752

JVM内存分配机制详解

JVM内存的分配机制 栈 堆 新生代(伊甸园区 from区 to区=8:1:1 可调整) 老年代 方法区 元空间 永久代的关系

qq_22514513的博客 1731

工业相机与ABB机器人Socket通信实战:手把手教你用RobotStudio 6.08搭建视觉引导工作站

本文详细介绍了工业相机与ABB机器人通过Socket通信实现视觉引导工作站的实战教程。使用RobotStudio 6.08平台,涵盖工作站搭建、坐标系标定、RAPID代码开发及TCP/IP通信配置,特别解析了欧拉角与四元数转换等关键技术难点,助力智能制造产线升级。

weixin_42531516的博客 407

电商秒杀场景下,如何用Redis+Lua脚本实现原子性库存扣减(附完整代码)

本文针对电商秒杀场景下的高并发与超卖难题,详细解析了如何利用Redis的原子性命令与Lua脚本实现可靠的库存扣减。通过对比多种方案,阐述了Redis+Lua作为黄金搭档的技术原理,并提供了从基础扣减到预扣减模型的完整代码实现,确保在高并发下数据的一致性与系统性能。

weixin_29219539的博客 503

JVM - 内存分配

JVM - 内存分配

汤键的博客 1086

智能解决装箱问题:使用优化算法实现高效包装

装箱问题(Bin Packing Problem)是组合优化领域中的一个经典问题,主要涉及如何将一系列对象高效地装入有限数量的容器(或“箱”)中,同时满足特定的约束条件。这个问题的目标是最小化所需使用的箱子数量或者最大化箱子的装载效率,以减少空间或资源的浪费。

MindOpt_003的博客 5542

Java基础之JVM对象内存分配机制简介

大量对象分配在Eden区,Eden区满了后会触发MinorGC,可能99%以上的对象会变成垃圾而被回收掉,而剩余存活的对象会被挪到空的Survivor0区,下次Eden区满后会触发MinorGC,把Eden区+Survivor0区中存活的对象复制到Survivor区,并Eden区和Survivor区垃圾回收,因此新生代的对象大部分是朝生夕死,存活时间比较多,所以JVM默认的8:1:1比例很合适,原则:让Eden区尽量大,Survivor区足够用就可以;

磊杰的博客 2049

实战分享:如何利用svchost进程绕过360防护(附完整Shellcode注入教程)

本文深入解析系统进程安全防护机制,探讨svchost等关键进程的安全特性与防护策略。详细分析安全软件的行为检测和内存保护技术,提供系统加固与监控实践建议,助力企业构建多层次防御体系,有效应对潜在安全威胁。

weixin_30752699的博客 99

FPGA网络调试实战:基于88E1111和DP83867两款PHY芯片的SGMII-UDP数据回环对比与避坑指南

本文深入对比了88E1111与DP83867两款PHY芯片在SGMII-UDP数据回环中的性能差异,涵盖硬件设计、Vivado工程配置及调试技巧。通过实测数据揭示DP83867在吞吐量、延迟和功耗方面的优势,并提供FPGA网络调试中的常见问题解决方案,助力工程师高效完成项目开发。

weixin_31682031的博客 383

JVM的内存分配

JVM的内存分配与GC回收机制JVM内存分配元空间与方法区与永久代堆新生代老年代合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 JVM内存分配 JVM内存分为五部分:元空间(方法区)、堆、虚拟机栈、本地方法栈、程序计数器 元空间与方法区

weixin_51849480的博客 2583

零基础NPU固件开发学习路线--1.4 学习路线与工具链:编译器、仿真器、调试器、烧录工具

本文系统介绍了NPU固件开发的学习路径与工具链。学习路线分为四个阶段:基础认知、环境搭建、模块开发和联调量产。重点讲解了交叉编译器、代码管理工具、调试器和烧录工具等核心工具链的使用方法。文章强调工具链在NPU固件开发中的关键作用,详细阐述了从代码同步到固件烧录的全流程开发闭环,为开发者提供了一条从零基础到独立开发的完整学习路径。

MHD0815的博客 112

JVM之一——对象的创建和内存分布

博客结构1.背景2.内容脑图3.JVM对象1.JVM对象创建2.JVM对象内存3.JVM对象访问4.JVM的逃逸技术 用简单通俗的话来记录自己对架构的理解 1.背景 对于android工程师,Dalvik、ART虚拟机是进阶必走之路,那么,这两种虚拟机也都是JVM,要了解它们,JVM的入门必不可少。 2.内容脑图 对于为啥学习、设计它的原因、JVM发展历史就不做具体的阐述,内存区域的详细讲解,参考: https://blog.youkuaiyun.com/FullStackDeveloper/article/deta

技术人生 280

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

JVM 内存分布详解

【代码】JVM 内存分布详解。

m0_54712443的博客 355

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

JVM第一章 内存分布

内存分配流程

sdau20171934的博客 435

Statistics and Machine Learning Toolbox

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

jvm内存分布

目录 一 jvm整体结构 程序计数器 本地方法栈 堆(heep) 新生代和老生代 虚拟机栈 方法区 一 jvm整体结构 主要由 程序计数器,本地方法栈,堆,虚拟机栈,方法区等组成,其中堆和方法区属于线程共享,其他的为线程隔离。 官方文档地址:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.6.5 程序计数器 英文名:The pc Regist...

qq_36869100的博客 232

Jvm 内存分布机制

jvm 内存分布

a15089415104的博客 548

一图看懂JVM内存分布,永久记住!

只有真正的理解,并且在心中有一个总结构图才能记得清楚说的清楚!

IT乐知 1235

一文看懂JVM运行时内存分布

/ 今日科技快讯 /近期,工信部网络安全管理局通报称,阿里云计算有限公司发现阿帕奇(Apache)Log4j2组件严重安全漏洞隐患后,未及时向电信主管部门报告,未有效支撑工信部开展...

郭霖 199

JVM之对象的内存分布

java对象内存模型

蔡里都傻的博客 365

JVM内存分布,配置参数,GC机制

JVM内存分布,配置参数,GC机制 转载于:https://www.cnblogs.com/liuxl21/p/6632750.html

weixin_30258901的博客 129

一图看懂JVM内存分布(附上JVM参数说明)

程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。一图看懂JVM内存分布!(附上JVM参数说明)

iamzhuwh 842

java—JVM结构和内存分布

java虚拟机内存结构

qq_40177185的博客 689

java-数组(以及jvm的内存分布)

与方法调用相关的一些信息,每个方法在执行时,都会先创建一个栈帧,栈帧中包含有:局部变量表、操作数栈、动态链接、返回地址以及其他的一些信息,保存的都是与方法执行时相关的一些信息。我们在内存空间上开辟出一段连续的空间这段空间存入我们需要存入的相同类型的数据就像我们一些学校的宿舍,这些宿舍中的床位都是连续的紧挨着的,并且一个宿舍规定了只能住男生或者女生。而引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址。基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值;

m0_72433000的博客 1309
上一篇: CentOS 7 常用命令
下一篇: 阿里服务器部署
HamalAlpha
博客等级 码龄11年 5粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值