运行时数据区之堆

Zynq工程IP核封装:XCI引用与约束继承实战指南 IP核封装是FPGA系统设计中实现模块复用、团队协作与技术资产沉淀的关键环节。其本质是将功能逻辑、时序约束、接口协议和硬件配置统一抽象为可配置、可验证、可演进的标准化组件。核心原理在于通过XCI文件保留IP核的参数化定义能力,依托Vivado IP Packager实现约束继承、端口自动映射与时钟域解耦,从而保障跨项目集成的时序可信性与约束完备性。该技术广泛应用于Zynq SoC视频处理、高速接口(如HDMI/TMDS)、多时钟域控制系统等场景,尤其在需要长期维护与版本迭代的工业级嵌入式开发中具有不可替代的 阅读详情

堆的核心概述

  对一个进程而言是唯一的。一个进程对应一个JVM实例、一个JVM实例拥有一个运行时数据区,仅拥有一个堆结构,也是Java内存管理的核心区域。

  Java堆区在JVM启动时便被创建,并且设定好了大小。是JVM中最大的一块内存空间(可调节)

通过Java Visual JVM查看 通过 -Xms…m -Xmx…m

  堆在物理上可以存在不连续的内存空间,但逻辑上应当视为连续的。

  所有线程共享堆。堆还能划分为线程私有的缓冲区(TLAB,Thread Local Allocation Buffer)

  所有的对象实例 以及数组 都应当在 运行时 分配在堆上。

  数组和对象可能永远都不会存储在栈上,因为栈帧保存引用,而这个引用指向对象或者数组在堆中的位置。

在这里插入图片描述

  在方法结束后,堆中的对象不会马上移除,而是等待垃圾收集时移除。

  堆 是 垃圾收集器(GC,Garbage Collection)执行垃圾回收的重点区域。

  

内存细分

  现代的垃圾收集器大致基于 分代收集器理论设计。

  1.JAVA7 之前:新生区+养老区+永久区

  2.Java8:新生去 + 养老区 +元空间

在这里插入图片描述

元空间是逻辑上属于堆区。实际存储在方法区

  

设置堆内存大小与OOM

  1.设置堆空间的大小:

    -Xms 用于表现堆区(年轻代+养老代)的起始内存,等价于-XX:InitialHeapSize 【ms memory start】

    -Xmx 用于表示堆区的最大内存,等价于-XX:MaxHeapSize

  一旦堆区的内存大小超过了—Xmx 所指定的最大内存,将会抛出OOM(OutOfMemoryError)异常。

  通常会将 两个参数 配置相同的值,目的:在Java垃圾回收机制清理完堆区后不需要重新分割计算区间的大小,以此提高性能。

  

查看设置的参数

jps

jstat -gc 进程id

or

+XX:+PrintGCDetails

  

OOM错误

  对象与数组创建超过堆空间可容纳空间

  

堆区的结构

  在JVM中的java对象可以划分成两类:

    生命周期较短的瞬时对象(创建与消亡都很快)

    生命周期很长,甚至于JVM生命周期保持一致的对象。

  

  java堆区进一步划分又可以分为年轻代(YoungGen) 和 老年代(OldGen)

    其中年轻代又可划分为Eden空间、Survior0与Survivor1空间【也可称为form区、to区】

在这里插入图片描述

配置新生代与老年代在堆结构中的占比

  默认: -XX:NewRatio = 2 [新生代占1,老年代占2.即新生代占据整个堆的1/3]

  通过 -XX:NewRation = ? 进行修改。eg: = 3。即新生代占1,老年代占3.所以新生代占整个堆的1/4

  

配置新生区中Eden空间与两个Survivor空间缺省占比。 默认比例是8:1:1。可以通过 -XX:SurvivorRatio = ? 来进行调整。还可以通过-Xmn 来设置新生代最大内存大小。

  几乎所有的Java对象都是在Eden区被New出来的。也大多在新生代进行销毁。(大部分对象的使用周期短)
  

对象分配过程

  为新对象分配内存是一项复杂的任务。JVM不仅需要考虑内存如何分配、哪里分配。还需考虑内存分配与内存回收。因此要考虑GC执行完内存回收后是否会在内存空间产生内存碎片。

对象分配的流程

在这里插入图片描述

1.new的对象将存放于Eden区。

2.当Eden区填满,而程序又需要创建对象时,JVM的垃圾回收器会对Eden区进行垃圾回收[Minor GC],将Eden区中不再被其他对象所引用的对象进行销毁。再加载新的对象放到Eden区。

3.将Eden区剩余对象 移动到 Servivor0区。

4.若后续再次触发垃圾回收,则上次幸存下来的对象就会被放到Servivor0区。若无回收,便会存放到Servivor1区。

5.如果在经历垃圾回收,此时将会被放回Servivor0区,再去Servivor1区。

此时Servivor两个区,也可以被称为 TO区 和 Form区

​ TO:下一次垃圾回收的幸存者往哪里存放的区。【每当幸存一次,则会对幸存者赋值+1】

6.何时从新生代去老年代?

  默认为幸存15次。可以通过-XX:MaxTenuringThreshold=<N>进行设置

  

初始GC机制

  GC按照回收区域大致可分为两种类型。

    部分收集(Partial GC):不完整收集整个Java堆的垃圾收集

      新生代收集(Minor GC):仅针对新生代收集

      老年代收集 (Major GC):仅针对老年代收集

1.注意 此处Major GC 时常会和 Full GC混淆使用。具体需要分辨为。老年代回收还是整堆回收

2.只有CMS GC会单独收集老年代的行为。

​       混合收集

​     整堆收集(Full GC):针对整个新生代以及部分老年代的垃圾收集。

  

Minor GC 触发机制:

​ 1.当 年轻代的Eden 空间不足时,便会触发。 【特别注意的是:只有Eden区满才会触发,S区满不会触发】

​ 2.由于Java对象大多 具有 使用周期短 的 特性。因此Minor GC非常频繁,但回收速度也较快。

​ 3.Minor GC 会引发 STW。暂停其他用户的线程,等垃圾回收结束,用户线程才恢复运行。

  

Major GC 触发机制:

​ 1.老年区满时,便会触发Major GC

​ 2.当出现Major GC时,通常会伴随至少一次MInor GC。即当老年区满时,会先尝试Minor GC。在此之后空间仍然不足,则会触发Major GC

​ 3.Major GC得速度相较Minor GC会慢许多(10倍以上),STW时间更长。

​ 4.Major GC后,内存不足,则会报OOM。

  

​ Full GC触发机制:

​ 1.调用System.gc()

​ 2.老年代空间不足

​ 3.方法区空间不足

​ 4.通过Minor GC后进入老年代的平均大小 大于 老年代的可用内存

​ 5.由Eden区、From区向To区复制时,对象大小 大于To区可用内存,则会将该对象转存老年代,且老年代的可用内存小于 该对象大小。

​ -Full GC时开发或调优时尽量避免的。-

  

堆空间分代思想

​   在java开发中,不同对象的生命周期不同。但大致都是临时对象。

  

​ 为什么要进行分代?

  分代的唯一理由便是优化GC性能。

  若没有分代,则所有对象都在一起。GC时,要分辨哪些对象需要回收,则将对堆的所有区域进行扫描。而许多对象都是临时对象,将加大GC时间。

  若分代,则新创建的对象放到某一地方,而GC时,优先对临时对象的区域进行回收,则效率大大提高。

  

内存分配策略

    如果对象在Eden区出生,并通过第一次MInor GC依然存活,且能被Survivor区容纳,则将被移动到Survivor空间中,并且对象年龄将设为1. 对象每经历一次Minor GC,年龄变+1岁。到一定程度时,便晋升为老年区。【默认为15次,可通过-XX:MaxTenuringThreshold设置】

    针对不同年龄的对象分配原则:

  1. 优先分配至 Eden

  2. 大对象直接分配到老年区【即在开发时,需避免出现过多的大对象】

  3. 长期存活的对象分配到老年区。

  4. 动态对象年龄判断

    如果Survivor区中相同年龄的所有对象大小总和大于Survivor空间的一半,年龄大于或等于该年龄的对象可直接进入老年区。

  5. 空间分配担保 可通过 -XX:HandlePromotionFailure

  

为对象分配内存:TLAB

  为什么需要TLAB?

    由于堆是线程共享区域,任何的线程都可以访问堆区中的共享数据。而对象实例的创建频繁,导致在并发环境中从堆区划分内存空间是不安全的。

    为避免多个线程操作同一地址,则需要使用锁等机制,便会影响分配速度。

  什么是TLAB(Thread Local Allocation Buffer)?

      从内存模型的角度,对Eden区继续划分,JVM为每个线程分配了一个私有缓存的区域。

      此时,当多线程同时分配内存时,使用TLAB可以避免一系列线程安全问题。同时还可以提升内存分配的吞吐量。而这种内存分配方式叫作 快速分配策略。

