一个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 实际分配内存大小,最终分配的大小

可以通过内存查看工具来验证上面的说法:

进入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 68 7c ff ff 1d 00 00 00 00 00 00 00 00 00  ..h|............

0x1002013e0: 03 00 00 00 00 01 00 00 00 36 80 02 01 00 00 00  .........6......

一样可以看得出后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 = 4;
        obj.height = 5;
        obj.row = 6;

        // 输出: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 01 80 1d 00 04 00 00 00 05 00 00 00  ................
0x100602ee0: 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

通过内存打印,可以看得出3个属性分别各自占用了4个字节,总共是24个,那为什么 malloc_size 会输出32个呢?

原因就是系统底层的内存对齐导致的 (内存对齐好像分配的16的倍数,像24不是16的倍数,所以被分配32,不知道我理解的对不对,请各位大神指点!)

通过上面这个输出日志可以看得出,如果我们这个XGPerson只有2个属性,那它的分配大小和实际占用大小应该都是16,因为NSObject对象默认只用到了前8个字节

所以只有当有3个属性的时候才会变成32个字节。

原文地址:https://www.cnblogs.com/xgao/p/9707389.html

时间: 2024-11-10 14:01:34

一个OC对象占用多少内存?的相关文章

new一个Object对象占用多少内存?

/***************************************************  * TODO: description .  * @author: gao_chun  * @since:  2015-4-2  * @version: 1.0.0  * @remark: 转载请注明出处  **************************************************/ Java的自动内存管理机制省却了很多编码工作,大大地提高了Java的生产力,而且

探索一个NSObject对象占用多少内存?

1 下面写代码测试探索NSObject的本质 Objective-C代码,底层实现其实都是C\C++代码 #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... NSObject *obj = [[NSObject alloc]init]; } return 0; } 把Objective-C代码 转换成C++代码

JAVA内存使用--如何计算一个Java对象占用的字节数

本文中,我们讨论一个问题:如何计算(或者说,估算)一个Java对象占用的内存数量? 通常,我们谈论的堆内存使用的前提是以"一般情况"为背景的.不包括下面两种情形: 某些情况下,JVM根本就没有把Object放入堆中.例如:原则上讲,一个小的thread-local对象存在于栈中,而不是在堆中. 被Object占用内存的大小依赖于Object的当前状态.例如:Object的同步锁是否生效,或者,Object是否正在被回收. 我们先来看看在堆中单个的Object长什么样子 在堆中,每个对象

java对象的内存布局(一):计算java对象占用的内存空间以及java object layout工具的使用

最近在学习java对象内存布局方面的一些知识,主要是想知道一个java对象到底占用多少内存空间,以及java对象在内存中到底是什么样子的.c/c++中的sizeof运算符能够方便地告诉我们一个变量占用的内存空间,但是在java中却没有直接提供这种机制.如果想获取java对象占用的内存大小,可以利用java的Instrumentation机制.java.lang.instrument.Instrumentation这个接口提供了getObjectSize(Object objectToSize),

如何获取一个Java对象所占内存大小

新建一个maven工程 我们先在IDEA中新建一个名为ObjectSizeFetcherAgent的maven工程,如下图: 在maven项目中的pom.xml中新增一个打jar包的插件,如下: <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId&g

获取JAVA对象占用的内存大小

介绍两种获取JAVA对象内存大小的方法. 第一种:Instrumentation 简介: 使用java.lang.instrument 的Instrumentation来获取一个对象的内存大小.利用Instrumentation并且通过代理我们可以监测在JVM运行的程序的功能,它的原理是修改方法的字节码. 首先创建代理类 package com.dingtongblog.size; import java.lang.instrument.Instrumentation; public class

一个java对象占多少内存空间

最近在做flex,需要封装一个事件单pojo对象进行展现.想想数据库里6000多条记录,封装多了肯定会占用很大内存,并且flex对象完全是从java对象传递过来再次封装的,也就是两倍的内存量.所以有了标题的考虑,那么一个java pojo对象到底占多少内存呢.如下题所示: Object o=new Object(): 在java中空对象占八个字节,对象的引用占四个字节.所以上面那条语句所占的空间是4byte+8byte=12byte.java中的内存是以8的倍数来分配的,所以分配的内存是16by

一个Objective-C对象如何进行内存布局?(考虑有父类的情况)

所有父类的成员变量和自己的成员变量都会存放在该对象所对应的存储空间中 父类的方法和自己的方法都会缓存在类对象的方法缓存中,类方法是缓存在元类对象中 每一个对象内部都有一个isa指针,指向他的类对象,类对象中存放着本对象的如下信息 对象方法列表 成员变量的列表 属性列表 每个 Objective-C 对象都有相同的结构,如下图所示 Objective-C 对象的结构图 ISA指针 根类(NSObject)的实例变量 倒数第二层父类的实例变量 ... 父类的实例变量 类的实例变量 根类对象就是NSO

一个Java对象到底占多大内存?(转)

最近在读<深入理解Java虚拟机>,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存? 在网上搜到了一篇博客讲的非常好:http://yueyemaitian.iteye.com/blog/2033046,里面提供的这个类也非常实用: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35