zoukankan      html  css  js  c++  java
  • [Android随笔]内存泄漏以及内存溢出

    名词解释     


          内存泄漏:memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏危害能够忽略,但内存泄漏堆积后果非常严重,不管多少内存,迟早会被占光。

          内存溢出:out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory。比方申请了一个Integer,但给它存了Long才干存下的数。那就是内存溢出。除此之外,也有一次性申请非常多内存。比方说一次创建大的数组或者是加载一个大文件如图片。非常多时候是图片的处理不当。

          memory leak 会终于导致out of memory!

    内存泄漏举例

    1。Android数据库查询时会使用Cursor。可是在写代码时。常常会有人忘记调用close,或者由于代码逻辑问题导致close未被调用。

    2。I/O数据流操作,读写结束后没有关闭。

    3,Bitmap使用后未调用recycle();

    4,调用registerReceiver后未调用unregisterReceiver().

    5,还有种比較隐晦的Context泄漏

    先让我门看一下下面代码:

        private static Drawable sBackground;
        @Override
        protected void onCreate(Bundle state) {
            super.onCreate(state);
            TextView label = new TextView(this);
            label.setText("Leaks are bad");
            if (sBackground == null) {
                sBackground = getDrawable(R.drawable.large_bitmap);
            }
            label.setBackgroundDrawable(sBackground);
            setContentView(label);
        }

    代码说明:在这段代码中,我们使用一个static的Drawable对象。这通常发生在我们须要常常调用一个Drawable。而其载入又比較耗时,不希望每次载入Activity都去创建这个Drawable的情况。此时。使用static无疑是最快的代码编写方式,可是其也很的糟糕。当一个Drawable被附加到View时,这个View会被设置为这个Drawable的callback (通过调用Drawable.setCallback()实现)。这就意味着。这个Drawable拥有一个TextView的引用,而TextView又拥有一个Activity的引用。这就会导致Activity在销毁后,内存不会被释放。

    解决方式:Avoiding Memory Leaks 文章提到

    In summary, to avoid context-related memory leaks, remember the following:
    1。Do not keep long-lived references to a context-activity (a reference to an activity should have the same life cycle as the activity itself)
    2。Try using the context-application instead of a context-activity
    3。Avoid non-static inner classes in an activity if you don't control their life cycle, use a static inner class and make a weak reference to the activity inside. The solutionto  this issue is to use a static inner class with a  to the outer class, as done in  and its W inner class for instance
    4,A garbage collector is not an insurance against memory leaks

    一些避免内存泄漏的点能够看看[Android随笔]内存优化纪录篇

    内存溢出举例

    1,一次性载入一个大文件如图片,载入大图片的解决方式[Android随笔]怎样有效载入显示图片

    2,使用List View、GridView在一个屏幕上显示多张图片


  • 相关阅读:
    C# 添加、删除、读取Word形状(基于Spire.Cloud.Word.SDK)
    Java 添加、修改、读取、复制、删除Excel批注
    Java 设置Word页边距、页面大小、页面方向、页面边框
    C# 将Word转为PDF、XPS、Epub、RTF(基于Spire.Cloud.Word.SDK)
    Java添加、读取Excel公式
    C# 添加文本、图片到PDF文档(基于Spire.Cloud.SDK for .NET)
    Java 在Excel单元格中应用一种/多种字体样式
    Java 添加、删除、移动、隐藏/显示Excel工作表
    Java 复制Excel工作表
    Java 将Excel转为图片、html、XPS、XML、CSV
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/6925456.html
Copyright © 2011-2022 走看看