1.并非是所有的对象实例都分配在TLAB,但JVM将TLAB作为内存分配的首选。

2.开发人员 可用过 -XX:UserTLAV设置开启TLAB空间

3.默认情况下,TLAB空间的内存非常小。可以通过-XX:TLABWasteTargetPercent设置TLAB空间在Eden的占比百分比。

4.一旦对象在TLAB空间分配内存失败时。JVM就是尝试通过 加锁机制 确保数据操作的原子性。从而直接在Eden区中分配内存。

TLAB中对象分配过程:

在这里插入图片描述

  

堆空间的整个流程:

  在发生Minor GC前,JVM会 检查老年代最大可用的连续空间 是否大于 新生代所有对象总空间。

    大于:Minor GC安全

    小于:JVM查看-XX:HandlePromotionFailure设置值是否允许担保失败。

      若为true,则继续老年代最大可用的连续空间 是否大于 历次晋升老年代的对象平均大小。

        如果大于,则尝试Minor GC,但仍有风险。

        如果小于,则进行一次Full GC。

     若为false,则进行一次Full GC

第八篇 永磁同步电机控制-MTPA、MTPV MTPA 的全称是 Maximum Torque Per Ampere,即 最大转矩电流比控制。核心思想:在输出特定转矩时,通过控制定子电流的幅值和相位(即d轴和q轴电流的分量),使得所需要的定子电流幅值最小。通俗理解:就是用“最省电”的方式产生所需要的力矩。就像开车时,找到一个最合适的油门和档位配合,使得在输出相同动力时,油耗最低。 阅读详情

相关推荐

S32K144 ADC硬件触发+DMA传输实战:从寄存器配置到数据采集全流程

本文详细解析了S32K144微控制器中ADC硬件触发与DMA传输的协同工作机制,提供了从寄存器配置到数据采集的全流程实战指南。通过PDB定时触发ADC转换,并利用DMA实现数据自动搬运,构建了高效、实时的汽车级数据采集系统,有效释放CPU资源,满足汽车电子应用的严苛要求。

weixin_29194693的博客 475

08-堆

回顾 学习jvm肯定是为了性能的优化,我们可以使用可视化工具查看项目的资源使用情况。根据资源耗费情况我们合理的规划内存的分配。如何合理的规划内存的分配这就需要学习jvm中内存的结构。要想对内存结构有更好的理解,需要知道class文件的加载过程和class文件的内容以及如何执行class文件。 栈管运行,堆管存储 堆的核心概述 堆核心概述:概述 heap 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。 Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM 管理的最大

海涛帅帅的博客 366

stm32驱动NRF24L01_原理+代码解析

NRF24L01是NORDIC公司生产的一款无线通信通信芯片,采用FSK 调制,集成NORDIC自家的Enhanced Short Burst协议。可以实现点对点或是1对6的无线通信。无线通信速度最高可达到2Mbps。①2.4G全球开放的ISM频段,免许可证使用。②最高工作速率2Mbps,高校的GFSK调制,抗干扰能力强。③126个可选的频道,满足多点通信和调频通信的需要。④内置CRC检错和点对多点的通信地址控制。⑤可设置自动应答,确保数据可靠传输。//NRF24L01寄存器操作命令。

zyc18700766982的博客 2万+

JVM学习笔记六:运行时数据区之堆

JVM 堆的知识

一条咸鱼的博客 830

GPU运维工程师入门指南 (第九篇): 高性能网络 - InfiniBand与RDMA技术

本文介绍了支撑AI分布式训练的高性能网络技术InfiniBand和RDMA。传统TCP/IP网络因内核开销和内存拷贝成为性能瓶颈,而InfiniBand提供高带宽、低延迟的专用网络,RDMA则通过内核旁路和零拷贝技术实现节点间内存直接访问,显著提升通信效率。特别介绍了GPUDirect RDMA技术,使GPU显存可直接通信。文章还列举了运维人员在部署这些技术时需要考虑的硬件、驱动、配置和监控等关键点。这些技术共同构成了支撑大规模AI集群的"数据高速公路",为后续讨论存储性能瓶颈奠定了基础

weixin_42587823的博客 1098

2025年一篇解决Windows11安装医学图像处理工具-FSL(各种问题解决,过程详细,小白轻松安装)

2025年一篇帮你解决FSl安装所有问题,包括环境安装、使用说明、常见问题,过程简单易懂,小白轻松安装。

weixin_52145255的博客 2524

JVM运行时数据区——堆

设置堆内存大小与内存溢出、新生代与老年代、对象分配过程、MinorGC、MajorGC、FullGC、堆空间分代思想、堆中对象的分配策略、为对象分配内存TLAB、堆空间参数设置、逃逸分析

码说芯语的博客 1458

Linux系统中u-boot启动流程分析(详解)

代码部分,具体如下;

嵌入式技术开发 1992

03-堆和栈

堆和栈是程序运行时内存分配的两个核心区域,用途和管理方式差异显著。栈由编译器自动管理,采用后进先出原则,分配效率高但空间有限;堆支持动态内存分配,需手动管理但灵活性更高。链表则是管理堆内存的常用数据结构,通过空闲链表记录内存块状态,实现高效分配与回收。在RTOS中,栈支撑任务独立运行,堆用于动态资源分配,而链表作为内核骨架管理任务、消息等对象,三者协同确保实时性和高效性。

weixin_52563866的博客 1046

Allegro Design Entry HDL(OrCAD Capture HDL)原理图是设计快速入门图文教程

Allegro Design Entry HDL是Cadence公司开发的原理图设计工具,也可与Allegro PCB设计工具无缝对接,虽然板级开发中不如Design Entry CIS(又名 OrCAD Capture CIS)的使用那么广泛,但是由于Design Entry HDL支持芯片的开发,所以有不少公司尤其是芯片背景公司,选择使用Design Entry HDL进行原理图设计。两个原理图开发工具的使用方法大同小异,本文简单介绍使用Allegro Design Entry HDL开始一个新的设计,

fydar的博客 4127

一种低照度目标检测新策略:IAT集成YOLOv8实现暗光与雾霾环境下的性能优化【附核心实战代码】

随着深度学习和计算机视觉的快速发展,目标检测模型在各个领域中的应用不断扩展,特别是在低照度环境下的视觉任务。YOLOv8作为当前最先进的目标检测模型之一,在高亮度和良好照明条件下表现出色,但在低照度环境下的性能存在一定的不足。为了解决这一问题,我们提出了一种轻量级的低照度图像增强网络(IAT)来改进YOLOv8的暗光检测能力。本篇文章将深入探讨这一创新改进,并附带代码实现,帮助大家更好地理解这一技术的应用和效果。

一键难忘的博客 3501

进程、线程、堆、栈

一:进程和线程的定义 (1)进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.  (2)线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。一个线程可...

sunke19920725的博客 606

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

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

JVM运行时数据区全面解析:从堆到栈

JVM运行时数据区是面试常考知识点,主要包括线程共享区和独享区。线程共享区包含堆(存放对象实例)和方法区(存储类结构信息);线程独享区包括程序计数器(记录执行位置)、虚拟机栈(存储方法调用栈帧)和本地方法栈(处理native方法)。堆是GC主要区域,方法区存放类元数据,栈帧过多或过大会引发内存溢出。工具如jps、jmap和jconsole可用于监控堆内存。理解这些核心概念有助于掌握JVM内存管理机制。

m0_56828810的博客 775

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

NTscan扫描工具

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

Java虚拟机-堆、栈、运行时数据区

Java虚拟机-堆、栈、运行时数据区 前言: 本篇文章主要讲解java(JVM)在运行期间,其运行时数据区的作用、职责与划分。包括堆内存、栈内存–虚拟机栈、本地方法栈、方法区、常量池、程序计数器等概念。 文章主要内容摘自《深入理解Java虚拟机》第三版-周志明 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。 这些区域如图所示: 1

wjy2460956668的博客 221

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

常量池在堆还是方法区_JVM运行时数据区总结

引言我们知道,JAVA的平台无关性离不开JVM,使得JAVA代码与计算机硬件和 操作系统解耦。关于JVM,贯穿了JAVA编译、执行、优化等方方面面,今天,我们先来看看JVM有哪些区域组成。运行时数据区背一下:堆、栈(虚拟机栈、本地方法栈)、程序计数器、方法区(包含常量池)。除此之外还有本地方法接口和方法库,让方法跑起来的执行引擎。这些都是干嘛的,怎么运作的?堆:存对象用的,我们new出来的对象存在...

weixin_39939993的博客 842

运行时数据区 - 堆

