您的位置:首页 > 移动开发 > Android开发

java 、android内存相关

2015-07-17 17:43 411 查看
一、硬件知识补充

1、冯.诺依曼体系结构



2、CPU(中央处理器)

功能:解释计算机指令以及处理计算机软件中的数据

构成:以前CPU主要由运算器和控制器两大部分组成,随着集成电路的发展,目前CPU芯片集成了一些其它逻辑功能部件来扩充CPU的功能,如浮点运算器、cache和MMX等

控制器的组成和功能 控制器由程序计数器、指令寄存器、指令译码器、时序产生器和操作控制器组成。它是计算机指挥系统,完成计算机的指挥工作


运算器的组成和功能 运算器由算术逻辑单元(ALU)、累加寄存器、数据缓冲寄存器和状态条件寄存器组成,它是数据加工处理部件,完成计算机的各种算术和逻辑运算

寄存器

寄存器是中央处理器内的组成部份。它跟
CPU
有关。寄存器是有限存贮容量的高速存贮部
件,它们可用来暂存指令、数据和位址。
在中央处理器的控制部件中,
包含的寄存器有指令
寄存器
(IR)
和程序计数器
(PC)
。在中央处理器的算术及逻辑部件中,包含的寄存器有累加器
(ACC)

3、电脑中的存储层

寄存器–可能是最快的访问,但仅仅只有几百个字节。 —— 存在于CPU中,是CPU的一部分
第一级(L1)高速缓存–通常访问只需要几个周期,通常是几十个KB。—— 集成在CPU内

第二级(L2)高速缓存–比L1约有2到10倍较高延迟性,通常是几百个KB或更多。—— 集成在CPU上或者主板上

第三级(L3)高速缓存–(不一定有)比L2更高的延迟性,通常有数MB之大。

主存DRAM)–访问需要几百个周期,但可以大到数个GB。

磁盘存储–需要成千上百个周期,但是容量非常的大。

备注:Cache存储器:电脑中为高速缓冲存储器,是位于CPU和主存储器DRAM(DynamicRandonAccessMemory)之间,规模较小,但速度很高的存储器,通常由SRAM(StaticRandomAccessMemory静态存储器)组成。它是位于CPU与内存间的一种容量较小但速度很高的存储器。CPU的速度远高于内存,当CPU直接从内存中存取数据时要等待一定时间周期,而Cache则可以保存CPU刚用过或循环使用的一部分数据,如果CPU需要再次使用该部分数据时可从Cache中直接调用,这样就避免了重复存取数据,减少了CPU的等待时间,因而提高了系统的效率。Cache又分为L1Cache(一级缓存)和L2Cache(二级缓存),L1Cache主要是集成在CPU内部,而L2Cache集成在主板上或是CPU上。

二、java内存分配

Java程序运行在JVM(Java Virtual Machine,Java虚拟机)上,可以把JVM理解成Java程序和操作系统之间的桥梁,JVM实现了Java的平台无关性。所以在学习Java内存分配原理的时候一定要牢记这一切都是在JVM中进行的,JVM是内存分配原理的基础与前提。

简单通俗的讲,一个完整的Java程序运行过程会涉及以下内存区域:

l 寄存器:JVM内部虚拟寄存器,存取速度非常快,程序不可控制。

l 栈:保存局部变量的值,包括:1.用来保存基本数据类型的值;2.保存类的实例,即堆区对象的引用(指针)。也可以用来保存加载方法时的帧。

l 堆:用来存放动态产生的数据,比如new出来的对象。注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一次。

l 常量池:JVM为每个已加载的类型维护一个常量池,常量池就是这个类型用到的常量的一个有序集合。包括直接常量(基本类型,String)和对其他类型、方法、字段的符号引用(1)。池中的数据和数组一样通过索引访问。由于常量池包含了一个类型所有的对其他类型、方法、字段的符号引用,所以常量池在Java的动态链接中起了核心作用。常量池存在于堆中

l 代码段:用来存放从硬盘上读取的源程序代码。

l 数据段:用来存放static定义的静态成员。

下面是内存表示图:





三、JVM

每当使用java命令执行一个类时,实际上都会启动一个jvm实例,不同的程序,将得到不同的虚拟机实例!
每一个JVM实例实际上就是在操作系统中启动一个进程,java本身具备了垃圾回收机制,所以每个java运行时至少会启动两个线程,一个main线程,另外一个是垃圾回收机制。

Tomcat启动一次(一个进程)创建一个JVM,所有的Web应用在同一个JVM中跑。一个应用弄垮了JVM则所有应用都跨

一台机上上启动JVM数量没有限制的,对于每一个java可执行程序来说操作系统中都会有一个对应的jvm的,当然也可以在同一个jvm中运行多个java程序。


四、Dalvik

一个应用,一个虚拟机实例,一个进程!!!

每一个Android应用都运行在一个Dalvik虚拟机实例里,而每一个虚拟机实例都是一个独立的进程空间。每个进程之间可以通信(IPC,Binder机制实现)。虚拟机的线程机制,内存分配和管理,Mutex等等都是依赖底层操作系统而实现的。

不同的应用在不同的进程空间里运行,当一个虚拟机关闭或意外中止时不会对其它 虚拟机造成影响,可以最大程度的保护应用的安全和独立运行。
当一个activity执行onDestroy方法的时候,activity占用的内存不会立刻回收,等待GC回收
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: