前言

内存溢出(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
原因
  1. 大量对象‌:创建大量对象,导致堆内存耗尽。

    例如,不断创建对象会导致堆内存溢出。‌

  2. 递归调用过深‌:递归调用过深,导致栈内存耗尽。

    例如,递归调用一个没有终止条件的方法会导致栈内存溢出。

场景示例
频繁创建大对象

当程序频繁创建大对象而未能及时释放时,堆内存可能会被耗尽,最终内存溢出,程序崩溃。

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();
优化

可以根据上面原因进行优化。

  1. 调节JVM虚拟机的堆内存大小,增加可用内存。

  2. 优化程序代码,避免内存泄露或过多数据占用内存。

  3. 优化算法,避免递归或大对象的频繁创建。

参考文章

  1. 内存溢出和内存泄漏的区别

  2. 内存溢出

  3. Android 应用分配的内存大小是多少

 历史上的今天

  1. AI导航
  2. 泡咖AI官网
  3. LiblibAI
  4. 触手AI
  5. 可灵AI
  6. Sora
  7. Stability AI
  8. 智谱清言
  9. 奇布塔

相关文章

暂无评论

none
暂无评论...