Android 性能优化之内存优化

Android性能优化(安卓性能优化)内存泄露 | 内存优化 | UI绘制优化 | 布局优化 | 图片加载 | 多线程优化 | 列表优化 | apk优化 在Android开发中,性能优化是软件开发中最难且也是知识面涉及最深、最广、最难的一个领域,更是开发一款优秀软件的必要条件。更快:App流畅,响应速度快更稳:App运行稳定,程序不崩溃(Crash)也不会无响应(ANR)更省:节省资源,包括电量,内存,存储,流量等。 阅读详情

在移动操作系统上,通常物理内存有限,尽管 Android 的 Dalvik 虚拟机扮演了常规的垃圾回收的角色,但这并不意味着我们可以忽略 APP 的内存分配与释放,为了 GC 能够从 APP 中及时回收内存,我们在日常的开发中就需要时刻注意内存泄露,并在合适的时候来释放引用对象,对于大多数的 APP 来说,Dalvik 的 GC 会自动把离开活动线程的对象进行回收,接下来我们就来看看有关内存方面的具体优化思想,这里我们从两个方面来谈,在具体写代码的过程中我们需要注意的以及使用那些工具来检测出我们在写代码过程中所没有注意到的内存泄露

 

 

一、如何管理内存

 

1)Service 资源使用

      如果需要在后台使用 Service,当 Service 完成任务但停止失败的情况下,会引起内存泄露,我们在处理 Service 的时候尽量使用 IntentService 它会在处理完给它的任务以后自动关闭,当一个 Service 已经不需要时还必须保留它,这对 Android 应用内存管理来说是很糟糕的错误之一

2)onTrimMemory 优化

      onTrimMemory 主要作用就是指导应用程序在不同的情况下进行自身的内存释放,以避免系统被直接杀掉,提高应用程序的用户体验,接下来我们来看一下具体哪些组件可以实现 onTrimMemory 的回调

  • Application.onTrimMemory()
  • Activity.onTrimMemory()
  • Fragment.onTrimMemory()
  • Service.onTrimMemory()
  • ContentProvider.onTrimMemory()

App 生命周期的任何阶段,应该根据 onTrimMemory() 方法中的内存级别来进一步决定释放哪些内存

  • TRIM_MEMORY_UI_HIDDEN: 表示应用程序的所有 UI 界面被隐藏了,即用户点击了 Home 键或者 Back 键导致应用的UI 界面不可见.这时候应该释放一些资源.
    TRIM_MEMORY_UI_HIDDEN:这个等级比较常用,和下面六个的关系不是很强,所以单独说

下面三个等级是当我们的应用程序真正运行时的回调:

  • TRIM_MEMORY_RUNNING_MODERATE:    表示应用程序正常运行,并且不会被杀掉。但是目前手机的内存已经有点低了,系统可能会开始根据LRU缓存规则来去杀死进程了。
  • TRIM_MEMORY_RUNNING_LOW:    表示应用程序正常运行,并且不会被杀掉。但是目前手机的内存已经非常低了,我们应该去释放掉一些不必要的资源以提升系统的性能,同时这也会直接影响到我们应用程序的性能。
  • TRIM_MEMORY_RUNNING_CRITICAL:    表示应用程序仍然正常运行,但是系统已经根据LRU缓存规则杀掉了大部分缓存的进程了。这个时候我们应当尽可能地去释放任何不必要的资源,不然的话系统可能会继续杀掉所有缓存中的进程,并且开始杀掉一些本来应当保持运行的进程,比如说后台运行的服务。

当应用程序是缓存的,则会收到以下几种类型的回调:

  • TRIM_MEMORY_BACKGROUND:    表示手机目前内存已经很低了,系统准备开始根据 LRU 缓存来清理进程。这个时候我们的程序在 LRU 缓存列表的最近位置,是不太可能被清理掉的,但这时去释放掉一些比较容易恢复的资源能够让手机的内存变得比较充足,从而让我们的程序更长时间地保留在缓存当中,这样当用户返回我们的程序时会感觉非常顺畅,而不是经历了一次重新启动的过程。
  • TRIM_MEMORY_MODERATE:    表示手机目前内存已经很低了,并且我们的程序处于 LRU 缓存列表的中间位置,如果手机内存还得不到进一步释放的话,那么我们的程序就有被系统杀掉的风险了。
  • TRIM_MEMORY_COMPLETE:    表示手机目前内存已经很低了,并且我们的程序处于 LRU 缓存列表的最边缘位置,系统会最优先考虑杀掉我们的应用程序,在这个时候应当尽可能地把一切可以释放的东西都进行释放。

