android内存--强弱软虚

为什么要进行内存优化?.app运行内存限制,OOM导致app崩溃;app流畅性、相应速度和用户体验和内存息息相关。
android的内存管理方式:

  • android系统内存分配与回收方式:每个app对应一个linux进程,在一个虚拟机下运行。
    cmd ->adb shell 命令行模式下用ps命令可以看到所有正在运行的进程。GC只在Heap剩余空间不够时才出发进行垃圾回收。
  • app内存限制机制:每个app分配的最大内存限制随不同设备而不同;图片是吃内存的大户。
  • 切换应用时后台app清理机制:分时复用。前台只能有一个,但后台可以有多个。app切换时用LRUCache来清理内存;onTrimMemory()回调方法
  • 怎么监控内存?利用AS中的AndroidProfiler分析器可以看到内存使用情况或者用代码打点方式来分析。
 ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
  Float totalMemory = Runtime.getRuntime().totalMemory() * 1.0f /(1024*1024);
  Float freeMemory = Runtime.getRuntime().freeMemory() * 1.0f /(1024*1024);
  Float maxMemory = Runtime.getRuntime().maxMemory()* 1.0f /(1024*1024);

内存优化之数据结构优化

  • 频繁字符串拼接用StringBuilder,它虽然线程不安全,但是速度很快。
  • 用ArrayMap、SparseArray替换HashMap
  • 内存抖动
  • 对象复用:尽量复用系统自带的资源;ListView、GridView中对ConvertView进行复用;避免在onDraw方法里面执行对象的创建。

    内存泄露:程序申请内存之后,虽然停止不用了,但依然被其他东西引用着,使得GC没法对其进行回收。
    activity内创建新线程会引起act的引用,有可能造成act无法释放,引发内存泄露;尽量使用ApplicationContext,而不是ActivityContext;另外还要注意Cursor对象是否及时关闭。

强弱软虚引用
当我们用new关键字去新建一个对象的时候,创建的就是强引用。
当一个对象具有强引用,那么垃圾回收器不会回收和销毁。强引用的存在限制了对象在内存中的存活时间。对象A中包含了一个对象B的强引用,那么一般情况下,对象B的存活时间就不会比对象A短。
在Java中,非静态内部类会在其整个生命周期中持有对它外部类的强引用。
软引用(SoftReference)
如果一个对象只具有软引用,那就类似于可有可物的生活用品。如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。

String str=new String("abc");                                     // 强引用
SoftReference<String> softRef=new SoftReference<String>(str);     // 软引用

弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描他所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。

String str=new String("abc");    
WeakReference<String> abcWeakRef = new WeakReference<String>(str);
str=null;

虚引用(PhantomReference)
“虚引用”顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。
虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值