内存泄漏

Java 内存泄露

是指你向系统申请分配内存进行使用 (new),可是使用完了以后却不归还 (delete),结果你申请到的那块内存你自己也不能再访问, 该块已分配出来的内存也无法再使用,随着服务器内存的不断消耗,而无法使用的内存越来越多,系统也不能再次将它分配给需要的程序,产生泄露。一直下去,程序也逐渐无内存使用,就会溢出。

案例

设置软引用

下面举个例子,假如有一个应用需要读取大量的本地图片,如果每次读取图片都从硬盘读取,则会严重影响性能,但是如果全部加载到内存当中,又有可能造成内存溢出,此时使用软引用可以解决这个问题。

设计思路是:用一个 HashMap 来保存图片的路径和相应图片对象关联的软引用之间的映射关系,在内存不足时,JVM 会自动回收这些缓存图片对象所占用的空间,从而有效地避免了 OOM 的问题。在 Android 开发中对于大量图片下载会经常用到。

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

public void addBitmapToCache(String path) {

        // 强引用的 Bitmap 对象
        Bitmap bitmap = BitmapFactory.decodeFile(path);

        // 软引用的 Bitmap 对象
        SoftReference<Bitmap> softBitmap = new SoftReference<Bitmap>(bitmap);

        // 添加该对象到 Map 中使其缓存
        imageCache.put(path, softBitmap);
    }

 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;

    }
下一页