内存泄漏是垃圾内存无法释放回收,所占据的内存
内存泄漏是一种主观的人为的失误
如果某对象被别的对象引用,就不能被回收了吗?
答:否,1,无法往上追溯到gcroot引用点的,2,软引用,弱引用,虚引用
堆:(对象)
引用类型的变量,其内存分配在堆上或者常量池(字符串常量、基本数据类型常量),需要通过new等方式来创建。
堆内存主要作用是存放运行时创建(new)的对象。
(主要用于存放对象,存取速度慢,可以运行时动态分配内存,生存期不需要提前确定)
栈:(基本数据类型变量、对象的引用变量)
基本数据类型的变量(int、short、long、byte、float、double、boolean、char等)以及对象的引用变量,其内存分配在栈上,变量出了作用域就会自动释放。栈内存的主要作用是存放基本数据类型和引用变量。栈的内存管理是通过栈的"后进先出"模式来实现的。
(主要用来执行程序,存取速度快,大小和生存期必须确定,缺乏灵活性)
static对象比activity生命周期要长,说以尽量使用applicationcontext在外部引用
查询内存使用情况:adb shell dumpsys meminfo com.fs.location -d ->eclipse(open heap dump...)打开文件
profiler查询内存使用:
profiler->memory->GC(删除)->获取日志->arrange by package->下载日志到本地 ->转化为MAT可使用命令 hprof-conv -z 本地源文件路径 本地新文件路径 ->
histogram->merge shortest paths to gc roots -> exclude all phantom /weak/soft/reference