手把手带你了解内存抖动和泄漏的优化

Android 性能优化 - 彻底解决内存抖动 作为一名从事Android的开发者,很多人最近都在和我吐槽Android是不是快要凉了?而在我看来这正是市场成熟的表现,所有的市场都是温水煮青蛙,永远会淘汰掉不愿意学习改变,安于现状的那批人,希望所有的人能在大浪淘沙中留下来,因为对于市场的逐渐成熟,平凡并不是我们唯一的答案!《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取![外链图片转存中…(img-GAKU33ro-1713144947368)] 阅读详情
前言
这个系列的文章:

1、用通俗易懂的讲解方式,讲解一门技术的实用价值
2、详细书写源码的追踪,源码截图,绘制类的结构图,尽量详细地解释原理的探索过程
3、提供Github 的 可运行的Demo工程,但是我所提供代码,更多是提供思路,抛砖引玉,请酌情cv
4、集合整理原理探索过程中的一些坑,或者demo的运行过程中的注意事项
5、用gif图,最直观地展示demo运行效果

请查看完整的PDF版

更多完整项目下载。未完待续。源码。图文知识后续上传github。
可以点击关于我联系我获取

如果觉得细节太细,直接跳过看结论即可。本人能力有限,如若发现描述不当之处,欢迎留言批评指正。

学到老活到老,路漫漫其修远兮。与众君共勉 !,和我一起当个CV工程师吧,手动滑稽

正文大纲
  • jvm内存管理常识
  • 检测以及处理内存抖动
  • 检测以及处理内存泄漏
正文
jvm内存管理常识

LMK (LowMemoryKill)机制 android底层会在系统内存告急的时候,按照一定规则杀死一些进程来满足其他进程的内存需要。其中 消耗内存的高低就是其中一项指标,所以,优化app的内存占用,能够有效降低app被系统杀死的概率。
GC STW机制 GC,垃圾回收进程,在GC线程执行任务的时候,会存在一个 STW (stop the world) 机制,他就会把其他所有线程都挂起。如果GC非常频繁地调用,那就会导致主线程不流畅,给用户的感觉就是 卡顿。
内存抖动频繁引起OOM 内存抖动太频繁,导致大量对象频繁创建和销毁,会产生大量不连续的内存空间,如果此时有一个大对象需要申请内存,就有可能申请失败,导致 OOM内存溢出
一句话解释 内存泄漏长 生命周期的对象持有 短生命周期对象的强引用,在 短生命周期对象需要回收的时候发现 不能被回收,视为泄漏
GC回收 可达性分析
GC线程判定 一个对象是不是可以回收,是根据可达性分析算法,计算 GcRoot,从 GcRoot向下搜索,把 GcRoot没有直接关联的对象全部作为垃圾来回收。
强软弱虚四大引用 强和虚自不必说。强 最常见,没有特殊处理的都是强引用(包括,匿名内部类会持有外部类的强引用)。虚引用没什么用,不予讨论。软引用,用来定义一些还有用,但是不是必须的对象,使用 SoftRefrence<T>修饰,在内存紧张的时候,GC回收之后,使用 SoftRefrence<T>修饰,如果系统还有足够的内存可用,那么软引用关联的对象就不会被回收。如果不足,则回收软引用关联的对象。弱引用( WeakRefrence<T>),比软引用更弱一些,只要GC触发,弱引用关联的对象就会被回收。
注意: 使用软和弱引用,要判定关联对象是否为空。

检测以及处理内存抖动
我们使用s开发,平时我们运行app,一般会点 RunApp,但是还有另一个选择, 那就是 profileApp, 运行app起来之后,会在as下方看到profile 窗点击之后,as下方会出现profile,图中会显示网络,内存和cpu使用情况

如果内存的图中抖动得非常明显,比如像这样的心电图一样:

那就说明非常明显存在内存抖动,急需处理: 点击内存图形区域之后,就能看到详细的内存变化情况,以及内存分配情况:

这里有个坑:

如果你从图形中观察到,内存走势平稳,并没有出现上满模拟抖动的图中那么夸张,是不是就不存在内存抖动呢?并不是。因为我们的gc,是在内存不可用的情况下才会去回收内存,如果app占用内存一直比较少,没有触及gc的临界值,那么就不会出现 断崖式下跌. 那么这样就观察不出内存抖动了,怎么办呢?

