内存

JVM 内存、JMM内存与集群机器节点内存的联系 本文深入解析了JVM内存模型与操作系统内存的关联机制。JVM内存由操作系统管理,其堆、方法区、栈等结构对应操作系统的不同内存区域。JMM模型定义了多线程下的内存可见性规则,主内存包含堆和方法区,线程通过工作内存交互。文章详细对比了物理内存、虚拟内存与Swap机制,并给出集群和容器环境下的内存配置建议:JVM堆内存应预留30%空间,避免Swap导致的性能问题。最后总结了常见OOM问题的解决方案,为Java应用的内存分配提供实践指导。 阅读详情

linux内存

Linux 的虚拟内存管理有几个关键概念:

1、每个进程都有独立的虚拟地址空间,进程访问的虚拟地址并不是真正的物理地址;

2、虚拟地址可通过每个进程上的页表(在每个进程的内核虚拟地址空间)与物理地址进行映射,获得真正物理地址;

3、如果虚拟地址对应物理地址不在物理内存中,则产生缺页中断,真正分配物理地址,同时更新进程的页表;如果此时物理内存已耗尽,则根据内存替换算法淘汰部分页面至物理磁盘中。

  

linux虚拟地址空间如何分布

linux使用虚拟地址空间,大大增加了进程的寻址空间,由低地址到高地址分别为:

1.只读段:该部分空间只能读,不可写;(包括:代码段、rodata段(C常量字符串和#define定义的常量) )

2、数据段:保存全局变量、静态变量的空间;

3、堆 :就是平时所说的动态内存,malloc/new 大部分都来源于此。其中堆顶的位置可通过函数 brk 和 sbrk 进行动态调整。

4、文件映射区域 :如动态库、共享内存等映射物理空间的内存,一般是 mmap 函数所分配的虚拟地址空间。

5、栈:用于维护函数调用的上下文空间,一般为8M ,可通过 ulimit –s 查看。

6、内核虚拟空间:用户代码不可见的内存区域,由内核管理(页表就存放在内核虚拟空间)。

32 位系统有4G 的地址空间::

 

      其中0x08048000~0xbfffffff (较低的3G)是用户空间,0xc0000000~0xffffffff(高的1G) 是内核空间,包括内核代码和数据、与进程相关的数据结构(如页表、内核栈)等。另外,%esp 执行栈顶,往低地址方向变化;brk/sbrk 函数控制堆顶_edata往高地址方向变化。

 

64 位系统的虚拟地址空间划分发生了改变:

1、地址空间大小不是2^32,也不是2^64,而一般是2^48。因为并不需要 2^64 这么大的寻址空间,过大空间只会导致资源的浪费。64位Linux一般使用48位来表示虚拟地址空间,40位表示物理地址,

2、其中,0x0000000000000000~0x00007fffffffffff表示用户空间, 0xFFFF800000000000~ 0xFFFFFFFFFFFFFFFF 表示内核空间,共提供256TB(2^48) 的寻址空间。

这两个区间的特点是,第 47 位与 48~63 位相同,若这些位为 0 表示用户空间,否则表示内核空间。

3、用户空间由低地址到高地址仍然是只读段、数据段、堆、文件映射区域和栈;

bss、data和rodata区别:

在采用段式内存管理的架构中(比如intel的80x86系统),bss段(Block Started by Symbol segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域,一般在初始化时bss 段部分将会清零。bss段属于静态内存分配,即程序一开始就将其清零了。比如,在C语言之类的程序编译完成之后,已初始化的全局变量保存在.data 段中,未初始化的或初始化为0全局变量保存在.bss 段中。text和data段都在可执行文件中(在嵌入式系统里一般是固化在镜像文件中),由系统从可执行文件中加载;而bss段不在可执行文件中,由系统初始化。rodata的意义同样明显,ro代表read only,即只读数据(const),rodata是在多个进程间是共享的,这可以提高空间利用率。

用户进程内存空间

    每个进程都有完全属于自己的,独立的,不被干扰的内存空间。此空间,被分成几个段(Segment),分别是Text, Data, BSS, Heap, Stack。用户进程内存空间,也是系统内核分配给该进程的VM(虚拟内存),但并不表示这个进程占用了这么多的RAM(物理内存)。

 

VM分配与释放

 

   “内存总是被进程占用”,当fork()或者exec()一个进程的时候,系统内核就会分配一定量的VM给进程,作为进程的内存空间,大小由BSS段,Data段的已定义的全局变量、静态变量、Text段中的字符直接量、程序本身的内存映像等,还有Stack段的局部变量决定。当然,还可以通过malloc()等函数动态分配内存,向上扩大heap。

 

    动态分配与静态分配,二者最大的区别在于:1. 直到Run-Time的时候,执行动态分配,而在compile-time的时候,就已经决定好了分配多少Text+Data+BSS+Stack。2.通过malloc()动态分配的内存,需要程序员手工调用free()释放内存,否则容易导致内存泄露,而静态分配的内存则在进程执行结束后系统释放(Text, Data), 但Stack段中的数据很短暂,函数退出立即被销毁。

内存管理

页

    内核把物理页作为内存管理的基本单位。尽管处理器的最小可寻址单位通常是字(甚至字节),但是,内存管理单元(MMU,管理内存并把虚拟地址转化为物理地址的硬件)通常以页为单位进行处理,因此,从虚拟内存的角度来看,页就是最小单位。在32位的系统中,一页的大小为4KB。所以,64M的物理内存将被分为16384个页。每一个物理页对应地用一个struct page来维护,注意,该结构体是用来维护物理页,而不是虚拟页,结构体记录该页是否被使用,对应的虚拟地址是多少等信息。

区

         由于硬件的限制,内核并不能对所有的页一视同仁,有一些页位于内存中特定的物理地址上,所以不能将其用于一些特定的任务,由于存在这种限制,所以内核把页分成不同的区。

如有些硬件的访问只能在24位的地址空间寻址,出于这总访问限制,linux把前16MB划分

ZONE_DMA--这个区的页只能用来执行DMA操作

ZONE_DMA32--和ZONE_DMA类似,该区包含的都是用来执行DMA操作,而和ZONE_DMA不同之处在于,这些页面只能被32位设备访问,而某些体系结构中,该区将比ZONE_DMA更大。

ZONE_NORMAL--这个区包含的都是能正常映射的页面

ZONE-HIGHMEM-高端内存,其中的页并不能永久映射到内核地址空间

1)这些分区是指linux自己分的,当然,如果普通分区不够用,当然也可以占用其他区的空间。

2)分区的大小是根据体系结构而定的,一般的ARM下,ZONE_NORMAL就是所有的可用内存区域。

slab层

    用于频繁使用的数据结构的缓存,且避免因频繁分配和使用导致的内存碎片。slab层是由高速缓存组成的,而每个高速缓存可以由多个slab组成,slab由一个或多个物理上连续的页组成。每个slab都包含一些缓存的数据结构。举个inode的例子。

  inode是磁盘文件在内存中的体现,会频繁地进行创建和释放,所以有必要进行缓存管理。在这里高速缓存是inode_cachep,它由多个slab组成,而每个slab包含尽可能多的struct inode对象。所以当我们需要一个新的inode结构时,不必现创建,只需从部分满或空的slab返回一个指向已分配但未使用的inode结构的指针即可。当内核使用完这个inode对象时,slab分配器就把该对象标记为空闲,留给后来者。

inode,中文译名为"索引节点",存储比如文件的创建者、文件的创建日期、文件的大小等等这种储存文件元信息的区域

 

 

 

内存分配的原理

 

从操作系统角度来看,进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)。

 

1、brk是将数据段(.data)的最高地址指针_edata往高地址推;

 

2、mmap是在进程的虚拟地址空间中(堆和栈中间,称为文件映射区域的地方)找一块空闲的虚拟内存。

 

     这两种方式分配的都是虚拟内存,没有分配物理内存。在第一次访问已分配的虚拟地址空间的时候,发生缺页中断,操作系统负责分配物理内存,然后建立虚拟内存和物理内存之间的映射关系。在标准C库中,提供了malloc/free函数分配释放内存,这两个函数底层是由brk,mmap,munmap这些系统调用实现的。

 

举例说明内存分配的原理:

情况一、malloc小于128k的内存,使用brk分配内存,将_edata往高地址推(只分配虚拟空间,不对应物理内存(因此没有初始化),第一次读/写数据时,引起内核缺页中断,内核才分配对应的物理内存,然后虚拟地址空间建立映射关系),  也就是说,如果用malloc分配了A这块内容,然后从来不访问它,那么,A对应的物理页是不会被分配的。

情况二、malloc大于128k的内存,使用mmap分配内存,在堆和栈之间找一块空闲内存分配(对应独立内存,而且初始化为0)。

kmalloc、vmalloc、malloc的区别

1.kmalloc和vmalloc是分配的是内核的内存,malloc分配的是用户的内存

2.kmalloc保证分配的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连续

3.内存只有在要被DMA访问的时候才需要物理上连续,vmalloc比kmalloc要慢

4. kmalloc分配内存是基于slab,因此slab的一些特性包括着色,对齐等都具备,性能较好

缺页中断

majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文名叫小错误。

当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作:

1、检查要访问的虚拟地址是否合法

2、查找/分配一个物理页

3、填充物理页内容(读取磁盘,或者直接置0,或者啥也不干)

4、建立映射关系(虚拟地址到物理地址)

重新执行发生缺页中断的那条指令

如果第3步,需要读取磁盘,那么这次缺页中断就是majflt,否则就是minflt。

 

 

 

Windows内存

基本概念

物理地址(physicaladdress):用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应。

逻辑地址(logicaladdress):是指由程序产生的与段相关的偏移地址部分。例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址,不和绝对物理地址相干。只有在Intel实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,Cpu不进行自动地址转换);逻辑也就是在Intel 保护模式下程序执行代码段限长内的偏移地址(假定代码段、数据段如果完全一样)。应用程序员仅需与逻辑地址打交道,而分段和分页机制对您来说是完全透明的,仅由系统编程人员涉及。应用程序员虽然自己可以直接操作内存,那也只能在操作系统给你分配的内存段操作。

虚拟地址(lvirtual  address):在32位系统上,虚拟地址空间可以达到4GB大小,也就是说,整个空间可以有2的32次方4294967296个字节单元。

虚拟内存:编程时我们面对的都是虚拟地址,win32中对于每个进程来说都拥有4G的虚拟内存(4G虚拟内存中,高2G内存属于内核部分,是所有进程共有的,低2G内存数据时进程独有的,每个进程低2G内存都不一样),但是需要注意虚拟地址并不是真正存在的,所以不构成任何资源损失,比如我们要在)X80000000的地方写“sga”的时候,操作系统就会将这个虚拟地址映射到一块物理地址A中,写这块虚拟地址就相当于写入物理地址A,但是假如我们申请一段1Kb的虚拟内存空间,并未读写,系统是不会分配任何物理内存的,只有当虚拟内存要使用的时候操作系统才会分配相应的物理空间。

 

内存结构

 1.进程虚拟地址空间布局:

 

     每个进程都被赋予它自己的虚拟地址空间。对于3 2位进程来说,这个地址空间是4GB,Win2K在IA-32架构的CPU下面的进程地址空间分布如下表所示:

 

                                

 

     可见Win2K的内存布局非常简单,主要有4个部分,两个不能被存取的64K;然后剩下的部分就是分别是用户空间(2G–128K)和系统空间(2G)了。

 

进程虚拟地址空间布局说明:

 

1.       64KNULL指针分配区:

 

这个分区的设置是为了帮助程序员掌握NULL指针的分配情况。如果你的进程中的线程试图读取该分区的地址空间的数据,或者将数据写入该分区的地址空间,那么C P U就会引发一个访问违规。也就是说在Win2K中,NULL的宏定义不必一定是0;可以是64K之内的任何地址;比如在win2K下面定义一个指针变量pVar;令pVar取值在0~65535(64K)之间的时候都会发生存取异常;当令pVar = 65536就没有问题了。

 

 

2.       用户空间:

在Windows 2000中,所有的. exe和DLL模块均加载这个分区。每个进程可以将这些D L L加载到该分区的不同地址中(不过这种可能性很小)。系统还可以在这个分区中映射该进程可以访问的所有内存映射文件。

 

3.       64K禁入区:

 

64K禁入区的作用很明显是隔离了用户和内核空间;防止用户程序跨越到内核空间中。

 

4.       内核空间:

 

这个分区是存放操作系统代码的地方。用于线程调度、内存管理、文件系统支持、网络支持和所有设备驱动程序的代码全部在这个分区加载。驻留在这个分区中的一切均可被所有进程共享。在Windows 2000中,这些组件是完全受到保护的。

 

 

 

2.如何分配地址空间:

 

     对一个地址空间的区域进行分配的操作称为保留( reserving)。若要使用已保留的地址空间区域,必须分配物理存储器,然后将该物理存储器映射到已保留的地址空间区域。这个过程称为提交物理存储器。物理存储器总是以页面的形式来提交的。若要将物理存储器提交给一个已保留的地址空间区域,也要调用VirtualAlloc函数。

 

    分配地址空间的两个规则:要确保保留区域从一个分配粒度的边界开始(系统自身保留地址空间时未必遵守这个约定)。x86使用64KB这个分配粒度;还要确保保留区域的大小是系统页面大小的倍数。x86使用的页面大小是4KB。

3.如何回收地址空间:

     当你的程序不再需要访问已经保留的地址空间区域时,保留区域应该被释放。这个过程称为释放地址空间的区域,它是通过调用VirtualFree函数来完成的。

     注意这节说的只是对地址空间的分配,而不是对内存的分配。已经被分配的地址空间没有和内存相对应;这时候对这块空间的读写会发生访问违规。

当你的进程中的一个线程试图访问进程的地址空间中的一个数据块时,将会发生两种情况之一,参见下图的流程图。

      在第一种情况中,线程试图访问的数据是在RAM中。在这种情况下, CPU将数据的虚拟内存地址映射到内存的物理地址中,然后执行需要的访问。

     在第二种情况中,线程试图访问的数据不在RAM中,而是存放在页文件中的某个地方。这时,试图访问就称为页面失效,CPU将把试图进行的访问通知操作系统。这时操作系统就寻找RAM中的一个内存空页。如果找不到空页,系统必须释放一个空页。如果一个页面尚未被修改,系统就可以释放该页面。但是,如果系统需要释放一个已经修改的页面,那么它必须首先将该页面从RAM拷贝到页交换文件中,然后系统进入该页文件,找出需要访问的数据块,并将数据加载到空闲的内存页面。然后,操作系统更新它的用于指明数据的虚拟内存地址现在已经映射到RAM中的相应的物理存储器地址中的表。这时CPU重新运行生成初始页面失效的指令,但是这次CPU能够将虚拟内存地址映射到一个物理RAM地址,并访问该数据块。

 

      当启动一个应用程序的时候,系统将打开该应用程序的. exe文件,确定该应用程序的代码和数据的大小。然后系统要保留一个地址空间的区域,并指明与该区域相关联的物理存储器是在. exe文件本身中。即系统并不是从页文件中分配地址空间,而是将. exe文件的实际内容即映像用作程序的保留地址空间区域。当然,这使应用程序的加载非常迅速,并使页文件能够保持得非常小。

 

4.地址空间可以和什么相对应呢?

     和地址空间相对应的只有两样东西,一个是页面文件,也就是通常所说的虚拟内存,一个是内存映射文件,内存映射文件也是磁盘上的文件,这包括exe,dll等,还包括用户自己创建的内存映射文件。或许你认为和地址空间相对应的应该是ram,不错,当我们真正对一个地址进行读写的时候,确实是对ram进行读写;但是ram只是相当于一个缓冲区;负责对内存映射文件和虚拟内存读写进行缓冲。

 

5.什么是Copy-On-Write保护属性?

 

     在保留地址空间的同时可以指定其保护属性,这些属性无法就是读,写,执行,及其组合,这里重点说一下两个特殊的保护属性。一个是PAGE_WRITECOPY,另一个是PAGE_EXECUTE_WRITECOPY。这两个属性的作用是为了节省RAM的使用量和页文件的空间。Windows支持一种机制,使得两个或多个进程能够共享单个内存块。但是这要求所有实例都将该内存视为只读或只执行的内存。如果一个实例中的线程将数据写入内存修改它,那么其他实例看到的这个内存也将被修改,从而造成一片混乱。为了防止出现这种混乱,操作系统给共享内存块赋予了Copy-On-Write保护属性。当一个.exe或DLL模块被映射到一个内存地址时,系统将计算有多少页面是可以写的(通常包含代码的页面标为PAGE_EXECUTE_READ,而包含数据的页面则标为PAGE_READWRITE)。然后,系统依照计算结果从页文件中分配内存,以防备对这些可写页面写入时的需要。当然如果不对该模块的可写页面进行实际的写入操作,那么这些页文件内存就不会被使用。

 

6.Copy-On-Write保护是如何实现的?

 

当一个进程中的线程试图将数据写入一个共享内存块时,系统就会进行干预,并执行下列操作步骤:

1)系统查找RAM中的一个空闲内存页面。

2)系统将试图被修改的页面内容拷贝到第一步中找到的页面。并将其赋予PAGE_READWRITE或PAGE_EXECUTE_READWRITE保护属性。原始页面的保护属性和数据不发生任何变化。

3)然后系统更新进程的页面表,使得被访问的虚拟地址被转换成新的RAM页面。

当系统执行了这3个操作步骤之后,该进程就可以访问它自己的内存页面的私有实例。

 

Unity内存优化之内存泄漏、内存冗余 https://blog.uwa4d.com/archives/optimzation_memory_2.html 性能优化,进无止境---内存篇(下) 阅读详情

相关推荐

内存池:申请内存与释放内存

1、内存池简介 内存池是池化技术中的一种形式。通常我们在编写程序的时候回使用 new delete 这些关键字来向操作系统申请内存,而这样造成的后果就是每次申请内存和释放内存的时候,都需要和操作系统的系统调用打交道,从堆中分配所需的内存。如果这样的操作太过频繁,就会找成大量的内存碎片进而降低内存的分配性能,甚至出现内存分配失败的情况。而内存池就是为了解决这个问题而产生的一种技术。从内存分配的概念上看,内存申请无非就是向内存分配方索要一个指针,当向操作系统申请内存时,操作系统需要进行复杂的内存管理调度之后,才

fazstyle的博客 1302

X86/X64的内存地址编址与寻址原理剖析

