Java——SOF 与 OOM

1. SOF (堆栈溢出 StackOverflow)

StackOverflowError 的定义: 当应用程序递归太深而发生堆栈溢出时,抛出该错误。
因为栈一般默认为1-2m,一旦出现死循环或者是大量的递归调用,在不断的压栈过程中,造成栈容量超过1m而导致溢出。

栈溢出的原因:

  • 递归调用
  • 大量循环或死循环
  • 全局变量是否过多数组、List、map数据过大

2. Android的OOM(Out Of Memory)

当内存占有量超过了虚拟机的分配的最大值时就会产生内存溢出(VM里面分配不出更多的page)。

一般出现情况:

  • 加载的图片太多或图片过大时
  • 分配特大的数组
  • 内存相应资源过多没有来不及释放。

解决方法:

  1. 在内存引用上做处理
    软引用是主要用于内存敏感的高速缓存。在jvm报告内存不足之前会清除所有的软引用,这样以来gc就有可能收集软可及的对象,可能解决内存吃紧问题,避免内存溢出。什么时候会被收集取决于gc的算法和gc运行时可用内存的大小。
  2. 对图片做边界压缩,配合软引用使用
  3. 显示的调用GC来回收内存
if(bitmapObject.isRecycled()==false) //如果没有回收   
         bitmapObject.recycle();  
  1. 优化Dalvik虚拟机的堆内存分配

1.增强程序堆内存的处理效率

//在程序onCreate时就可以调用 即可 
private final static floatTARGET_HEAP_UTILIZATION = 0.75f;  
VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION); 

2 .设置堆内存的大小

//在程序onCreate时就可以调用 即可 
private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ; 
 //设置最小heap内存为6MB大小 
VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); 
  1. 用LruCache 和 AsyncTask<>解决
    从cache中去取Bitmap,如果取到Bitmap,就直接把这个Bitmap设置到ImageView上面。 如果缓存中不存在,那么启动一个task去加载(可能从文件来,也可能从网络)。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yawn__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值