iOS (OC 和 Swift) 获取对象实际占用的内存大小

iOS (OC 和 Swift) 获取对象实际占用的内存大小,第1张

使用 Swift 新方案: MemoryLayout

示例:

在实际测试中,用MemoryLayout的方式 计算对象时,只是返回对象的引用大小,或者说返回了指针占用的内存空间,导致返回的值总是8

对于对象实际占用的内存空间,可以通过runtime的方法来获取。

OC 中我们常用的有三种方案:

sizeof方式 并不是一个方法调用,是一个编译器特性,在编译时期,就将类型的值计算出来,它表示的是一种数据类型的大小。比如在计算对象时,计算的就是该对象的指针所占用的内存空间大小

class_getInstanceSize 获取的是 对象实际占用的内存空间大小

OC 对象开辟的内存空间,malloc_size 是系统给对象分配的空间,calloc 在开辟空间时,采用的是 16字节对齐方式。

 java中不建议直接获取字符串内存地址,因为java不像c语言,获取内存地址是C语言的强项,java的弱项。但是java内存地址还是有一个应用场景,就是判断两个字符串内存地址是否相等来判断是否是同一个对象,用双等号“==”来比较的。参考代码如下:

public class Test01 {

/

@param args

/

public static void main(String[] args) {

// TODO Auto-generated method stub

String str1="abc";

String str2=new String("abc");

Systemoutprintln(str1 == str2);//输出false

}

}

① 用GlobalMemoryStatusEx(), 不要用GlobalMemoryStatus(),MSDN上自己说的,后者可能会返回不正确的结果:

GlobalMemoryStatus can return incorrect information Use the 

GlobalMemoryStatusEx function instead

②GlobalMemoryStatusEx()的例子, MSDN上也有,(稍稍修改)转贴如下:

     MEMORYSTATUSEX statex;

      statexdwLength = sizeof (statex);

      GlobalMemoryStatusEx (&statex);

      _tprintf (TEXT("There is  %ld percent of memory in use\n"),

            WIDTH, statexdwMemoryLoad);

      _tprintf (TEXT("There are %I64d total KB of physical memory\n"),

            WIDTH, statexullTotalPhys/DIV);

      _tprintf (TEXT("There are %I64d free  KB of physical memory\n"),

            WIDTH, statexullAvailPhys/DIV);

      _tprintf (TEXT("There are %I64d total KB of paging file\n"),

            WIDTH, statexullTotalPageFile/DIV);

      _tprintf (TEXT("There are %I64d free  KB of paging file\n"),

            WIDTH, statexullAvailPageFile/DIV);

      _tprintf (TEXT("There are %I64d total KB of virtual memory\n"),

            WIDTH, statexullTotalVirtual/DIV);

      _tprintf (TEXT("There are %I64d free  KB of virtual memory\n"),

            WIDTH, statexullAvailVirtual/DIV);

  // Show the amount of extended memory available

      _tprintf (TEXT("There are %I64d free  KB of extended memory\n"),

            WIDTH, statexullAvailExtendedVirtual/DIV);    

      

    return 0;

运行结果:

There is       23 percent of memory in use

There are 33553764 total KB of physical memory

There are 25593068 free  KB of physical memory

There are 71300636 total KB of paging file

There are 63124756 free  KB of paging file

There are 2097024 total KB of virtual memory

There are 2083344 free  KB of virtual memory

There are       0 free  KB of extended memory

可以通过调用系统命令free。

获取free命令的输出值。

比如 system("free > tmptxt");

然后fopen打开tmptxt 获取输出,然后处理free的结果得到未使用内存大小。

也可以直接打开/proc/meminfo

第二行MemFree后面的数字就是free内存大小。

第二种更常用一些。

获取2G以上的内存,不太可靠,第一这受实际物理内存的限制,虽然Windows通过386的分页机制实现虚拟内存,但是超出物理内存太大的是不成功的;第二如果你用的是32位的CPU,那么你是不可能寻址4G以上的内存的,因为32位地址线最多只能寻址4G,不过某些奔腾处理器可以实现物理地址扩展,最多可以寻址36G你可能说我用的是64位的CPU啊,光有64位的CPU没用,因为64位CPU是说你可以向他提供64位的地址,可我们向他提供32位地址还是只能寻址4G,因此还要64位的 *** 作系统,现在Windows系列的64位 *** 作系统只有Vista/Win7以及XP还有个64位的版本,光有这两样没用,你还要有64位的程序,因为你向 *** 作系统提供32位地址还是4G,现在几乎没有64位的程序,开发64程序要VS2008;第三,你想在Ring3申请2G以上内存是不太可能的,因为Windows下通过分页机制使每个程序有4G内存线性地址空间,而高2G是 *** 作系统用的低2G才是给你用的,你除非在Ring0下可以申请4G,不过楼上说使用3G开关可以申请3G内存,不懂应该可以

有限制,你首先需要分清,物理内存和虚拟内存的概念。然后你需要知道什么是“虚空间”。

物理内存到虚拟内存的转换因不同

CPU

和 *** 作系统的不同而不同,而且机制过于复杂,不说了。

首先,不是说你的机器有

15G

的物理内存就可以分配到内存。为什么呢?

因为 *** 作系统对进程的内存管理首先是分配给进程一个“虚空间”,用户根本看不见物理内存,它所有的内存都从“虚空间”种分配。

比如

Windows

X86

上分配给每个进程

4G

的虚空间,这个虚空间需要软件和硬件共同实现,同样,机制过于复杂,不说了。其中

Windows

系统占用

2G,分配给用户

2G。另外

Windows

会把这个空间划分成若干个区域,malloc

的内存就来自其中的

heap

区,加入系统给你的

heap

区域是

500M,那么你只能申请总共小于

500M

的虚拟内存,而不管你的物理内存大于

500M;同样你即使只有

10M

的物理内存剩余了,一个新创建的进程照样可以分配到

500M

的虚拟空间(只要你的硬盘足够大,这个涉及到交换技术,过于复杂,不说了)。

用GlobalMemoryStatus函数,如果预计内存或者页交换文件的大小会超出4G,请使用GlobalMemoryStatusEx函数,该函数返回VOID类型,需要传递一个MEMORYSTATUS结构的地址或者指针给该函数MEMORYSTATUS结构成员的含义请查看MSDN

c++ code

#include <stdioh>

#include <windowsh>

int main()

{

MEMORYSTATUS m_MemoryStatus={0};

m_MemoryStatusdwLength=sizeof(m_MemoryStatus);

GlobalMemoryStatus(&m_MemoryStatus);

printf("本机器的物理内存为:%d字节\r\n",m_MemoryStatusdwTotalPhys);

/

GlobalMemoryStatus函数返回的物理内存数量一定会比实际内存小一点点,因为系统在启动的过程中会为非页面缓冲池保留一部分内存,甚至连内核都不能使用。具体请看MSDN

/

return 0;

}

获取JVM内存空间

系统环境:WIN

JDK版本:18re

直接调用Runtime中相应的方法即可:

publiclongmaxMemory()

Returns the maximum amount of memory that the Java virtual machine will attempt to use

If there is no inherent limit then the value LongMAX_VALUE will be returned

Returns:

the maximum amount of memory that the virtual machine will attempt to use, measured in bytes

以上就是关于iOS (OC 和 Swift) 获取对象实际占用的内存大小全部的内容,包括:iOS (OC 和 Swift) 获取对象实际占用的内存大小、java 如何获取对象内存地址、如果用c++获取内存使用情况等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/10041345.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-04
下一篇2023-05-04

发表评论

登录后才能评论

评论列表(0条)

    保存