① 堆的核心概念 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。 Java堆区在JVM启动时就被创建,其空间大小也确定下来(允许参数设置)。是JVM管理的最大一块内存空间。 <<Java虚拟机规范>>规定,堆可以处于物理机上不连续的内存空间中,但逻辑上应该被视为连续的。 虽然所有线程共享堆,但是堆空间中还有一部分区域被划分为了线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)。这是为了提升并发效率而设计的。 如果说一个栈空

Pratik_shiku的博客 49万+

JVM运行时数据区——堆内的区域分布

JVM运行时数据区——堆内的区域分布

m0_62565675的博客 332

运行时数据区——堆

文章目录一、堆的核心概述 一、堆的核心概述 一个JVM实例

m0_45364328的博客 193

《剑指JVM》——第8章——栈、堆、方法区的交互——方法区1——运行时数据区篇21

🔥本篇概览:详细讲解了栈堆方法区的交互。🌈⭕🔥

做一个善良的人,做好自己的事,如果愿意,再发一份光。 866

JVM:运行时数据区(下)—— 堆与方法区

堆和方法区是 JVM 运行时数据区的核心组件,它们分别负责对象的存储和类的运行时信息管理。深入理解堆的结构划分、内存分配与回收策略,以及方法区的作用、运行时常量池的特性和实现方式,对于优化 Java 应用程序的性能、解决内存相关问题具有重要意义。通过合理地配置堆和方法区的参数,选择合适的垃圾回收器,可以显著提高 Java 应用程序的运行效率和稳定性。在实际开发中,我们应该根据应用程序的特点和需求,灵活运用这些知识,打造出高性能的 Java 应用。

jukuya的博客 1119

运行时数据区-程序计数器,方法区,栈,堆区

运行时数据区 线程私有区域:程序计数器、Java虚拟机栈、本地方法栈 线程共享区域:Java堆、方法区、运行时常量池 程序计数器 程序计数器是一块比较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。 如果当前线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址; 如果正在执行的是一个Native方法,这个计数器值为空。 程序计数器内存区域是唯...

weixin_43508555的博客 423

JVM运行时数据区-堆

学习Java运行时数据区中的堆内存,包括堆空间分代思想,内存分配策略,以及逃逸分析等。

m0_62946761的博客 3186

JVM虚拟机系统性学习-运行时数据区(堆)

Java 堆在 JVM 启动时创建内存区域去实现对象、数组与运行时常量的内存分配,它是虚拟机管理最大的,也是垃圾回收的主要内存区域。在幸存对象每次转移的时候,对会将对象的生存年龄 + 1,达到 15 时会放入老年代中。JVM 由三部分组成:类加载系统、运行时数据区、执行引擎。后发现,一个对象并没有逃逸出方法的话,就可能被优化为在。在 JDK1.8 中,堆由两部分组成:新生代和老年代。下边讲一下运行时数据区中的构成。,这是常见的堆外存储技术。

qq_45260619的博客 638

JVM 运行时数据区:栈、堆、方法区的分工

本文深入解析JVM运行时数据区的核心组件架构与工作原理。JVM内存模型可分为线程私有区(程序计数器、虚拟机栈、本地方法栈)和线程共享区(堆、方法区),通过人体器官类比形象展示各区域功能。重点剖析了栈帧内部结构(局部变量表、操作数栈等)、堆内存分代设计(新生代/老年代)、方法区的演进(永久代→元空间),并提供了内存健康检查与调优的实战方案。文章结合架构图、代码示例和诊断工具,全面呈现JVM内存管理机制,为性能优化提供系统性指导。

qq_43414012的博客 528

JVM面试(一)-运行时数据区(内存)、堆、方法区、直接(堆外)内存

JVM主要组成部分 JVM运行机制 运行时数据区 程序计数器 虚拟机栈 本地变量表 操作数栈 动态链接 返回地址 本地方法栈 堆 新生代 老年代 对象分配策略 TLAB 逃逸分析 方法区 永久代 元空间 常量池 运行时常量池 字符串常量池 堆外内存.........

星光之子的博客 1066

JVM 运行时数据区简介及堆与栈的区别

1、JVM运行时数据区分类 程序计数器 (Program Counter (PC) Register) JVM栈 (Java Virtual Machine Stacks) 堆内存 (Heap Memory) 方法区 (Method Area) 运行时常量池 (Run-time Constant Pool) 本地方法栈 (Native M...

Java技术交流 234
上一篇: 本地方法接口
下一篇: Git的学习
code_Floyed
博客等级 码龄7年 3粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值