自动化零件服务商 - 供应SMC,FESTO,CKD全新正品气动元件
自动化零件服务商 - 供应SMC,FESTO,CKD全新正品气动元件
自动化零件服务商 - 供应SMC,FESTO,CKD全新正品气动元件

前言

内存溢出(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. 奇布塔
自动化零件服务商 - 供应SMC,FESTO,CKD全新正品气动元件

相关文章

自动化零件服务商 - 供应SMC,FESTO,CKD全新正品气动元件

暂无评论

none
暂无评论...