首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android 进阶解密笔记-热修复

但是,如果有一个后台线程做耗时操作,导致生命周期比Activity长,造成GC无法回收Activity,就造成内存泄漏。 内存泄漏后果 它是造成应用程序OOM的主要原因之一。...并且此时handler还持有activity的引用,也是造成内存泄漏的一个原因(不是根本原因)。...就执行了退出操作,这时候线程的生命周期比activity长,又AsyncTask依然持有对MainActivity的引用,最后导致MainActivity无法被GC回收引发内存泄漏。...值得注意的是,关闭的语句必须在finally中进行关闭,否则有可能因为异常未关闭资源,致使activity泄漏。...void onDestroy() {     super.onDestroy();     mAnimator.cancel(); } 系统bug之InputMethodManager导致内存泄漏 每次MainActivity

38020
您找到你想要的搜索结果了吗?
是的
没有找到

Android 内存泄漏

但是,如果有一个后台线程做耗时操作,导致生命周期比Activity长,造成GC无法回收Activity,就造成内存泄漏。 内存泄漏后果 它是造成应用程序OOM的主要原因之一。...并且此时handler还持有activity的引用,也是造成内存泄漏的一个原因(不是根本原因)。...就执行了退出操作,这时候线程的生命周期比activity长,又AsyncTask依然持有对MainActivity的引用,最后导致MainActivity无法被GC回收引发内存泄漏。...值得注意的是,关闭的语句必须在finally中进行关闭,否则有可能因为异常未关闭资源,致使activity泄漏。...void onDestroy() {     super.onDestroy();     mAnimator.cancel(); } 系统bug之InputMethodManager导致内存泄漏 每次MainActivity

1.9K30

Android最佳性能实践(二)——分析内存的使用情况

而自2.3之后,GC操作改成了并发的方式进行,就是说GC的过程中不会影响到应用程序正常运行,但是在GC操作的开始和结束的时候会短暂阻塞一段时间,不过优化到这种程度,用户已经是完全无法察觉到了。...好的,通过日志的方式我们可以简单了解到系统的GC工作情况,但是如果我们想要更加清楚地实时知晓当前应用程序的内存使用情况,只通过日志就有些力不从心了,我们需要通过DDMS中提供的工具来实现。...但是目前MAT还是无法打开这个文件的,我们还需要将这个HPROF文件Dalvik格式转换成J2SE格式,使用hprof-conv命令就可以完成转换工作,如下所示: hprof-conv dump.hprof...Thread,并不是System Class了,那么由于MainActivity$LeakClass能被GC Roots访问到导致不能被回收,导致它所持有的其它引用也无法被回收了,包括MainActivity...但是大家有没有注意到,当前内存中是有11个MainActivity的实例的,这太不正常了,通过情况下一个Activity应该只有一个实例才对。

1.5K60

Android性能优化:手把手带你全面了解 内存泄露 & 解决方案

应用程序的影响 容易使得应用程序发生内存溢出,即 OOM 内存溢出 简介: 3....泄露原因 若1个对象已不需再使用 而单例对象还持有该对象的引用,那么该对象将不能被正常回收 从而 导致内存泄漏 实例演示 // 创建单例时,需传入一个Context // 若传入的是...& 外部类需销毁时, 由于 工作线程实例 持有外部类引用,将使得外部类无法被垃圾回收器(GC)回收,从而造成 内存泄露 多线程主要使用的是:AsyncTask、实现Runnable接口 & 继承Thread...Thread类属于非静态内部类 / 匿名内部类,运行时默认持有外部类的引用 // 当工作线程运行时,若外部类MainActivity需销毁 // 由于此时工作线程类实例持有外部类的引用,将使得外部类无法被垃圾回收器...对于 文件流File:关闭流 InputStream / OutputStream.close() // 对于数据库游标cursor:使用后关闭游标 cursor.close() // 对于 图片资源

68830

Android性能优化之内存泄漏,你想要的这里都有~

