【OC底层】一个OC对象占用多少内存?
查看一个NSObject对象占用多少内存
1、引入头文件:
#import <objc/runtime.h>
#import <malloc/malloc.h>
2、代码如下:
NSObject* obj = [[NSObject alloc]init];
// 获取实例对象至少需要分配的内存大小,实际真正占用的大小,8 字节
size_t insSize = class_getInstanceSize([NSObject class]);
NSLog(@"NSObject Size:%zd",insSize);
// 同上
insSize = class_getInstanceSize([obj class]);
NSLog(@"NSObject Size:%zd",insSize);
// 获取实际分配内存大小,最终分配的大小,16 字节
size_t mSize = malloc_size((__bridge const void *)obj);
NSLog(@"malloc Size:%zd",mSize);
// 通过OC的源码可以看出配置对象内存至少有 16字节
1>、通过 class_getInstanceSize 可以获取类对象实际占用的大小
2>、通过 malloc_size 实际分配内存大小,最终分配的大小
如下是OC的源码,可以看得出如果分配的内存小于16的话会直接设置为16

可以通过内存查看工具来验证上面的说法:
进入Debug模式,通过 Debug -> Debug Workfllow -> View Memory (Shift + Command + M) 可以打开内存查看工具
1、进入调试模式,断点代码后,通过 po 对象,可以查看对象对应的地址
(lldb) po obj
<NSObject: 0x1002013d0>
2、在下面Address输入框输入要查看的内存地址,回车就可查看

通过上面的截图可以看到被选中的那个8个字节都是00,都是空的,说明根本就没有用到,实际只用到了前面的8字节
为什么就可以这么肯定它占用了16个字节呢?因为可以看出00后面就是 03 00 00 00 了,系统内存分配都是连续一段的,中间是不会有间隙的,所以可以确定系统就是分配了 16个字节
3、也可以通过 x 命令来查看,命令如下:
(lldb) x 0x1002013d0 0x1002013d0: f1 f0 7c ff ff 1d 00 00 00 00 00 00 00 00 ..h|............ 0x1002013e0: ...............
一样可以看得出后8位都是00
查看自定义对象的内存占用大小
@interface XGPerson : NSObject @property (nonatomic,assign) int age;
@property (nonatomic,assign) int height;
@property (nonatomic,assign) int row; @end @implementation XGPerson @end
像上面这个对象,里面有3个属性,都是int ,每个int类型是占4字节的,具体其它类型占多少可以去查官方文档
同过如下代码进行测试:
XGPerson* obj = [[XGPerson alloc]init];
obj.age = ;
obj.height = ;
obj.row = ; // 输出:24字节
size_t insSize = class_getInstanceSize([XGPerson class]);
NSLog(@"XGPerson Size:%zd",insSize); // 输出:32字节
size_t mSize = malloc_size((__bridge const void *)obj);
NSLog(@"malloc Size:%zd",mSize);
再通过上面说的那种内存查看方法去看看内存
(lldb) po obj
<XGPerson: 0x100602ed0> (lldb) x 0x100602ed0
0x100602ed0: d9 12 00 00 1d 04 00 00 00 05 00 00 00 ................
0x100602ee0: 06 00 00 00 ................
通过内存打印,可以看得出3个属性分别各自占用了4个字节,总共是24个,那为什么 malloc_size 会输出32个呢?
原因就是系统底层的内存对齐导致的 (内存对齐好像分配的16的倍数,像24不是16的倍数,所以被分配32,不知道我理解的对不对,请各位大神指点!)
通过上面这个输出日志可以看得出,如果我们这个XGPerson只有2个属性,那它的分配大小和实际占用大小应该都是16,因为NSObject对象默认只用到了前8个字节
所以只有当有3个属性的时候才会变成32个字节。
-----------------------------
本文参考借鉴MJ的教程视频,非常感谢.
【OC底层】一个OC对象占用多少内存?的更多相关文章
- [转]new一个Object对象占用多少内存?
我们分解下ArrayList arr = new ArrayList();等同于ArrayList arr = null;//初始化arr = new ArrayList();//实例化这两个过程.初 ...
- new一个Object对象占用多少内存?
Java的自动内存管理机制省却了很多编码工作,大大地提高了Java的生产力,而且JVM的性能也越来越好,特别是G1的出现,改善了垃圾回收中stop the world的状况. 也许很多人都没有考虑过这 ...
- 探索一个NSObject对象占用多少内存?
1 下面写代码测试探索NSObject的本质 Objective-C代码,底层实现其实都是C\C++代码 #import <Foundation/Foundation.h> int mai ...
- 高端面试必备:一个Java对象占用多大内存
这个问题一般会出现在稍微高端一点的 Java 面试环节.要求面试者不仅对 Java 基础知识熟悉,更重要的是要了解内存模型. Java 对象模型 HotSpot JVM 使用名为 oops (Ordi ...
- java.lang.instrument: 一个Java对象占用多少字节?
一.对象头包括两部分信息:Mark Word(标记字段)和 Klass Pointer(类型指针) 1. Mark Word 用于存储对象自身的运行时数据,如哈希码(HashCode).GC分代年 ...
- python统计某一个进程名所占用的内存
设计思路: 通过python,执行cmd中tasklist命令,获取要统计的进程的相关信息:通过正则表达式,查找出进程名称.进程pid.内存使用,然后打印出来. 作为pythoner,有时候需要统计p ...
- 【OC底层】OC对象本质,如 isa, super-class
Objective-C的本质 1.我们编写的Objective-C,底层现实都是C/C++,代码生成步骤如下: 2.在OC中的所有面向对象的实现,都是基于C/C++的数据结构实现的 3.将Obje ...
- 如果对象的引用被置为null,;垃圾回收器是否会立即释放对象占用的内存?
不会,在下一个垃圾回调周期中,这个对象将是被可回收的. 也就是说并不会立即被垃圾收集器立刻回收,而是在下一次垃圾回收时才会释放其占用的内存.
- 如何获取一个Java对象所占内存大小
新建一个maven工程 我们先在IDEA中新建一个名为ObjectSizeFetcherAgent的maven工程,如下图: 在maven项目中的pom.xml中新增一个打jar包的插件,如下: &l ...
随机推荐
- ES6 模块化与 CommonJS 模块化
ES6 模块化 import命令用于输入其他模块提供的功能;export命令用于规定模块的对外接口. export 可以有多个,export default 仅有一个 a.js 模块a文件 导出多个方 ...
- 01Jenkins环境准备
01.硬件环境 Linux 64位(windows环境类似) 02.安装JDK a) 标题链接到Oracle官网下载jdk-8u144-linux-x64.rpm b) 将jdk拷贝到Linux的/t ...
- Python爬虫框架Scrapy教程(1)—入门
最近实验室的项目中有一个需求是这样的,需要爬取若干个(数目不小)网站发布的文章元数据(标题.时间.正文等).问题是这些网站都很老旧和小众,当然也不可能遵守 Microdata 这类标准.这时候所有网页 ...
- js脚本快速评课----中科大教务系统
git地址:https://github.com/hzphzp/js_ustc_mis_teach 代码 for(var i = 1; i < document.getElementsByTag ...
- ubuntu下面解压tar.gz包报错:tar命令报错: gzip: stdin: not in gzip format tar: Child returned status 1 tar: Error
原因: 压缩包文件不完整(损坏或者其他原因) 比如今天下载的tomcat8,使用ubuntu的命令下载的 curl -O http://apache.mirrors.ionfish.org/tomca ...
- 沉淀再出发:java的文件读写
沉淀再出发:java的文件读写 一.前言 对于java的文件读写是我们必须使用的一项基本技能,因此了解其中的原理,字节流和字符流的本质有着重要的意义. 二.java中的I/O操作 2.1.文件读写的本 ...
- 【重构.改善既有代码的设计】14、总结&读后感
14.总结 首先,这是一本太老的书,很多观点已经被固化或者过时了.但核心观点没有问题,虽然大多数观点已经被认为是理所当然的事情了. 重构的定义 重构分几种: 1.狭义的代码重构 就是本书讲的, ...
- HTTP协议图--HTTP 工作过程
HTTP请求响应模型 HTTP通信机制是在一次完整的 HTTP 通信过程中,客户端与服务器之间将完成下列7个步骤: 建立 TCP 连接 在HTTP工作开始之前,客户端首先要 ...
- 英语的各种 n. adj. vt. vi. 等词性解释
n. 名词 v. 动词(既可作及物动词,也可作不及物动词的就用这个表示) pron. 代词 adj. 形容词(后接名词) adv. 副词(修饰动词.形容词或其他副词) abbr. (这是一个缩写符号) ...
- Python数据类型-字典
字典(dict) 字典是key:value形式的一种表达形式,例如在Java中有map,JavaScript中的json,Redis中的hash等等这些形式.字典可以存储任意的对象,也可以是不同的数据 ...