3)使用 BitMap 优化


    在 Android 应用里,最耗费内存的就是图片资源。而且在 Android 系统中,读取位图 Bitmap 时,分给虚拟机中的图片的堆栈大小只有 8 M,如果超出了,就会出现 OutOfMemory 异常。所以,对于图片的内存优化,是 Android 应用开发中比较重要的内容

 

3.1 要及时回收 Bitmap 的内存

      Bitmap 类有一个方法 recycle(),从方法名可以看出意思是回收。这里就有疑问了,Android 系统有自己的垃圾回收机制,可以不定期的回收掉不使用的内存空间,当然也包括 Bitmap 的空间。

      Bitmap 类的构造方法都是私有的,所以开发者不能直接 new 出一个 Bitmap 对象,只能通过 BitmapFactory 类的各种静态方法来实例化一个 Bitmap。仔细查看 BitmapFactory 的源代码可以看到,生成 Bitmap 对象最终都是通过 JNI 调用方式实现的。所以,加载 Bitmap 到内存里以后,是包含两部分内存区域的。简单的说,一部分是 Java 部分的,一部分是 C 部分的。这个 Bitmap 对象是由 Java 部分分配的,不用的时候系统就会自动回收了,但是那个对应的 C 可用的内存区域,虚拟机是不能直接回收的,这个只能调用底层的功能释放。所以需要调用 recycle() 方法来释放 C 部分的内存。从 Bitmap 类的源代码也可以看到,recycle() 方法里也的确是调用了 JNI 方法了的。

      那如果不调用 recycle(),是否就一定存在内存泄露呢?也不是的。Android 的每个应用都运行在独立的进程里,有着独立的内存,如果整个进程被应用本身或者系统杀死了,内存也就都被释放掉了,当然也包括  C 部分的内存。

       Android 对于进程的管理是非常复杂的。简单的说,Android 系统的进程分为几个级别,系统会在内存不足的情况下杀死一些低优先级的进程,以提供给其它进程充足的内存空间。在实际项目开发过程中,有的开发者会在退出程序的时候使用Process.killProcess(Process.myPid()) 的方式将自己的进程杀死,但是有的应用仅仅会使用调用 Activity.finish() 方法的方式关闭掉所有的 Activity。

      一般来说,如果能够获得 Bitmap 对象的引用,就需要及时的调用 Bitmap 的 recycle() 方法来释放 Bitmap 占用的内存空间,而不要等 Android 系统来进行释放。

// 先判断是否已经回收
if(bitmap != null && !bitmap.isRecycled()){ 
        // 回收并且置为null
        bitmap.recycle(); 
        bitmap = null; 
} 
System.gc();

     从上面的代码可以看到,bitmap.recycle() 方法用于回收该 Bitmap 所占用的内存,接着将 bitmap置空,最后使用System.gc() 调用一下系统的垃圾回收器进行回收,可以通知垃圾回收器尽快进行回收。这里需要注意的是,调用 System.gc() 并不能保证立即开始进行回收过程,而只是为了加快回收的到来

 

 

 

3.2 异常捕获

      因为 Bitmap 非常消耗内存,为了避免应用在分配 Bitmap 内存的时候出现 OutOfMemory 异常以后 Crash 掉,需要特别注意实例化 Bitmap 部分的代码。通常,在实例化 Bitmap 的代码中,一定要对 OutOfMemory 异常进行捕获。

Bitmap bitmap = null;
try {
    // 实例化Bitmap
    bitmap = BitmapFactory.decodeFile(path);
} catch (OutOfMemoryError e) {
   //
}
if (bitmap == null) {
    // 如果实例化失败 返回默认的Bitmap对象
    return defaultBitmapMap;
}

3.3 压缩图片

     如果图片像素过大,使用 BitmapFactory 类的方法实例化 Bitmap 的过程中,需要大于 8M 的内存空间,就必定会发生OutOfMemory 异常。这个时候该如何处理呢?如果有这种情况,则可以将图片缩小,以减少载入图片过程中的内存的使用,避免异常发生。

      使用 BitmapFactory.Options 设置 inSampleSize 就可以缩小图片。属性值 inSampleSize 表示缩略图大小为原始图片大小的几分之一。即如果这个值为 2,则取出的缩略图的宽和高都是原始图片的 1/2,图片的大小就为原始大小的 1/4。

如果知道图片的像素过大,就可以对其进行缩小。那么如何才知道图片过大呢?

      使用 BitmapFactory.Options 设置 inJustDecodeBounds 为 true 后,再使用 decodeFile() 等方法,并不会真正的分配空间,即解码出来的 Bitmap 为 null,但是可计算出原始图片的宽度和高度,即 options.outWidth 和 options.outHeight。通过这两个值,就可以知道图片是否过大了。

BitmapFactory.Options opts = new BitmapFactory.Options();
    // 设置inJustDecodeBounds为true
    opts.inJustDecodeBounds = true;
    // 使用decodeFile方法得到图片的宽和高
    BitmapFactory.decodeFile(path, opts);
    // 打印出图片的宽和高
    Log.d("example", opts.outWidth + "," + opts.outHeight);

      在实际项目中,可以利用上面的代码,先获取图片真实的宽度和高度,然后判断是否需要跑缩小。如果不需要缩小,设置inSampleSize 的值为 1。如果需要缩小,则动态计算并设置 inSampleSize 的值,对图片进行缩小。需要注意的是,在下次使用BitmapFactory 的 decodeFile() 等方法实例化 Bitmap 对象前,别忘记将 opts.inJustDecodeBound 设置回 false。否则获取的 bitmap 对象还是 null。

3.4 缓存通用的 Bitmap 对象

      有时候,可能需要在一个 Activity 里多次用到同一张图片。比如一个 Activity 会展示一些用户的头像列表,而如果用户没有设置头像的话,则会显示一个默认头像,而这个头像是位于应用程序本身的资源文件中的。

     如果有类似上面的场景,就可以对同一 Bitmap 进行缓存。如果不进行缓存,尽管看到的是同一张图片文件,但是使用BitmapFactory 类的方法来实例化出来的 Bitmap,是不同的 Bitmap 对象。缓存可以避免新建多个 Bitmap 对象,避免内存的浪费,如在项目中使用,建议使用成熟的图片加载框架,如 Glide、Picasso、Fraesco 等,这样能避免很多图片加载时出现的问题

4)使用优化的数据容器

    利用 Android FrameWork 里面优化过的容器类,例如 SparseArray、SparseBooleanArray、LongSparseArray,通常的HashMap 实现方式更加消耗内存,因为它需要一个额外的实现对象来记录 Mapping 的操作,另外 SparseArray 更加高效在于它们避免了对 key 与 value 的 auotbox 自动装箱,并且避免了自动装箱后的解箱

5)使用 ProGuard 来剔除不需要的代码

      ProGuard 能够通过移除不需要的代码,重命名类,和方法等方式对代码进行压缩,优化与混淆,使用 ProGuard 可以使你的代码更加紧凑

6)对最终的 APK 使用 zipalign

     在编写玩所有的代码,并通过编译系统生成 APK 之后,需要使用 zipalign 对 APK 进行重新校准,它会对齐升级包资源,Google Play 不接受没有 zipalign 的 APK

 

二、内存泄露和内存溢出优化

 

内存泄露:对象在内存 heap 堆中分配空间,当不再使用或没有引用指引的情况下,仍不能被 GC 正常回收的情况,多数出现在不合理的编码情况下,例如在 Activity 中注册了一个广播就收器,但是在页面关闭的时候未进行 unRegister,就会出现内存泄露现象,通常情况下,大量的内存泄露会导致 OOM

OOM:OutOfMemoery,内存溢出是指 APP 向系统申请超过最大阈值的内存请求,系统不会在分配多余空间,就会造成 OOM,在 Android 平台下,多数情况是出现在图片处理不当时,造成内存泄露

1)静态变量导致的内存泄露

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";
    private static Context sContext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sContext = this;
    }
}

      上面这种情形是一种最简单的内存泄露,相信大家都不会这么干,上面代码将导致 Activity 无法正常销毁,因为静态变量引用了它,上面的代码也可以改造一下,如下所示,sView 是一个静态变量,它内部持有了当前 Activity,所以 Activity 仍然无法释放,估计大家也明白

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";
    private static View sView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sView = new View(this);
    }
}

2)单例模式导致的内存泄露

public class CommUtils {

    private static CommUtils instance;
    private Context context;
    public CommUtils(Context context) {
        this.context = context;
    }

    public static CommUtils getInstance(Context context) {

        if (instance == null) {
            synchronized (CommUtils.class) {
                if (instance == null) {
                    instance = new CommUtils(context);
                }
            }
        }
        return instance;
    }
}

在 MainActivity 中的使用如下:

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        CommUtils commUtils = CommUtils.getInstance(this);
    }
}

      上面的单例是我们经常写的,但是是存在内存泄露风险的,这样写的问题就是,在 MainActivity 里使用 CommUtils 类,传入的context 是 MainActivity 的 Context,试想一下,当 MainActivity 声明周期结束,但 CommUtils 类里面还存在 MainActiviy 的引用(context),这样 MainActivity 占用的内存就一直不能回收,而 MainActivity 的对象也不会再被使用,那么我们如何来解决这个问题呢?在MainActivity中,可以用CommUtils.getInstance(getApplicationContext())或CommUtils.getInstance(getApplication()) 代替,因为 Application 的生命周期是贯穿整个程序的,所以 CommUtils 类持有它的引用,也不会造成内存泄露问题

3)非静态内部类导致的内存泄露

非静态内部类默认持有外部类的引用,使外部类不能被回收,具体解决方法如下:

 

  1. 去除隐式引用(通过静态内部类来去除隐式引用)
  2. 手动管理对象引用(修改静态内部类的构造方式,手动引入其外部类引用)
  3. 当内存不可用时,不执行不可控代码(Android 可以结合智能指针,WeakReference 包裹外部类实例)

4)资源未关闭导致的内存泄露

      对于使用了 BroadcastReceiver、ContentObserver、File、Cursor、Stream、Bitmap 等资源的代码,应该在 Activity 销毁时及时关闭或者注销,否则这些资源将不会被回收,造成内存泄露

5)AsyncTask、Handler 导致的内存泄露

基本也是由于非静态内部类持有外部类的应用,导致外部类在销毁时无法回收,造成内存泄露

6)WebView 导致的内存泄

 

  • 不在 xml 中定义 WebView 节点,而是需要的时候在 Activity 中创建,并且 Context 使用 getApplicationContext()
  • 在 Activity 销毁 WebView 的时候,先让 WebView 加载 null 内容,然后移除 WebView,再销毁 WebView
@Override
protected void onDestroy() {
    if( mWebView!=null) {

        // 如果先调用destroy()方法,则会命中if (isDestroyed()) return;这一行代码,需要先onDetachedFromWindow(),再
        // destory()
        ViewParent parent = mWebView.getParent();
        if (parent != null) {
            ((ViewGroup) parent).removeView(mWebView);
        }

        mWebView.stopLoading();
        // 退出时调用此方法,移除绑定的服务,否则某些特定系统会报错
        mWebView.getSettings().setJavaScriptEnabled(false);
        mWebView.clearHistory();
        mWebView.clearView();
        mWebView.removeAllViews();
        mWebView.destroy();
    }
    super.on Destroy();
}

关于内存优化的内容,今天就先介绍到这里,如有错误,请指正

 

一篇文章教你搞定内存泄漏与排查流程——安卓性能优化 前言 内存泄漏可以说是安卓开发中常遇到的问题,追溯和排查其问题根源是进阶的程序猿必须具备的一项技能。小盆友今天便与大家分享一下这方面的一些见解,如有理解错误或是不同见解,可以于评论区留言我们进行讨论,如果喜欢给个赞鼓励下吧。 目录 1、JAVA内存解析 2、JAVA回收机制 3、四种引用 4、小结 5、安卓内存泄漏排查工具 6、内存泄漏检查与解决流程 7、常见的内存泄漏原因 1、JAVA内... 阅读详情

相关推荐

Android性能优化 - 内存优化

在一个商业项目中,很有可能因为工程师的疏忽,导致代码质量不佳,影响到程序的运行效率,从而让用户感知到应用的卡顿、崩溃。而Android开发中,每个Android应用在手机上申请的内存空间都是有限的。虽然手机发展越来越快,可申请到的内存越来越大,但是也不能大手大脚,随便浪费应用可使用的内存空间。内存一旦不够时,你这个应用就会因为OOM(out of memory)而崩溃。

JackChan 4347

分析跟手性

分析android跟手性

yangzex的专栏 3418

【CANoe16安装教程】亲测安装成功

CANoe16安装教程

qq_45302638的博客 2万+

Android:最全面&详细的性能优化攻略(含内存优化、内存泄漏、绘制优化、布局优化、图片优化、APK优化、多线程优化、列表优化等)

前言:佛教中有一句话:初学者的心态,拥有初学者心态是件了不起的事情。真正的大师永远怀有一颗学徒的心。 一、概述 在Android中,性能优化非常重要,因为这决定这一个APP的质量好坏,一个更快更稳更省的app能给用户更优秀的体验。 更快:App流畅不卡顿,快速响应; 更稳:App稳定运行,程序不崩溃(Crash)和无响应(ANR); 更省:节省资...

https://juejin.cn/user/1654096907477549/posts 1万+

基于MATLAB/Simulink与WSL2的ROS2实时联合仿真实践

本文详细介绍了基于MATLAB/Simulink与WSL2的ROS2实时联合仿真实践。通过环境配置、PX4仿真环境搭建、自定义消息生成、Simulink通信实现及实时优化等步骤,提供了完整的无人机位置控制案例,帮助开发者实现高精度的实时联合仿真。

red88的博客 204

1. Klipper从安装到运行

本文记录Klipper固件从安装,配置到运行的详细过程

weixin_42098934的博客 1万+

深入探索 Android 内存优化(炼狱级别)

前言 成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~。 本篇是 Android 内存优化的进阶篇,难度可以说达到了炼狱级别,建议对内存优化不是非常熟悉的仔细看看前篇文章:Android性能优化之内存优化,其中详细分析了以下几大模块: 1)、Android的内存管理机制 2)、优化内存的意义 3)、避免内存泄漏 4)、优化内存空间 5)、图片管理模块的设计与实现 如果你对以上基础内容都比较了解了,那么我们便开始 Android 内...

idaretobe的专栏 4148

【FPGA】AD9694调试注意事项

基于FPGA的AD9694设计及其注意事项,包括同步的设计注意事项

weixin_41246509的博客 2903

Android 内存优化

一、重识内存优化 Android给每个应用进程分配的内存都是非常有限的,那么,为什么不能把图片下载下来都放到磁盘中呢?那是因为放在 内存 中,展示会更 “快”,快的原因有两点,如下所示: 1)、硬件快:内存本身读取、存入速度快。 2)、复用快:解码成果有效保存,复用时,直接使用解码后对象,而不是再做一次图像解码。 这里说一下解码的概念。Android系统要在屏幕上展示图片的时候只认 “像素缓冲”,而这也是大多数操作系统的特征。而我们 常见的jpg,png等图片格式,都是把 “像素缓冲” 使用不同的手段

十年代码写十年 2744

英飞凌 TC4X MCAL之SPI中断与DMA高效传输实战

本文详细介绍了英飞凌TC4X芯片的SPI通信实战,重点讲解如何通过MCAL配置SPI中断与DMA实现高效数据传输。针对汽车电子领域的高吞吐需求,提供了从基础配置到中断处理、DMA优化的完整解决方案,包含代码示例和调试技巧,帮助开发者提升系统性能与CPU利用率。

k0l1m2n3o的博客 874

Simulink开发项1000例实战专栏--实例52:基于Simulink开发一个超导磁储能控制系统,实现对SMES系统的精确控制和优化

需求分析超导磁储能系统(Superconducting Magnetic Energy Storage, SMES)是一种利用超导线圈储存和释放电能的高效储能技术。SMES系统具有响应速度快、能量密度高、循环寿命长等优点,广泛应用于电力系统的调峰填谷、频率调节、电压稳定以及紧急备用电源等领域。本项目将基于Simulink平台,开发一个完整的超导磁储能控制系统,实现对SMES系统的精确控制和优化。我们将详细讲解如何设计和实现该系统,并结合实际应用案例进行说明。

xiaoheshang_123的博客 236

Android内存优化的10条建议

合理设置应用的minSdkVersion和targetSdkVersion,使应用可以运行在更多设备上,这可以提高内存利用效率。 避免在Application和Activity的onCreate方法中做过多工作,这会占用过多内存。可以将不必要的初始化工作放到onStart或延迟加载。 避免在UI线程中进行过多工作,可以使用AsyncTask或者Thread执行耗时操作,避免ANR问题发生。 重用已有对象,避免重复创建对象,这会产生大量垃圾对象,增加GC负担。可以使用对象池技术重用对象。 优化布局,减少视图

wayne214的博客 1061

深度解构事务码 SQF:Support Query Framework 与 ABAP 静态分析实战

某制造企业在年度审计前,需要确认自定义发票过账程序 ZFI_INV* 系列是否存在硬编码公司代码与未捕获异常。技术团队在字段填入ZFI_INV*后,勾选与规则,执行扫描。SQF 生成的 ALV 报告列出 42 个警告,其中 17 条与抛出 CX_SY_NO_HANDLER 相关,8 条涉及动态 SQL 注入风险。结果导出至 Excel 供开发整改,并在 ATC 阶段验证修复。此过程较手工逐个执行 Code Inspector 节省超 80 % 时间。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 216

玩安卓必须要掌握的性能优化之内存优化

前言 这是我写的性能优化的第三篇文章,下面是另外两篇文章: 玩安卓必须要掌握的性能优化之内存泄漏 玩安卓必须要掌握的性能优化之APK极限压缩 正文 本篇文章准备详细说一下编码中需要注意的地方,养成良好的编码习惯。 第一点 数据类型 尽量不要使用比需求更占空间的基本数据类型,比如能用 int 就不使用 long,能用 float 就不使用 double,可以减少内存的开销,虽然几乎对程...

Zhujiang 1120

微信小程序 - 最新图片组拖拽排序更换位置功能,类似微信朋友圈九宫格图片的拖动排序效果,微信小程序实现九宫格图片拖拽调换位置,小程序详细实现图像拖曳拖动切换位置排序功能(详细示例代码,一键复制开箱即用

微信小程序,wechat,小程序,图片排序,图像排序,九宫格拖拽排序,拖曳,拖动,拖拽,仿微信朋友圈,朋友圈宫格图片排序,微信朋友圈图片拖动排序效果,实现九宫格图片拖拽,图像拖拽排序组件插件,小程序实现拖拽图片切换图片位置,图片拖动互换位置,图像拖拽切换位置,九宫格图片组合拖动排序,交换九宫格图片的位置,小程序上传图片后,如何实现拖拽排序功能,小程序怎么实现图片拖拽排序,微信小程序图片上传,九宫格拖拽组件,选择图片并拖动_微信小程序图片拖拽,微信小程序长按拖拽排序,图像的拖拽移动,多图拖拽排序功能,实现九宫

✅ 精选推荐文章 4454

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Android性能优化之内存分析

内存抖动就是不停的在新生代创建对象,创建对象很多,会有空间分配担保,新生代空间比较小占1/3,老年代2/3,当新生代空间不够时,老年代会腾挪一部分空间给新生代,导致老年代空间下降,这个时候假设创建了大对象,从新生代经过了from到to,年龄足够到了老年代,这个时候空间不够,如果没有连续的空间,就会导致OOM。GC过程中会暂停用户线程包括UI线程,Stop the World,频繁的创建,释放对象,GC频繁出现,就会导致App整体卡顿。引用计数法:一个对象身上没有引用,不可用,这个对象就会被回收。

ChenYiRan123456的博客 979

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Android内存泄漏总结和性能优化技巧

对于许多开发者来说,安卓性能优化往往是一个比较棘手的问题。由于安卓设备的种类繁多,硬件配置各不相同,因此优化的方法和策略也各不相同。同时,安卓应用的开发周期较长,往往需要不断地迭代和更新,因此优化也需要不断地持续和优化。 学习安卓性能优化的知识和技巧,是每个安卓开发者必备的技能之一。通过掌握安卓性能优化的基本原理和方法,我们可以更加深入地了解安卓设备的工作机制,理解应用的性能瓶颈,从而采取有效的优化策略和措施,提高应用的性能和稳定性,提升用户的满意度和留存率。

weitao_666的博客 1361

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Android开发者必知的内存、性能优化细节,2024年是做安卓开发人员的绝佳时机

process后面需要记住要有个":",这表示该进程属于你的app。一般情况下,一块基本的空进程需要的内存大小在1.4m左右。

2401_84150154的博客 695

安卓性能优化——内存管理技巧

引用了大量API文档的内容,没有对超链接进行删改,有需要的朋友可以直接点超链接访问API文档。 安卓性能优化 Performance and power Implementing a cool idea is a great start toward an app that delights users, but it's just the beginning. The next step...

旧日灯塔 1109

Android内存优化&Android性能优化

资料 Android性能优化:这是一份全面&详细的内存优化指南

AdrianAndroid的专栏 880

Android性能优化解析-内存抖动 附:《Android性能优化指南》

从「内存抖动」说起 面试官:你做过性能优化是吧。 面试者:嗯是的,在卡顿和耗电问题上做过挺多事。 面试官:内存抖动的解决方案你有了解过吗? 面试者:内存什么? 面试官:内存抖动。没有听过吗? 面试者:……没有。 面试官:呼(摇头)。年轻人还是要敬畏技术啊,要持续学习啊。 面试者:我……嗯…… 什么是内存抖动? 在程序里,每创建一个对象,就会有一块内存分配给它;每分配一块内存,程序的可用内存也就少一块;当程序被占用的内存达到一定临界程度,GC 也就是垃圾回收器(Garbage Collector)就会出

datian1234的博客 657

安卓应用性能优化的深度探索:从内存管理到布局优化

内存泄漏是指应用中已经不再使用的对象,由于某些原因仍然被其他对象持有引用,导致这些对象无法被垃圾回收器回收,从而占用内存空间。随着内存泄漏的积累,应用的可用内存逐渐减少,最终可能导致应用崩溃或性能严重下降。例如,一个 Activity 持有一个静态变量的引用,而该静态变量的生命周期比 Activity 长,当 Activity 销毁时,由于静态变量仍然引用着 Activity 中的对象,这些对象无法被回收,就造成了内存泄漏。在自定义 View 的开发过程中,应尽量简化绘制逻辑。

数字魔方操控师的博客 1829

Android性能优化:从内存到电量

本文从内存管理和电量消耗两个方面,详细阐述了Android性能优化的方法。通过检测和修复内存泄漏、优化内存复用与缓存、监测和评估电量消耗、采用电量节省策略等手段,可以有效提升应用的性能和用户体验。在实际开发过程中,开发者应关注这些优化方法,并根据具体场景灵活运用。在未来,Android性能优化将继续是开发者关注的焦点,期待更多高效、实用的优化技术出现。持续关注性能优化工具:随着技术的发展,性能优化工具也在不断更新,开发者应关注并使用最新的工具。深入研究性能优化技术。

2501_92487231的博客 423

Android性能优化之内存优化

例如,在onDraw方法里面不要执行对象的创建,一般来说,都应该在自定义View的构造器中创建对象。

2401_87021538的博客 1975

android 内存和性能优化汇总

1、即时编译(Just-in-time Compilation,JIT),又称动态转译(Dynamic Translation),是一种通过在运行时将字节码翻译为机器码,从而改善字节码编译语言性能的技术。即时编译前期的两个运行时理论是字节码编译和动态编译。Android原来Dalvik虚拟机是作为一种解释器实现,新版(Android2.2+)将换成JIT编译器实现。性能测试显示,在多项测试中新版本

Coder_android 1597

Android性能优化整理——布局、内存、网络优化等

Android性能优化 由于手机硬件的限制,内存和CPU都无法像pc一样具有超大的内存,Android手机上,过多的使用内存,会容易导致oom,过多的使用CPU资源,会导致手机卡顿,甚至导致anr。主要是从一下几部分进行优化: 布局优化,绘制优化,内存泄漏优化,响应速度优化,listview优化,bitmap优化,线程优化 布局优化 工具 hierarchyviewer,解决方式: 1、删除无用的空间和层级。 2、选择性能较低的viewgroup,如Relativelayout,如果可以选择Re

QLHepburn的博客 352
上一篇: Java 基础之多线程
下一篇: 设计模式之装饰者模式
QDJdeveloper
博客等级 码龄11年 108粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值