一、物理地址和逻辑地址 物理地址:加载到内存地址寄存器中的地址,内存单元的真正地址。在前端总线上传输的内存地址都是物理内存地址,编号从0开始一直到可用物理内存的最高端。这些数字被北桥(Nortbridge chip)映射到实际的内存条上。物理地址是明确的、最终用在总线上的编号,不必转换,不必分页,也没有特权级检查(no translation, no paging, no privilege c...

一棹春风一叶舟,一纶茧缕一轻钩 1万+

Wince程序内存和存储内存

Wince 下的内存实际上是分为三个部分的. 先说这几部分的名字,对象存储, 系统内存,程序内存. 准确来讲,应该用下面公式说明Wince内存 = 系统内存 + (对象存储 + 程序内存).这里德内存也就是我们平时说的SDRAM,而我们的平台用的64M的SDRAM。 在wince系统的控制面板系统中可以看到系统内存在30M左右,但是硬件上SDRAM明明是64M,为什么这里只有30M呢?因为wi

baggio的专栏 5091

关于内存地址与寻址

首先理解位与字节的区别: ①位(bit):计算机存储信息的最小单位。 ②字节(Byte):计算机存储信息的基本单元,1Byte = 8 bit。 bit在大多数情况都以“了解硬件的工作原理”的方式出现的,Byte才是我们真正用于存储数据的单元,换句话说,我们存储的数据是精确到Byte而不会精确到bit。 所以内存可以看做是一小块一小块字节组成的,我们进行的寻址得到的最小单元是字节! 这和操作是系统是没关系的。也就是说,字节是计算机最小可寻址的内存单元。 但是和操作系统有关的是,用什么方式来表示内存中的地址

luseysd的博客 3380

【Spark】Spark 的堆内内存和堆外内存

 今天是 520,祝大家 520 快乐。目前还是在封闭中,只能继续在家学习工作。今天学习 Spark 内存管理。 欢迎关注公众号。 作为一个 JVM 进程,Executor 的内存管理建立在 JVM 的内存管理之上,Spark 对内存的管理主要分为堆内和堆外: JVM 的堆内(On-heap)空间进行了更为详细的分配,以充分利用内存; Spark 引入了堆外(Off-heap)内存,使之可以直接在工作节点的系统内存中开辟空间,进一步优化了内存的使用; 堆内内存受到 JVM 统一管理,堆外内存是直接向操作

每天更新大数据面经和技术 2104

单细胞转录组数据分析全流程:从原始数据到细胞注释

本文详细介绍了单细胞转录组数据分析的全流程,从原始数据读取、环境搭建、数据质控与标准化,到降维聚类、细胞类型注释,以及高级质控与多样本整合。重点阐述了如何利用Seurat等工具进行数据处理,并通过标志基因比对与自动注释方法完成细胞身份鉴定,为研究者提供了一套清晰、可操作的分析指南。

coffee的博客 552

Linux 64位进程地址空间分布概况

对于Linux 64位系统,理论上,64bit内存地址可用空间为0x0000000000000000 ~ 0xFFFFFFFFFFFFFFFF(16位十六进制数),这是个相当庞大的空间,Linux实际上只用了其中一小部分(256T)。 Linux64位操作系统仅使用低47位,高17位做扩展(只能是全0或全1)。所以,实际用到的地址为空间为0x0000000000000000 ~ 0x00007FFFFFFFFFFF(user space)和0xFFFF800000000000 ~ 0xFFFFFFFFFFF

rayylee 1万+

ASME B31.3-2024工艺管道标准介绍

ASME B31.3-2024《过程管道》是ASME发布的最新版工业管道标准,适用于石油、化工、制药等行业的管道系统设计、建造和维护。该版标准进行了多项重要更新,包括软管管理、应力指数调整、新增管件类型、焊接检查和泄漏测试等条款修订,并新增了书面报告要求。标准共594页,为全球过程工业提供管道安全规范,对保障管道系统完整性、可靠性具有重要意义,被多国强制采用或推荐使用。

TXNMG的博客 4698

32位和64位操作系统的最大内存计算方法

256,用来存储基本字符(-128~127)即(1 0000 0000~0111 1111)指针调出地址后,CPU就去内存区相应位置取出对应的信息,而每个信息是1个字节大小。指针就是地址,32位就有2^32(0~2^32-1)种大小的地址,所以。1.众所周知,1B(byte字节)=8bit(比特,也叫“位”)个字节,每个字节由8个小格子(bit)并排拼在一起组成,所以是。32位操作系统的指针(指向地址)占4字节。是内存的最小信息存储单位,1个信息存储单位为1字节,多出的1个1溢出,留下全0。

qq_45569533的博客 6747

龙腾CMS downloadFile接口任意文件读取漏洞复现 [附POC]

大连网龙网络科技有限公司专注于在信息科技领域中向客户提供商业解决方案,是专业的互联网服务解决方案提供商和网络营销服务专家,为用户提供一体化的网络营销整体解决方案,龙腾CMS downloadFile接口存在任意文件读取漏洞。

薛定谔嘚喵博客 720

YOLOv11 改进 - 特征融合 | 小目标检测救星:DySample动态上采样减少特征丢失

本文介绍了超轻量且高效的动态上采样器DySample与YOLOv11的结合,以解决传统上采样器工作负载大、应用场景受限的问题。DySample从点采样角度构建上采样,绕过动态卷积,使用PyTorch标准内置函数实现,无需定制CUDA包,能大幅减少参数、FLOPs等资源消耗。我们将DySample代码集成进YOLOv11。实验脚本显示,结合DySample的YOLOv11在多个密集预测任务中或表现出色。

魔改工程师的博客 1415

Linux 64位地址存储结构

Linux 64位系统有64bit的理论存储空间,也就是8个字节,但实际情况是Linux只运用了其中的低47位,而高17位为扩展位,所以能够访问的用户空间为。:主要保存未初始化的全局变量和初始化为0的全局变量,这里要注意的是,并没有给他们申请实际的内存空间,只用占位符记录了所需要的数据大小。到此,我的疑问已经全部解决,还对之前半懂不懂的理论知识有了更加清晰的理解,之后我会更加积极的思考,努力发现问题,找到我的知识盲区。如图,我分别打印了数组地址和指向数组的指针的大小。这就是为什么地址只显示6字节的原因。

m0_67933887的博客 612

华南理工大学-大学物理实验-绪论作业

3.用公式测量某圆柱体铝的密度,测得直径=2.0420.003(cm),高=4.1260.004(cm),质量=36.4880.006(g)。计算铝的密度和测量的标准差,并以测量结果表达式表示之。(要求判别和剔除异常数据)(30分)(了解图解法的注意事项,大学物理实验众多实验数据处理采用这种方法,如PN结温度特性研究,光电效应与普朗克常数的测定,霍尔效应测磁场等等,注意规范作图)实验测得温度与对应的金属丝的长度的数据如下表所示。(了解异常数据的判断方法及具体判断过程,30分的题目n(*≧▽≦*)n)

mohen_777的博客 580

堆内存和栈内存

堆内存(heap)是区别于栈区(stack)、全局数据区和代码区的另一个内存区域。堆允许程序在运行时动态地申请某个大小的内存空间。 比较 堆内存和栈内存 在学习C程序设计语言时,会遇到两个很相似的术语:堆内存和栈内存。这两个术语虽然只有一字之差,但是所表达的意义还是有差别的,堆内存和栈内存的区别可以用如下的比喻来看出:使用堆内存就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。使用栈内存就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱和吃(使用),吃饱了就走,不必理

顺其自然~专栏 1万+

基于反事实的因果推理Causal inference based on counterfactuals--一万六千字文献详细解读(因果关系的推理应用)【全文总结】

基于反事实的因果推理Causal inference based on counterfactuals--一万六千字文献详细解读(因果关系的推理应用)【全文总结】---来自一位即将入学的准研一,也希望这篇文章能够激励自己不断走下去!!

qq_46044325的博客 4442

地方政府预算数据抓取:利用Python爬虫获取预算安排、资金分配与支出情况

爬虫是通过模拟浏览器行为,从互联网上自动获取数据的程序。在本案例中,我们将通过爬虫从地方政府的官方网站或预算公开平台抓取各类预算信息。这些信息一般以HTML网页的形式呈现,可以通过爬虫对网页内容进行解析,提取所需的预算数据。Python作为数据抓取的强大工具,凭借其简洁的语法、强大的第三方库(如requestsSelenium等)以及丰富的数据处理能力,成为了开发爬虫应用的首选语言。

2201_76125261的博客 941

JVM 内存、直接内存、系统内存、本地内存、物理内存总结

JVM 内存、直接内存、系统内存、本地内存、物理内存总结

星星的专栏 1170

通俗易懂的Harris 角点检测

点击上方“3D视觉工坊”,选择“星标”干货第一时间送达Harris 角点检测 认为特征点具有局部差异性。如何描述“特征点具有局部差异性”:以每一个点为中心,取一个窗口,窗口大小为5*5...

3D视觉工坊 1473

内存虚拟化、内存复用、大页内存作用及详解

内存虚拟化、内存复用、大页内存

背锅神童的博客 2679

STM32F407中文手册

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

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

ABAP内存和SAP内存

ABAP内存和SAP内存的区别和在程序中的使用。

博客简介 1887

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

堆内存与非堆内存

堆内存与非堆内存

weixin_40650317的博客 2165

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

内存交换,内存覆盖

(swap out)值过高时,说明系统在频繁使用 Swap,性能可能受影响。,但目的和实现方式不同。下面详细分析两者的概念、区别和应用场景。(适用于早期计算机、嵌入式系统)。在操作系统和计算机体系结构中,(如 Linux 休眠模式)。,需要手动管理代码加载顺序。,但对现代 OS 影响较小。在 Linux 系统中,(swap in)和。

zjkyeah的博客 1386

栈内存 vs 堆内存

在 C 语言中,决定是使用堆内存还是栈内存来申请内存,取决于内存的生命周期、大小需求和程序设计的需求。和各自有不同的特点和用途。

weixin_61256992的博客 1448

【JVM】内存调优——内存泄漏、内存溢出

通过发送请求向Java应用获取数据,正常情况下数据返回后,即可释放数据。当并发量很大,同时处理数据的时间长,导致大量的数据存在于内存中,导致内存溢出。jps 查看java进程,打印main方法所在类名和进程id。jmap 生成堆内存快照;

奶酪的博客 1600

内存碎片/内存空洞

内存碎片/内存空洞内存碎片: 程序长时间运行后,由于不停的malloc/free操作,尽管不存在内存泄露,但程序所占用的内存空间越来越大,有时候还会导致malloc申请失败,这就是由于内存碎片所导致。产生原因: 非mmap申请的内存,其释放,只能从堆顶开始。中间部分的内存即使通过free释放掉,但仍然是被当前程序所占用,并未彻底释放到

wwlhz的专栏 3048

stm32DMA实验(内存到内存,内存到外设,外设到内存)

stm32DMA实验

m0_68038554的博客 4572
上一篇: unicode utf8 asci 简单对比
下一篇: windows32 openssl-0.9.8a安装步骤
forevertingting
博客等级 码龄12年 6粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值