当前位置: 首页 > 知识库问答 >
问题:

如何检查内存泄漏?如何解决这些问题?

唐钊
2023-03-14

我正面临这个错误:

 private void onCaptureImageResult(Intent data) {

    Bitmap thumbnail = null;


    String[] projection = {MediaStore.Images.Media.DATA};
    Cursor cursor = managedQuery(mCapturedImageURI, projection, null,
            null, null);
    int column_index_data = cursor
            .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();

    //THIS IS WHAT YOU WANT!
    String capturedImageFilePath = cursor.getString(column_index_data);

    filename = capturedImageFilePath.substring(capturedImageFilePath.lastIndexOf("/") + 1);
    thumbnail = BitmapFactory.decodeFile(capturedImageFilePath);

    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    thumbnail.compress(Bitmap.CompressFormat.JPEG, 50, bytes);

    thumbnail=Bitmap.createScaledBitmap(thumbnail, 200, 300, true);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        Log.i("final camera size", String.valueOf(thumbnail.getAllocationByteCount()));
    }
    File destination = new File(Environment.getExternalStorageDirectory(),
            System.currentTimeMillis() + ".jpg");
    byte[] byteArray = bytes.toByteArray();
    encoded = Base64.encodeToString(byteArray, Base64.DEFAULT);
    Log.e("base64string name", encoded);

    Log.e("Image name", capturedImageFilePath);
    FileOutputStream fo;
    try {
        destination.createNewFile();
        fo = new FileOutputStream(destination);
        fo.write(bytes.toByteArray());
        fo.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    profile_image.setImageBitmap(thumbnail);
}

共有1个答案

宦翔
2023-03-14

Leakcanary是你记忆泄露的好朋友。这是一个非常容易使用的库,它将帮助您找到应用程序中的内存泄漏。在您的例子中,似乎不是内存泄漏,而只是一些不断分配内存的循环。不管怎样,试试泄密。如果没有帮助,试着找出应用程序的哪个部分使用堆转储占用了所有内存。更多关于它的信息可以在这里找到。

在您的例子中,它似乎与您在位图上所做的一些工作有关。请确保您正在从记忆中释放它们。此外,请记住,Android中的图像占用内存是基于像素的大小,而不是基于MB的大小。所以真正简单的png是10000x10000但只有1MB将比1000x1000 jpeg(3MB)占用更多的内存。

 类似资料:
  • 在阅读了大量有关MAT的内容后,我使用我的生产堆转储来分析内存泄漏问题。下面是泄漏报告错误: 线程org.apache.tomcat.util.threads.taskthread@0x6d8be0a30 http-bio-8443-exec-115保留总大小为3,695,816,440(89.03%)字节的局部变量。 内存累积在“'<'System class Loader'>”加载的“java

  • 问题内容: 由于GWT是用javascript编译且代码是用JAVA编写的事实,解决GWT内存泄漏的最佳方法是什么? 问题答案: 我可以推荐2件事: 阅读这篇文章 处理完所有引用后,将其无效。 祝好运!

  • 严重:web应用程序创建了一个ThreadLocal,其键类型为[org.apache.log4j.helpers.ThreadLocalMap](值为[org.apache.log4j.helpers.ThreadLocalMap@3ac5b23e])和值类型为[java.util.Hashtable](值为[{userhost=192.168.15.90,userid=127,username

  • 问题内容: 我有一个Grails应用程序,该应用程序完成了相当不错的域对象创建和销毁工作,而且它似乎以非常非常快的速度耗尽了PermGen空间。我已经进行了通常的调整(将PermGen调整为256M,启用了类GC,等等),但是没有骰子。 有人愿意推荐一些(可能是免费或非常便宜的)工具来解决Groovy和/或Java中的这种内存消耗问题吗?还是您用来解决JVM内存问题的某些技术? 编辑:这是在生产模

  • 问题内容: 我有一个Python程序,它运行一系列实验,没有打算从一个测试存储到另一个测试的数据。我的代码包含一个我完全找不到的内存泄漏(我已经查看了内存泄漏的其他线程)。由于时间限制,我不得不放弃寻找泄漏的机会,但是如果我能够隔离每个实验,该程序可能会运行足够长的时间以产生所需的结果。 在单独的线程中运行每个测试是否有帮助? 还有其他隔离泄漏影响的方法吗? 具体情况详 我的代码分为两部分:实验运

  • 本文向大家介绍PHPExcel内存泄漏问题解决方法,包括了PHPExcel内存泄漏问题解决方法的使用技巧和注意事项,需要的朋友参考一下 使用 PHPExcel 来生成 excel 文档是比较消耗内存的,有时候可能会需要通过一个循环来把大数据切分成若干个小的 excel 文档保存来避免内存耗尽。 然而 PHPExcel 存在 circular references 的情况(貌似在最新的 1.6.5