现在的位置: 首页 > 综合 > 正文

android 内存管理

2018年06月09日 ⁄ 综合 ⁄ 共 1622字 ⁄ 字号 评论关闭

一、内存管理

概述

android的开发中,要时刻主要内存的分配和垃圾回收,因为系统为每一个dalvik虚拟机分配的内存是有限的,在googleG1中,分配的最大堆大小只有16M,后来的机器一般都为24M,实在是少的可怜。这样就需要我们在开发过程中要时刻注意。不要因为自己的代码问题而造成OOM错误。

JAVA的内存管理

大家都知道,android应用层是由java开发的,androiddavlik虚拟机与jvm也类似,只不过它是基于寄存器的。因此要了解android的内存管理就必须得了解java的内存分配和垃圾回收机制。

java中,是通过new关键字来为对象分配内存的,而内存的释放是由垃圾收集器(GC)来回收的,工程师在开发的过程中,不需要显式的去管理内存。但是这样有可能在不知不觉中就会浪费了很多内存,最终导致java虚拟机花费很多时间去进行垃圾回收,更严重的是造成JVMOOM。因此,java工程师还是有必要了解JAVA的内存分配和垃圾回收机制。

  1. 内存结构

上面这张图是JVM的结构图,它主要四个部分组成:Class Loader子系统和执行引擎,运行时方法区和本地方法区,我们主要来看下RUNTIME
DATA AREA
区,也就是我们常说的JVM内存。从图中可以看出,RUNTIMEDATA AREA区主要由5个部分组成:

  • 方法区(Method Area):存放类信息,如类方法、变量信息,静态变量、final类型变量、属性和方法信息
  • 堆(Heap):通过new创建的对象内存都在堆中分配
  • 栈(java stack):执行方法时,在栈中申请一个栈帧,这一个栈帧里包括:局部变量区和操作数栈。用来存放方法调用过程中的临时变量、参数和中间结果。 java虚拟机直接对java栈进行两种操作,以帧为单位的压栈和出栈。
  • JVM内存组成结构
  • 本地方法栈(native method stack):用于支持native方法的执行,存储了每个native方法调用的状态,就是分配JNI调用内存
  • 程序计数器:对应用计数

 

堆内存释放条件:对new一个对象,分配了堆内存,在栈中会有一个引用,以便程序使用该对象,同时程序计数器会对该对象的引用计数,每引用一次,引用计数器加1,当一个引用离开了它的生命周期则引用计数减1,如果一个引用使用完一个对象,但一直没离开它的生命周期,就会OOM,所以要主动置null;当一个对象的引用技术为0时,就符合被GC的条件。

二、深入理解JVM堆与JVM栈

JVM栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;JVM堆解决的是数据存储的问题,即数据怎么放、放在哪儿,另外JVM堆中存的是对象。JVM栈中存的是基本数据类型和JVM堆中对象的引用。

JVM基础概念:JVM堆与JVM栈

数据类型

Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。

基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress

引用类型包括:类类型,接口类型和数组。

JVM堆与JVM栈

JVM堆和JVM栈是程序运行的关键,很有必要把他们的关系说清楚。

JVM堆和JVM栈

JVM栈是运行时的单位,而JVM堆是存储的单位。

JVM栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;JVM堆解决的是数据存储的问题,即数据怎么放、放在哪儿。

在Java中一个线程就会相应有一个线程JVM栈与之对应,这点很容易理解,因为不同的线程执行逻辑有所不同,因此需要一个独立的线程JVM栈。而JVM堆则是所有线程共享的。JVM栈因为是运行单位,因此里面存储的信息都是跟当前线程(或程序)相关信息的。包括局部变量、程序运行状态、方法返回值等等;而JVM堆只负责存储对象信息。

 

抱歉!评论已关闭.