「Android转iOS」内存区域对比
Posted 民间闲散程序员
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「Android转iOS」内存区域对比相关的知识,希望对你有一定的参考价值。
民间闲散程序员
关注
android
线程隔离区
用火车的概念来理解一下java的运行机制吧,假设一个进程就代表所有的铁路干线,一辆火车运行的线路就是一个线程。对于一条线路而言,有一些特有的资源,如下介绍。
程序计数器
程序计数器是当前线程所执行的字节码的行号指示器。字节码解释器工作时会通过改变这个计数器的指来取下一条需要执行的字节码指令。
这个好比火车到了站台时,会有一个站牌标明当前火车到哪一站了。而字节码解释器相当于调度,告诉火车司机,下一站要去哪。
Java虚拟机栈
虚拟机栈描述的是Java方法执行的内存模型,生命周期与线程相同,每个方法对应一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息
可以把这里的栈帧理解成火车的一个车厢,里面有桌子椅子,进出门口。每个车厢的摆设可能都不相同。
本地方法栈
和Java虚拟机方法栈类似,不过本地方法栈为虚拟机使用到的Native方法,有些虚拟机(譬如HotSpot)直接将本地方法栈和虚拟栈合二为一。
这个可以理解成火车里火车车厢,与上面提到的客车车厢类似,但是又都属于车厢。
以上提到的内容都属于火车一条线路特有的。也是一条线路独享的,不可能所有的列车共用一个车厢,共用一个指示站牌。
线程共享的数据区
除了线程隔离区,还有一些内容是在非线程隔离区,怎么理解非线程隔离区呢,就是这里的资源是共享的,好比有些资源是所有火车共享的。
Java堆
Java堆在虚拟机启动时创建,它的目的是存放对象实例,它也是垃圾收集器管理的主要区域。Java堆可以处于物理上不连续的内存空间中,只要逻辑上连续即可,在实现上,既可以实现成固定大小的,也可以是可扩展的。
这部分好比是铁道部规划部门,不管你是哪条线路,都要从铁道部中获取资源和信息。
方法区
用于存储类加载的信息,即时编译后的代码,不需要连续的内存,也可以存储一些常量。
这部分相当于铁道部的后勤部门,管理所有火车的固定要用的东西。
ios
栈区
相当于java的虚拟机栈+本地方法栈,由编译器自动分配并释放,存放函数的参数值,局部变量等。
堆区
相当于java堆,ios中new出来的对象或者调用alloc生成的对象,都会放到堆上,这个特性恰恰对应了java堆中国存放对象实例,与其意思差不多。
全局区
这个有点像java的方法区,java的方法区中有class和static变量。iOS的全局区存放全局和静态变量,不同的是它分成了两块,一块存储初始化的变量,一块存储未初始化的变量
常量区
又称文字常量区,存放常量字符串,程序结束后由系统释放。可能会有人质疑这个和全局区有什么区别。全局区存储的是静态和全局变量如:
static int c = 0
常量区是指:
char *p = "12345"
这个12345就是在常量区。
Java String常量存储在常量池内,也就是方法区。这样做的目的是在常量区始终有个”12345”,不管声明了多少个常量等于”12345“都是指向这里,除非使用了new或者alloc。
代码区
代码区主要用来存储函数的二进制代码,在java中,java是解释执行的,即时编译器编译后的代码都会放在方法区,从这种意义上讲代码区应该也对应方法区。
• end •
作者 | mymdeep
以上是关于「Android转iOS」内存区域对比的主要内容,如果未能解决你的问题,请参考以下文章
java内存流:java.io.ByteArrayInputStreamjava.io.ByteArrayOutputStreamjava.io.CharArrayReaderjava.io(代码片段