应用程序的影响 容易使得应用程序发生内存溢出,即 OOM 内存溢出 简介: 1.png 3....泄露原因 若1个对象已不需再使用 而单例对象还持有该对象的引用,那么该对象将不能被正常回收 从而 导致内存泄漏 实例演示: // 创建单例时,需传入一个Context // 若传入的是Activity...& 外部类需销毁时, 由于 工作线程实例 持有外部类引用,将使得外部类无法被垃圾回收器(GC)回收,从而造成 内存泄露 多线程主要使用的是:AsyncTask、实现Runnable接口 & 继承Thread...Thread类属于非静态内部类 / 匿名内部类,运行时默认持有外部类的引用 // 当工作线程运行时,若外部类MainActivity需销毁 // 由于此时工作线程类实例持有外部类的引用,将使得外部类无法被垃圾回收器...File:关闭流 InputStream / OutputStream.close() // 对于数据库游标cursor:使用后关闭游标 cursor.close() // 对于 图片资源Bitmap

73030

❤️Android 性能优化之启动优化❤️

用户不会在乎你的项目是不是过大,里面是不是有很多初始化的逻辑。他只在乎你-慢了。...冷启动 冷启动是指应用从头开始:冷启动发生在设备启动后第一次启动应用程序 (Zygote>fork>app) ,或系统关闭应用程序后。 在冷启动开始时,系统有三个任务。...热启动 热启动时,系统将应用后台拉回前台,应用程序的 Activity 在内存中没有被销毁,那么应用程序可以避免重复对象初始化,UI的布局和渲染。 如果 Activity 被销毁则需要重新创建。...在应用程序执行延迟加载的情况下,这可能很有价值。在延迟加载中,应用程序不会阻止窗口的初始绘制,而是异步加载资源并更新视图层次结构。 这里我在Activity.onCreate()中加了个工作线程。...不要创建全局静态对象,而是转向单例模式,应用程序只在第一次需要时初始化对象。 此外,考虑使用依赖注入框架(如Hilt) 繁琐的Activity初始化 活动创建通常需要大量高开销工作

84560

Android通知栏微技巧,8.0系统中通知栏的适配

而如果一个App经常给我推送垃圾信息却又无法关闭时,我会直接将它的通知总开关给关掉,如果还不是什么重要的App的话,那么我可能就直接将它卸载掉了。 为什么一个很好的通知栏功能现在却变得这么遭用户讨厌?...当然,Google也并没有完全做绝,即使方法标为了废弃,但还是可以正常使用的。...可是如果你将项目中的targetSdkVersion指定到了26或者更高,那么Android系统就会认为你的App已经做好了8.0系统的适配工作,当然包括了通知栏的适配。...想一想我们开发的是一个类似于微信的App,聊天消息是至关重要的,如果用户不小心将聊天消息的通知渠道给关闭了,那岂不是所有重要的信息全部都丢了?为此我们一定要保证用户打开了聊天消息的通知渠道才行。...因为Google为了防止应用程序随意地创建垃圾通知渠道,会在通知设置界面显示所有被删除的通知渠道数量,如下图所示: ?

2.8K40

测试应用启动性能

而且这种操作不具备一致性,且有许多难以预测的因素,因为很容易就会引入变量——如您偶然间错误地启动了另一个应用,或者使系统做了额外的工作无法获得计时结果。...您需要专注于最坏情况的统计数据,而不是状况最好的热启动。如果您忽略最坏情况,许多重大问题将无法被解决。 为了在每次运行时强制进行冷启动,您需要在两次运行期间终止应用。...Locked CPUs 4,5,6,7 to 1267200 / 2457600 KHz Disabled CPUs 0,1,2,3 这段输出表明 benchmark 可以在我的 Pixel 2 上正常工作...我不知道系统在过热时将如何响应 (希望它会降低主频或在出现严重问题之前自动关闭系统),但是我也不想知道答案。 请注意,完成测试后,您需要将主频解锁。...(但是知道事情的工作原理和原因总是更有趣,不是吗?) 您真正需要的只是 for() 循环 shell 命令,以及可选的锁定主频的方法。

35210

Android-App性能优化

上一篇我们讲了java的引用机制,今天我们来一下和它有关的app性能优化(其实也不是很大)。...如果某个操作花费的时间是 24ms ,系统在得到 VSYNC 信号时就无法正常进行正常渲染,这样就发生了丢帧现象。...你比如,我用户Back退出应用程序,然后又重新启动,应用程序会再次执行Activity的onCreate(),但会Bundle(savedInstanceState)获取数据,我们平时应用成勋崩溃,不也是通过该方法保存数据的吗...集合类泄漏 单例/静态变量造成的内存泄漏 匿名内部类/非静态内部类 资源未关闭造成的内存泄漏 解决方式: 比如我们的List集合add()元素之后,会引用着集合元素对象,导致该集合中的元素对象无法被回收...比如Toast,我们传入的是MainActivity,但MainActivity没有用了,需要被销毁,但我们的Tost依然持有其引用导致无法回收,这就导致了内存泄漏。

