Java引用类型
Java数据类型分为基本数据类型(如 int, byte)、引用数据类型(如 String),基本数据类型直接存储在堆内存中,引用数据类型的存储包括堆内存与栈内存,该类型的对象存储在栈内存中,对象的引用存储在堆内存中。
Java引用数据类型包括一下4种:
- 强引用(StrongReference):默认的类型,也是最常见的引用类型,强引用的类型不会被GC回收;
- 软引用(SoftReference):当内存充足时,不会被回收,当内存不足时,会回收,正因为软引用的这个特性,其适合做一些缓存处理。
- 弱引用(WeakReference):无论内存是否充足,GC时一定会被回收;
- 虚引用(PhantomReference):无法通过虚引用访问对象,虚引用等于没有引用。
Android 应用内存
当使用强引用导致堆内存过大, 超过系统阀值时,因其不可回收,Android会直接OOM.
Android设备的内存可以通过 /proc/meminfo
查看。
Android 设备分配给应用的堆内存大小,可以通过代码获取
public void getHeapMemoryInfo() {
ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
int largeMemory = am.getLargeMemoryClass();
int memory = am.getMemoryClass();
Logger.d("large memory:" + largeMemory);
Logger.d("memory:" + memory);
}
通过清单文件中的 largeheap=true可以申请到更大的堆内存,但在一些严格限制的机型上,不一定有效。
Android 内存泄漏分析
- MAT
- LeakCanary
~~~~~~~~困了,有空再写吧