解决方法 在8.0以下的安卓手机上,在下方的位置上会出现一个Record按钮(如果是8.0以上,你可以直接用拖拽的方式来截取一段内存record):

点击它,一段时间之后,再点一下:你就能在下方发现一张表格:

这张表格代表的是,你Record这段时间之内创建的对象,点击一下第二列 Allocations,对创建的数量进行排序,找出创建次数最多的对象:

然后,点击排行第一的String之后,会在右方看到

然后点击其中的一个,又会看到一个新的窗口:

此为止,就找到了 创建对象 的 元凶,以这个为线索,找到你们自己包名下的类和方法,确定是我们自己的代码在不合理地创建对象.

再往后,就是根据各自的业务代码去做优化了,记住一个宗旨:不要让代码干多余的事。 如果是我们调用了系统的api导致了不合理地大量对象的创建,那么就要考虑这个系统API为什么会这样创建对象,有没有其他方法避免吗,从业务代码层来合理使用这个api,实在不行再考虑自定义api或者换个系统api。

在我们做了一次优化之后,再profile运行一次app,再重复上面的过程。以此类推,直到内存抖动达到理想状态。

总结

优化内存抖动,核心就是防止频繁创建对象。常见的反面教材就是:循环中创建对象,大量调用的api中创建对象。而优化的主要手段,就是对象复用,常见的手段是:对象池,像是 Handler的Message 单链表池,Glide的bitmap池等。

检测以及处理内存泄漏

经典案例: 处理 handler异步任务导致的内存泄漏方法

  • 在Activity的onDestroy中移除所有的任务
  @Override
  protected void onDestroy() {
        super.onDestroy();
        handler.removeCallbacksAndMessages(null);//移除所有任务
    }
  • 使用静态内部类 + Activity弱引用的方式
   MyHandler handler = new MyHandler(this);
   private  static class MyHandler extends Handler {
         WeakReference<Activity> activityWeakReference;
         MyHandler(Activity activity) {
               activityWeakReference = new WeakReference<>(activity);
         }
         @Override
         public void handleMessage(Message msg) {
               //在执行任务的时候,判断弱引用所关联的对象是否为空,能在对象已经被回收的情况下
               switch (msg.what) {
                   case 1:
                       if (activityWeakReference.get() !=null) {
                            //T0D0
                       }
               }
         }
    }
工具的使用

依然是 profileApp,先用 profile看出内存的变化情况。

问:如何判断内存泄漏?

答:内存泄漏是精细功夫,不能全盘观察,只能凭借profile的内存变化来推测。比如,打开app之后内存一路飙升,直到超出app能够使用的最大内存,app崩溃,,这是最明显的。又比如,你反复打开关闭某一个界面,发现内存的稳定线( 内存稳定之后,内存占用值)随着每一次的打开关闭,都在提高,这说明,这一个界面上存在泄漏,有对象无法被回收。

上一章节使用 profile 最多是了解到 哪些对象的创建和回收引起了内存抖动,但是,涉及到泄漏,只通过profile尚且 不能知道是 哪个类持有了希望被回收的对象的强引用. 这里就要借助另外一款工具,他的名字叫做 EclipseMat (自行百度)

先回到刚才的 profile

点一下,然后再点一下,界面会自动跳转:


点击上面的保存按钮,将文件存到本地;

然后:

但是这个文件是无法直接在mat打开的

找到SDK目录下的要 hprof-conv.exe:

使用cmd命令,对文件进行转换,命令为:hprof-conv[源文件名][目标文件名]如 hprof-conv1.hprof2.hprof回车

将得到的 2.hprof利用刚才下载的Mat工具打开:

这里有很多指标,但是检查内存泄漏,我们只需要关注这个直方图按钮即可:

这个图中会列出你dump的这一段内存中的所有对象,包括framework层的,也包括我们自己代码创建的对象

案例模拟

