前言
内存溢出(Out of Memory, OOM)是指程序在运行时尝试分配内存,但由于没有足够的内存可用,导致程序无法继续运行。
这里简单总结一下内存溢出相关知识,记录于此,方便自己查阅和回顾。
正文
内存溢出
内存溢出(Out of Memory, OOM)是指程序在运行时尝试分配内存,但由于没有足够的内存可用,导致程序无法继续运行。
比如,Android设备允许单个应用占用内存为256M,此时已经占用了200M,如果后面再申请100M内存,那么就会出现内存溢出,程序就崩溃了。
单个应用内存大小
不同Android设备每个应用可使用的内存大小不一样。
# Android中查看应用可申请的内存大小 int maxHeapSize = (int) (Runtime.getRuntime().maxMemory() / 1024 / 1024);
AndroidManifest.xml可以配置应用最大占用内存大小,当然,不同的Android设备配置应用占的内存大小不一样。
android:largeHeap=”false”
默认不配置就是false
maxHeapSize = 256M
android:largeHeap=”true”
maxHeapSize = 512M
原因
大量对象:创建大量对象,导致堆内存耗尽。
例如,不断创建对象会导致堆内存溢出。
递归调用过深:递归调用过深,导致栈内存耗尽。
例如,递归调用一个没有终止条件的方法会导致栈内存溢出。
场景示例
频繁创建大对象
当程序频繁创建大对象而未能及时释放时,堆内存可能会被耗尽,最终内存溢出,程序崩溃。
List<byte[]> byteList = new ArrayList<>(); try { while (true) { byte[] byteArray = new byte[1024 * 1024]; // 创建1MB大小的字节数组 byteList.add(byteArray); } } catch (Exception e){ e.printStackTrace(); }
递归调用
递归调用时,每次方法调用都会占用一定的栈空间。
如果递归深度过大,可能导致栈内存溢出。
public static void recursiveFunction() { recursiveFunction();//一直调用自己 } //执行 recursiveFunction();
优化
可以根据上面原因进行优化。
参考文章
《》
《》
《
© 版权声明