2.1K40

Carson带你学Android:这里涵盖了所有实现 “一键退出 App” 的方法

Intent.FLAG_ACTIVITY_SINGLE_TOP:若启动的Activity位于任务栈栈顶,那么此Activity的实例就不会重建,而是重用栈顶的实例( 调用onNewIntent()) 具体使用(MainActivity...(入口Activity) 跳转到 Activity2 & 一键退出) 步骤1:在MainActivity 中设置 重写 onNewIntent() MainActivity.java...的上层的Activity2会被销毁,此时MainActivity位于栈顶;由于步骤2的设置,所以不会新建MainActivity而是重用栈顶的实例&调用实onNewIntent()...System.exit(0):正常退出; // 2. System.exit(1):非正常退出,通常这种退出方式应该放在catch块中。...一旦发现进程被非正常结束,它将会试图去重启这个进程。

73220

Android小技巧: 这里涵盖了所有实现 “一键退出 App” 的方法

Intent.FLAG_ACTIVITY_SINGLE_TOP:若启动的Activity位于任务栈栈顶,那么此Activity的实例就不会重建,而是重用栈顶的实例( 调用onNewIntent()) 具体使用(MainActivity...(入口Activity) 跳转到 Activity2 & 一键退出) 步骤1:在MainActivity 中设置 重写 onNewIntent() MainActivity.java...优点 应用场景广泛:兼顾单 / 多任务栈 & 多启动模式的情况 缺点 需要 Activity 经历正常的生命周期,即创建时调用onCreate(),结束时调用onDestroy() 因为只有这样经历正常的生命周期才能将...System.exit(0):正常退出; // 2. System.exit(1):非正常退出,通常这种退出方式应该放在catch块中。...一旦发现进程被非正常结束,它将会试图去重启这个进程。

1.8K42

Handler 番外篇

答:当 Activity 被以非正常的形式关闭的时候。 首先生命周期也是也只是个方法,也是被另外的方法所调用,当一切正常,那么确实可以保证一切生命周期都按约定执行。...但是如果一个 Activity 不是正常关闭,那么生命周期就不会被正常执行了。 那么什么是非正常关闭呢?举两个例子。..."最近使用列表"里手动移除 App,一般按菜单键会出现最近使用的 App 列表页面 清理 App,现在很多手机都有 "一键清理" 清理的功能,被清理掉的 App 就 是非正常关闭了 如何复现?...找一台有上述功能的手机,然后写个 Demo, MainActivity 打开 AActivity , 再打开一个 BActivity,并在生命周期里打上日志,然后手动杀死 App,观察日志。...推广很难,感谢理解与支持,所以以下不是广告,是我付出的努力,谢谢。

38020

MONGODB 复制集 DOWN DOWN 机了, 5种情况与系统恢复

全部三台DOWN机后如何恢复,最快让应用可以进行工作 4 测试的方法,写PYTHON程序,通过程序的连接复制集的方式来进行,而不是单机的方式来连接,因为最终我们是要对应用程序负责的....Hang住, 应用程序没有响应,显示TIMEOUT, 读取也无法进行,此时数据库进入无法为应用提供工作的状态 ?...2 如果无法恢复2台库的情况下 4 一主一关闭的情况下,系统的状态与两DOWN机后的状态一致,无法提供正常的数据库服务. ? 5 全部机器DOWN 机,则无法提供服务....应用就会恢复正常工作见上图 ? 以上就是在MONGODB 出现问题后, 各种情况以及各种处理的意见,最终的目的就是让业务尽快的恢复工作....那怎么办 1 关闭已经单机工作的MONGODB 2 将他的数据拷贝到其他两台机器 3 先启动MONGODB 的主库(权重最大的) 2 然后在启动原有的库们 整体系统恢复 ? ?

47130

Android 关于内存泄露,你必须了解的东西

前言 内存管理的目的就是让我们在开发过程中有效避免我们的应用程序出现内存泄露的问题。内存泄露相信大家都不陌生,我们可以这样理解:「没有用的对象无法回收的现象就是内存泄露」。...但是过多的单例会让内存占用过多,而且单例模式由于其 静态特性,其生命周期 = 应用程序的生命周期,不正确地使用单例模式也会造成内存泄露。...的构造函数中,将 context.getApplicationContext() 赋值给 mContext,此时单例引用的对象是 Application,而 Application 的生命周期本来就跟应用程序是一样的...解决方法:在集合元素使用之后集合中删除,等所有元素都使用完之后,将集合置空。...objectList.clear(); objectList = null; 4、其他的情况 除了上述 3 种常见情况外,还有其他的一些情况 1、需要手动关闭的对象没有关闭 网络、文件等流忘记关闭

1.1K10

Android基础总结(8)——服务

服务的运行不依赖任何用户界面,即使当程序被切换到后台,或者用户打开了另外一个应用程序,服务仍然能够保持正常运行。...不过需要注意的是:服务并不是运行在一个独立的进程当中,而是依赖于创建服务的应用程序进程,当某个应用程序进程被杀掉时,所有依赖于该进程的服务也会停止运行。   ...我们都知道,为了能让电池更加耐用,每种手机都会有自己的休眠策略,andorid手机就会在长时间不操作的情况下自动让cpu进入的到睡眠状态,这就有可能导致Timer中的定时任务无法正常运行。...而Alarm机制不存在这种情况,它具有唤醒cpu的功能,即可以保证每次需要执行定时任务的时候cpu都能正常工作。需要注意,这里的唤醒cpu和唤醒屏幕完全不是同一个概念,不要弄混淆了。   ...另外需要注意的是,android4.4版开始,Alarm任务的触发时间将会变得不准确,有可能会延迟一段时间后任务才能得到执行。这并不是bug,而是系统在耗电方面进行的优化。

1.5K80

提高APP安全性的必备加固手段——深度解析代码混淆技术

例如: # 避免混淆指定的类名或方法名 ​ -keep class com.example.MainActivity // 保留 MainActivity 类名不混淆 -keepclassmembers...防反编译,dex加固实战代码分析 防止反编译是 iOSAPP 加固中的一项重要工作,而 dex 文件加固则是防御反编译的一种实现方式。...编辑 需要注意的是,这种加固方式不能完全杜绝反编译,但是可以大大增加反编译难度,让黑客无法轻易地获取 APK 中的代码。此外,增加代码混淆也是防止反编译和保护源代码的一种重要手段。...在使用加固技术时,需要注意以下几点: 加固技术不能完全杜绝破解行为,只能增加攻击者的难度,在应用程序开发过程中需多个方面提高应用程序的安全性。...加固可能会对应用程序的性能和稳定性产生影响,需要在加固的同时保证应用程序正常运行。 加固需要经过充分测试与验证,确保应用程序没有异常,预期功能都正常运行。

29020

Android 四大组件之Activity

字面的意思去理解,Activity具有活动的意思,我们在应用中进行的操作都是集中在Activity上面完成,例如拨号、拍照、发送email、看地图。...一个应用程序通常由多个activities组成,他们通常是松耦合关系,通常一个应用程序包含有一个主Activity,即点击桌面图标的时候首先进入的Activity。...在这个方法中做一些初始化工作,比如调用setContentView去加载界面布局,初始化Activity所需要的数据等。后续调用onStart()。...SingTop (栈顶复用模式) 栈顶复用模式,系统启动时,系统会启动当前栈顶Activity是不是要启动的Activity,如果是则不需要创建新的Activity而直接引用这个Activity,如果不是那么创建新的...Intent.setFlags 方式无法指定 SingleInstance 模式,SingleInstances 只能在 AndroidManifest.xml 中声明。

79500

Android四大组件之Activity

字面的意思去理解,Activity具有活动的意思,我们在应用中进行的操作都是集中在Activity上面完成,例如拨号、拍照、发送email、看地图。...一个应用程序通常由多个activities组成,他们通常是松耦合关系,通常一个应用程序包含有一个主Activity,即点击桌面图标的时候首先进入的Activity。...在这个方法中做一些初始化工作,比如调用setContentView去加载界面布局,初始化Activity所需要的数据等。后续调用onStart()。...SingTop (栈顶复用模式) 栈顶复用模式,系统启动时,系统会启动当前栈顶Activity是不是要启动的Activity,如果是则不需要创建新的Activity而直接引用这个Activity,如果不是那么创建新的...Intent.FLAG_ACTIVITY_NO_HISTORY //方式无法指定 SingleInstance 模式,SingleInstances 只能在 AndroidManifest.xml 中声明

72620
领券