我模拟了一个经典案例,也就是前面提到的 Handler延时任务导致 Activity不能被释放,核心代码如下

 public class SecondActivity extends AppComatActivity {
     Handler handler = new Handler();
     //创建一个强引用Activity的handler对象
     @Override
     protected void onCreate (Bundle savedInstancestate) {
           super.onCreate(saveInstanceState);
           setContentView(R.layout.activity_second);
           handler.postDelayed(new Runnable() {
                   @Override
                   public void run() {
                    
                   }
           }, Integer.MAX_VALUE);
              //我让任务永远在这里
    }

我就用一个非常普通的方式创建了一个 handler对象,并且用它来执行一段延时任务,只不过,延时任务的延时时间是 Integer的最大值,也就是说,任务要很久以后才会执行。之后,我反复进出这一个 Activity,然后按照上面的方式 dump了一段 hprof,经过 hprof-conv 转化,然后用 Mat打开:结果如下

我填写过滤信息: SecondActivity 回车

在我们最终退出SecondActivity之后,内存中依然保留了 18个无用的对象。

那么是不是我们这18个都是泄漏的呢?
不一定

前文讲过,只有不合理的强引用,才会导致内存泄漏,所以我们要按照上面的方式排除软弱虚引用。之后我们能看到下面的界面,把能展开的信息尽数展开

了解 Handler源码的同志们应该一眼就看明白了, handler引起了内存泄漏,是因为存在不合理地强引用链, 上图中可以看出,最终是callback对象持有了 SecondActivity对象。

如何优化内存泄漏

我们刚才已经看到了Handler的不合理使用导致了内存泄漏,那么如果在 onDestroy中移除所有的任务

   @Override
    protected void onDestroy() {
          super.onDestroy();
          handler.removeCallbacksAndMessages(token.null):
    }
 }

执行同样的任务,dump下来的hprof 在mat触发了GC之后, SecondActivity数量变为了0,内存泄漏解决。

当然还有另一种做法,静态内部类+弱引用。

ps: 静态内部类是为了防止内部类持有外部类的引用,弱引用是为了在GC触发之时,回收掉WeakRefrence中的对象。

public class secondActivity extends AppCompatActivity {
      Handler handler = new Handler():
      @Override
      protected void onCreate(Bundle saveInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_second);
            handler.postDelayed(runnable, Integer.MAX_VALUE);
            //依旧是那个延时很久的任务
      }
      Runnable runnable = new MyRunnable(this);
      private static class MyRunnable implements Runnable {
              //静态内部类
             WeakReference<activity> activityWeakReference
             //弱引用
             MyRunnable(Activity activity) {
                      activityWeakReference = new WeakReference<>(activity);
             }
             @Override
             public void run() {
             }
 }



但是排除之后,一个都没有了。

小技巧

上面的步骤虽然可行,但是如果有很多页面都需要排查泄漏,那么我们一个一个页面去点开关闭,整个过程将会非常冗长难受。其实有办法解决。回到之前的直方图:

使用方法为:如果你想进行一个操作,你操作前后各dump一个hprof,命名为 before和after, 然后用hprof-conv转换一下,变为 before_ 和 after_,用eclipse mat同时打开这两个文件,然后切换到after.hprof ,点击上图中的按钮

它会让你选择想要对比的文件,点击before,然后过滤SecondActivity

这种方式可以在处理泄漏之前,事先排查可能泄露的代码区域。简化我们的优化工作。

结语

内存抖动和泄漏优化涉及到Jvm很多知识点,除了我之前列出的几点之外,还有很多细枝末节。要做好 内存优化,需要扎实的JVM知识基础。

请查看完整的PDF版

更多完整项目下载。未完待续。源码。图文知识后续上传github。
可以点击关于我联系我获取

Android App解决卡顿慢之内存抖动及内存泄漏(发现和定位) 内存抖动是指在短时间内有大量的对象被创建或者被回收的现象,内存抖动出现原因主要是频繁(很重要)在循环里创建对象(导致大量对象在短时间内被创建,由于新对象是要占用内存空间的而且是频繁,如果一次或者两次在循环里创建对象对内存影响不大,不会造成严重内存抖动这样可以接受也不可避免,频繁的话就很内存抖动很严重),内存抖动的影响是如果抖动很频繁,会导致垃圾回收机制频繁运行(短时间内产生大量对象,需要大量内存, 阅读详情

相关推荐

Android性能优化案例(3)内存抖动和泄漏的优化

优化内存抖动,核心就是防止频繁创建对象。常见的反面教材就是:循环中创建对象,大量调用的api中创建对象。而优化的主要手段,就是对象复用,常见的手段是:对象池,像是Handler的Message单链表池,Glide的bitmap池等。内存抖动和泄漏优化涉及到Jvm很多知识点,除了我之前列出的几点之外,还有很多细枝末节。要做好内存优化,需要扎实的JVM知识基础。

2501_90256460的博客 727

【Android性能优化面试题】内存优化,内存抖动和内存泄漏。

在Java中,每创建一个对象,就会申请一块内存,存储对象信息;每分配一块内存,程序的可用内存也就少一块;当程序被占用的内存达到一定临界程度,GC 也就是垃圾回收器(Garbage Collector)就会出动,来释放掉一部分不再被使用的内存。这本身没有问题,但是当频繁创建对象就会造成内存不断地攀升,在回收了之后又迅速涨起来,接着又一次的回收。在短时间内反复地发生内存增长和回收,这就是内存抖动(Memory Churn)。

datian1234的博客 249

Android性能优化案例(3)内存抖动和泄漏的优化(1)

优化内存抖动,核心就是防止频繁创建对象。常见的反面教材就是:循环中创建对象,大量调用的api中创建对象。而优化的主要手段,就是对象复用,常见的手段是:对象池,像是 Handler的Message 单链表池,Glide的bitmap池等。在这里小编整理了一份Android大厂常见面试题,和一些Android架构视频解析,都已整理成文档,全部都已打包好了,希望能够对大家有所帮助,在面试中能顺利通过。喜欢本文的话,不妨顺手给我点个小赞、评论区留言或者转发支持一下呗。

2401_84132544的博客 698

2023Android大厂面试题详解之内存优化,内存抖动和内存泄漏。(附面试题汇总)

在Java中,每创建一个对象,就会申请一块内存,存储对象信息;每分配一块内存,程序的可用内存也就少一块;当程序被占用的内存达到一定临界程度,GC 也就是垃圾回收器(Garbage Collector)就会出动,来释放掉一部分不再被使用的内存。这本身没有问题,但是当频繁创建对象就会造成内存不断地攀升,在回收了之后又迅速涨起来,接着又一次的回收。在短时间内反复地发生内存增长和回收,这就是内存抖动(Memory Churn)。

bugyinyin的博客 459

Android性能优化 内存抖动和内存泄漏优化案例

1、JVM内存管理常识 LMK (LowMemoryKill)机制 android底层会在系统内存告急的时候,按照一定规则杀死一些进程来满足其他进程的内存需要。其中 消耗内存的高低就是其中一项指标,所以,优化app的内存占用,能够有效降低app被系统杀死的概率。 GC STW机制 GC,垃圾回收进程,在GC线程执行任务的时候,会存在一个 STW (stop the world) 机制,他就会把其他所有线程都挂起。如果GC非常频繁地调用,那就会导致主线程不流畅,给用户的感觉就是卡顿。 内存抖动频繁引

ming15920的博客 368

Android内存优化指南:从数据结构到5R法则的全面策略

Android内存优化涉及多个方面,从选择合适的数据结构如ArrayMap和SparseArray以减少内存占用,到避免使用内存开销大的枚举类型。谨慎使用多进程和large heap选项,同时充分利用NDK进行内存管理。图片优化是关键,通过采样、缓存和格式转换等方式减少内存占用。此外,遵循5R法则——释放、回收、减少、重用和检查,确保资源得到有效管理。这些策略共同构成了一套全面的Android内存优化方案,有助于提升应用性能和用户体验。

帅次的博客 2784

Android内存抖动

什么原因导致‘内存抖动’ 内存回收是指在程序需要对象的时候,在堆当中分配出来一块空间,使用完毕以后,由 GC 帮我们清理掉这片内存空间。如果频繁的一直持续上述操作,就会引起内存抖动。也就是有源源不断的对象被创建,同时又有源源不断的对象被回收,这时候就会内存抖动。 安卓中内存抖动的影响 1.影响app响应速度。 2.app UI卡顿,甚至应用无响应。 为什么有这么大影响? 因为现在基本的jvm(比如cms)的垃圾回收处理器,需要停止工作业务线程,再进行垃圾回收. 如果回收的时间越久,app的所有

YoYo_Newbie的专栏 3127

【Android面试八股文】性能优化相关面试题: 什么是内存抖动?什么是内存泄漏?

在Java中,每创建一个对象,就会申请一块内存,存储对象信息;每分配一块内存,程序的可用内存也就少一块;当程序被占用的内存达到一定临界程度,GC也就是垃圾回收器(Garbage Collector)就会出动,来释放掉一部分不再被使用的内存。这本身没有问题,但是当频繁创建对象就会造成内存不断地攀升,在回收了之后又迅速涨起来,接着又一次的回收。在短时间内反复地发生内存增长和回收,这就是内存抖动(Memory Churn)。

字节卷动 1182

Android内存优化内存抖动的解决实战

它的功能是在一个TextView上显示一个计数器,每隔一秒钟就更新一次计数器的值。为了实现这个功能,我们使用了一个Handler来发送空消息,并在接收到消息时更新计数器的值,并再次发送空消息,形成一个循环。同时,为了模拟一些复杂的业务逻辑,我们在循环中创建了大量的数组对象。以下是我们的代码:

yihanss的博客 232

STM32按键中断切换红绿蓝灯

通过以上步骤,我们实现了使用STM32的按键中断来切换红绿蓝LED灯的功能。在实际应用中,可能还需要考虑更多的细节,如按键消抖、更精确的延时实现等。但上述代码提供了一个基本的框架和思路,可以根据具体需求进行扩展和优化。希望这篇博客对您有所帮助!

2301_79865940的博客 952

MIMIC数据库基本信息分析

一、MIMIC数据库中26张表介绍 数据库中一共有26张表,记录患者入院的各种信息,每张表的介绍如下所示。 表格名 信息 admission 患者基本信息,比如性别、种族、语言、宗教、婚姻、入院和出院时间、死亡时间等 callout 提供病人准备从ICU转出或者已经从ICU转出时相关信息 caregivers 记录医护人员信息(ID、类型、附加...

m0_37520426的博客 1万+

Android 内存优化:什么原因导致内存问题?通过内存工具进行分析;内存抖动和内存泄漏;MAT的使用;Profiler的使用;如何优化?

我们开发一个App程序,如果不了解内存的使用情况,就是将稳定性弃之不管。因为你不知道他在什么时候会发生OOM问题,不知道为什么程序会卡顿,不知道为什么会发生问题。你也没有自信跟别人说,你可以也出一个稳定可靠的App程序,所以这一篇文章,我们来研究一下内存优化。 Android进行内存优化是为了提高应用的稳定性、流畅性和存活时间,同时降低应用占用的ROM空间。

前期后期 2135

vscode+latex+bib文献管理

下载vscode 安装插件`` 在setting.json中配置 在.tex文件中编写论文内容,然后左侧TEX侧边栏中编译,如下图所示,中文用xelatex,英文用pdflatex;编译成功后,就可以查看pdf版本的论文了,我一般在浏览器显示。 涉及到文献编译:XXX.bib中存储文献管理内容;XXX.tex是文章内容,使用xelatex编译后会生成XXX.aux,ctrl+⋅ctrl+·ctrl+⋅打开命令行窗口,输入bibtex XXX(可以对aux文件进行编译,不需要加后缀),然后再xelatex.

小卜妞的博客 2545

一文了解安卓内存抖动

一文了解安卓内存抖动

似霰的博客 1495

万字长文,小白新手怎么开始做YOLO实验,从零开始教!整体思路在这里,科研指南针!

万字长文,小白新手怎么开始做YOLO实验,从零开始教!整体思路在这里,科研指南针!

Coding... 1万+

新能源汽车电机交流电流测量系统精度全链路分析

通过全链路误差建模与瓶颈分析,结合硬件选型优化与软件算法补偿,可将系统精度从4.2%提升至≤1% FS。本文所述方法论已应用于某800V电驱平台开发,实测电流控制精度达±0.8%,为高性能电机控制奠定基础。为例,深入剖析从互感器采集到CAN报文解析的全链路信号处理流程,揭示各环节误差来源及对最终精度的影响,为研发测试提供理论支撑。:±0.1%(电阻温漂与运放开环增益限制):运放增益带宽积(GBW)不足导致高频衰减。:±0.02%/℃(铁氧体材料温敏特性):±0.5%读数(磁芯饱和效应)

优快云-新能源汽车研发测试专业博主 1492

手把手讲解--性能优化案例(3)内存抖动和泄漏的优化

答应大伙的备战金三银四,大厂面试真题来啦!这份资料我从春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。给文章留个小赞,就可以免费领取啦~3000页Android开发者架构师核心知识笔记《960全网最全Android开发笔记》《379页Android开发面试宝典》

m0_60147147的博客 700

C# Winform使用Monaco打造代码编辑器

本文介绍了如何在Winform项目中集成Monaco代码编辑器。通过NuGet安装WebView2控件,创建monaco-editor.html文件加载编辑器,并实现与C#代码的交互。关键步骤包括:初始化WebView2环境、配置Monaco编辑器参数、设置代码变更监听事件以及处理C#与JavaScript之间的通信。注意事项提示了依赖库安装问题的解决方法。该方案实现了功能完整的代码编辑器,支持代码自动保存和实时显示功能。

遇见--专栏 346

内存指的是什么?一文带你了解Android的内存优化

前言 众所周知,内存优化可以说是性能优化中最重要的优化点之一,可以说,如果你没有掌握系统的内存优化方案,就不能说你对Android的性能优化有过多的研究与探索;本篇将带领大家一起来系统地学习Android中的内存优化 可能有不少读者都知道,在内存管理上,JVM拥有垃圾内存回收的机制,自身会在虚拟机层面自动分配和释放内存,因此不需要像使用C/C++一样在代码中分配和释放某一块内存 Android系统的内存管理类似于JVM,通过new关键字来为对象分配内存,内存的释放由GC来回收; 并且Android系统在内

m0_70748458的博客 682

物理信息神经网络(PINN)文献综述 —— 原理、严格推导与优化训练策略

本章系统阐述物理信息神经网络的理论基础、主要算法改进与训练策略。内容涵盖:PINN 的数学表述与残差构造;损失与梯度的逐步推导;训练困难(梯度消失/爆炸、损失幅度不平衡、频谱偏差、采样效率低等)的定量分析;四类核心解决方案(动态损失加权、梯度归一化与预条件化、自适应采样、分阶段/分域训练)的详细推导与实现要点;以及若干关键算法的伪代码与收敛性形式结论。所有涉及推导的步骤均按顺序展开,给出必要的数学依据与结论性陈述,可直接作为教学或参考章节使用。

u012133341的博客 422

手把手教你学Simulink--基于Simulink的高增益DC-DC变换器仿真建模

特点高电压增益:可以在不使用变压器的情况下实现较大的电压升压比。适用于低电压源:如太阳能电池板、燃料电池等提供的低压直流电源。效率问题:设计时需特别注意提高效率,减少能量损失。挑战电路复杂性:通常涉及多个电感和电容,以及复杂的开关模式。元件选择:合适的元件参数对于达到理想性能至关重要。控制策略:确保高效稳定运行的同时,适应负载变化。首先明确要模拟的任务内容。实现特定的电压增益比(例如从24V升至380V)。根据预期的输入输出电压确定合适的电路拓扑和元件值。

MHD0815的博客 173

Android性能优化案例(3)内存抖动和泄漏的优化,kotlin线程锁

在Activity的onDestroy中移除所有的任务 @Override protected void onDestroy() { super.onDestroy(); handler.removeCallbacksAndMessages(null);//移除所有任务 } 使用静态内部类 + Activity弱引用的方式 MyHandler handler = new MyHandler(this); private static class MyHandler extends Handl..

m0_63935442的博客 1973

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Android进阶——性能优化之内存泄漏和内存抖动的检测及优化措施总结(七)

上一篇Android进阶——性能优化之内存管理机制和垃圾回收机制(六)简述了Java内存管理模型、内存分配、内存回收的机制的相关知识,相信对于内存溢出也有了稍深的了解和体会,这一篇将从检测、解决内存泄漏进行总结。 一、Java的引用概述 通过A能调用并访问到B,那就说明A持有B的引用,或A就...

测试0901-1 491

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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

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

最新Android性能优化案例(3)内存抖动和泄漏的优化(1),阿里面试轮次

内存抖动和泄漏优化涉及到Jvm很多知识点,除了我之前列出的几点之外,还有很多细枝末节。要做好 内存优化,需要扎实的JVM知识基础。

2401_84545747的博客 668

Android 内存优化

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

十年代码写十年 2743
上一篇: Android Muitldex热更新修复方案原理
下一篇: 通过AOP的思想 打造万能动态权限申请框架Demo完全解析
初壹十五a
博客等级 码龄8年 146粉丝 257原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值