您的位置:首页 > 其它

对内存的优化

2016-01-03 13:56 176 查看
Java语言的内存回收机制:内存空间中的垃圾回收机制是由垃圾回收器(Garabge Collector,即GC)完成的。

核心思想:对虚拟机可用的内存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对象,内存空间不能回收,反之如果对象不在被引用,则称其为垃圾对象,可以回收其占据的内存空间,用于在分配。

C/C++中的内存泄漏是指,用于动态存储分配的函数动态开辟的空间,在使用完毕后未释放,结果导致着一直占据着内存单元,直到程序结束。

Java中不需要手动释放分配的内存,Java中的内泄漏实际上是指,虽然程序一直持有着某个对象的引用,但从程序的逻辑的逻辑上看,这个对象在也不会被用到了。当这种情况发生时,我们就会认为这个对象发生了内存泄漏,如果这种情况偶尔发生,问题还不大。但是如果这种情况持续增加,内存泄漏就会越来越多,最终会导致内存不足,OutOfMemory异常发生。

Android没有采用Java虚拟机,而是采用Dalvik虚拟机,但是从原理上看,这个概念也是适用的。

一般来说,Android应用程序都是在自己单独的进程中进行(也可以运行在多个进程中,但是一般不会这么做)。Android系统为不同类型的进程分配了不同的内存使用上限。如果应用进程的使用的内存超过了这个上限,则会被系统视为内存泄漏,整个进程都会被杀死。一般的Android系统对于应用的内存的限制是24M(老的机型是16M)。

使用软引用和弱引用

Java从JDK1.2开始将引用分为4种级别了,从而使程序更加灵活的控制声明周期。强引用,软引用,弱引用,虚引用

软引用:如果一个对象只具有软引用,那么如果内存空间足够,垃圾回收器就不会回收它,如果内存的空间不足了,就会回收这些对象的内存。

弱引用:如果一个对象只具有弱引用,那么垃圾回收器线程扫描的过程中,一旦发现;了只具有弱引用的对象,不管当前的内存空间是否足够,都会回收他的内存。不过由于垃圾回收器是一个优先级很低的线程,因此不一定会发现那些只具有弱引用的的对象。弱引用也可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收了,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。

弱引用和和软引用的根本区别:只有弱引用的对象拥有更短暂的生命周期,可能随时被回收。而只具有软引用的对象只有当内存不够的时候才被回收,在内存足够的时候通常不会被回收。

java.lang,ref     SoftReference(软引用)WeakReference(弱引用)PhantomReference(虚引用)

public class MainActivity extends Activity {

 private Map<String,SoftReference<Bitmap>> imageCache;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        imageCache=new HashMap<String, SoftReference<Bitmap>>();

       

    }

    /**

     * 保存Bitmap的软引用到HashMap

     * @param path

     */

   public void addBitMapToCache(String path){

    //强引用的Bitmap的对象

    Bitmap bitmap=BitmapFactory.decodeFile(path);

    //软引用的Bitmap对象

    SoftReference<Bitmap> softBitMap=new SoftReference<Bitmap>(bitmap);

    //添加对象到Map中使其缓存

    imageCache.put(path, softBitMap);

   

   

   }

  

   /**

    * 通过SoftReference的get方法获取得到Bitmap

    * @param path

    * @return

    */

   public Bitmap getBitmapByPath(String path) {

    //从缓存中取引用的Bitmap的对象

    SoftReference<Bitmap> softBitmap=imageCache.get(path);

    //判断是否存在引用

    if(softBitmap==null){

     return null;

      

    }

   // 取出Bitmap对象,如果由于内存不足Bitmap被回收,将取得空。

 Bitmap bitmap=softBitmap.get();

 return bitmap;

   }

   

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: