OOM:
内存泄露可以引发很多的问题:
1.程序卡顿,响应速度慢(内存占用高时JVM虚拟机会频繁触发GC)
2.莫名消失(当你的程序所占内存越大,它在后台的时候就越可能被干掉,反之,内存占用越小,在后台存在的时间就越长)
3.直接崩溃(OutOfMemoryError)
Android内存面临的问题:
1.有限的堆内存,原始只有16M
2.内存大小消耗等根据设备,操作系统等级,屏幕尺寸的不同而不同
3.程序不能直接控制
4.支持后台多任务处理
5.运行在虚拟机之上
5R:
本文主要通过如下的5R方法来对Android内存进行优化:
1.Reckon(计算)
首先需要知道你的app所消耗内存的情况,知己知彼才能百战不殆
2.Reduce(减少)
消耗更少的资源
3.Reuse(重用)
当第一次使用完以后,尽量给其他的使用
4.Recycle(回收)
返回资源给生产流
5.Review(检查)
回顾检查你的程序,看看设计或代码有什么不合理的地方。
内存简介:
RAM随机存取存储器,说白了就是内存
一般Java在内存分配时会涉及到一下区域:
寄存器:速度最快的存储场所,因为寄存器位于处理器内部,我们在程序中无法控制
栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中
堆:堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器(GC)来管理。
静态域:静态存储区域就是指在固定的位置存放应用程序运行时一直存在的数据,Java在内存中专门划分了一个静态存储区域来管理一些特殊的数据变量如静态的数据变量
常量池:虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集合,包括直接常量和其他类型,字段和方法的符号引用。
非RAM存储:硬盘等永久存储空间
堆栈特点对比:
栈:当定义一个变量时,Java就在栈中为这个变量分配内存空间,当该变量退出该作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。
堆:当堆中的new产生数组和对象超出其作用域后,他们不会被释放,只有在没有引用变量指向他们的时候才变成垃圾,不能再被使用。即使这样,所占内存也不会立即释放,二是等待被垃圾回收器收走,这也是Java比较占用内存的原因。
栈:存取速度比堆要快,仅次于寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
堆:堆是一个运行时数据区,可以动态的分配内存大小,因此存取速度较慢,也正因为这个特点,堆的生存期不必事先告诉编译器,而且Java的垃圾收集器会自动收走这些不再使用的数据。
栈:栈中的数据可以共享,他是由编译器完成的,有利于节省空间。
堆:在堆中一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。