首先介绍一下内存管理的五个存储区
1.堆 ----这里是由程序员控制的分配和回收的,当程序员忘记回收时,程序结束时系统会自动进行回收。
2.栈 ----这里的内存空间是由编译器分配的,里面的变量通常是局部变量,函数参数,指针等。
3.自由存储区----是那些由malloc等分配的内存块,和堆相似,不过它是由 free 来结束自己的生命。
4.全局/静态存储区----用来存储全局变量和静态变量
5.常量存储区----用来存储不能修改的常量
内存管理实际就是要求程序员对堆区的内存进行管理
1.首先Java的内存管理机制就是对象的分配和释放
分配:内存的分配是程序完成的,程序员通过new 关键字为对象申请内存空间(基本数据类型除外),对象都是在堆(Heap)中分配空间的。
释放:对象的释放是用GC(垃圾回收机制)来做的,判断是否可以回收的条件就是要监控对象是否引用或被引用等运行状况。当这个对象没有任何指针指向它,这就会被GC进行自动回收,这样有效避免了内存泄漏。
2.OC的内存管理机制
OC的内存管理不管是ARC还是MRC的模式下,它们的本质就是引用计数,只不过前者是自动管理而后者是需要程序员手动管理的。
ARC模式下,它允许用户开辟空间而不用去释放空间,实际上还是MRC, 只不过是编译器帮程序员默认添加了释放代码。正是因为这ARC模式下会添加一些额外的retain、release操作,这就是为什么ARC的性能总体上是会比MRC稍微逊色一点点。
MRC感觉就是上一个时代的东西了,内存的开辟和释放都是由程序代码控制,对程序员的要求比较高,要求程序员要非常熟悉内存的管理机制。
总结:不管是Java还是OC 他们的内存管理最最最根本的还是引用计数机制,只有在引用计数为零的时候,内存就会被系统进行回收/释放 。