首页
学习
活动
专区
圈层
工具
发布

如何用 Android vitals 解决应用程序的质量问题

发生冻结时,如果你的应用位于前台,会弹出对话框让用户选择关闭应用或等待响应。从用户的角度来看,这种行为与应用崩溃一样糟糕。...对于用户来说,ANR 是当他们尝试与你的应用进行交互时,该界面被冻结。界面保持冻结几秒钟后,会显示一个对话框,让用户选择等待或强制应用程序退出。...如果用户使用的设备闪存很慢怎么办?如果他们的设备受到来自其他应用程序同时读取和写入的巨大压力,而你的应用程序在队列中等待执行“快速”读取操作时又该怎么办?切勿在主线程上执行读写操作。...在主线程上执行长时间计算。那么内存里的计算会怎么样呢?RAM 不会受长时间访问的影响,较小的操作应该没问题。但是,当你开始在循环中执行复杂计算或处理大型数据集时,可以轻松阻塞主线程。...在最糟糕的情况下,它甚至可能导致死锁,线程之间互相阻塞永久等待下去。最好不要自己设计同步,使用专门的解决方案会更好一些,比如 Handler,从后台线程传递不可变的数据到主线程。

3.6K10

Windows异步IO与消息循环的深度对话

序幕:两个程序员的对话小王:老张,我最近写了个管道通信程序,异步I/O发送数据,但UI会冻结,怎么办?老张:哦,这是经典的Windows编程问题。...如果队列有10条消息,你只处理1条就回去等待,系统立即又告诉你"有消息",你就陷入消息循环,永远不检查I/O了!小王:啊?那怎么办?...情况九:句柄过滤的盲区老张:如果你只处理主窗口消息,那么:工具提示消息上下文菜单消息COM激活消息都可能被忽略。第四幕:构建健壮的解决方案小王:这么多坑!到底怎么写才安全?...有没有更简单的方法?老张:有!问题的根源在于把UI线程和I/O等待耦合。...掌握了这些原则,你就能写出既流畅又可靠的应用程序。这场对话后,小王重构了他的代码,应用了有界消息处理和定期I/O检查,程序再也没有出现过UI冻结或I/O超时的问题。

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

    干货 | KotlinNative 异步并发模型初探

    对象冻结,即一个对象被创建之后即与当前线程/Worker 绑定,在不加特殊标记的情况下,在其他线程/Worker 访问该对象(无论是读还是写)就会抛出异常。...在这里我给出的建议是,如果能用语言机制规避的风险,就不要交给"人",因此,在 99.99% 的情况下,都应该尽量使用 SAFE模式,虽然 SAFE 模式对于对象的传递在语法上有更严格的限制,但是如果为了图方便使用...对于单例(使用 object 关键字声明的),在不加任何特别注解的情况下,它都是冻结的,你可以认为它是一个默认添加了 @SharedImmutable注解的全局变量,但如果有特别的需要,也可以给单例添加...4)由于 Dispatchers.Default 与 Dispatchers.Main 调度器指向的线程发生了破坏性变更,如果您之前已经在工程中使用了主分支的单线程版线程,可能会面临代码迁移的问题。...,还要等待官方后续推出更加稳定的版本。

    2.2K20

    垃圾回收器为什么必须要停顿下?

    这里说的一致性就是根节点枚举分析期间执行子系统看起来就像被冻结在某个时间点上,不会出现一边分析,根节点的对象引用关系还在不断的变化的情况。...怎么到达安全点? 在实际情况下,是不可能在发生垃圾收集的时候所有的线程都正好在安全点,所以就需要线程都跑到最近的安全点然后停顿下来。...主动式中断(Voluntary Suspension): 在垃圾收集需要中断线程的时候,不直接对线程操作,仅简单的设置一个标志位,各个线程执行过程时会不停的主动去轮询这个标志,一旦发现中断标志为true...但在实际情况下,如果线程处于sleep 或Blocked状态的话是没有分配CPU时间的,这时线程是无法响应虚拟机的中断请求,不能再走到安全点进行挂起,而虚拟机也不能持续的等待线程被重新激活分配CPU。...如果完成了,那线程就会继续执行。否则就必须一直等待,直到收到可以离开安全区域的信号。 结尾 看完这些,你能回答下面的问题吗! 垃圾收集器为什么必须要停顿下? 安全点和安全区域的区别?

    1.1K11

    JS在浏览器和Node下是如何工作的?

    当然,由于 Chrome 还实现了 one-process-per-site 策略,打开同一域名页面的不同 tabs 间也会共享同样的 JS 执行线程,所以这样的 tabs 也将被冻结。...要形象化的了解 JS 如何执行一段程序,需要理解其运行时: ? 和其他任何编程语言一样,JS 运行时包含一个栈(stack)和一个堆(heap)存储。关于堆的解释不展开了,我们说说 栈 。...譬如,chrome 用的是 Google 自个儿开发的 V8 JavaScript engine。但你猜怎么着,浏览器不只有这一个 JS 引擎呢,其底层机制大概是这样的: ?...在 Node.js 中会怎样 当同样的事情发生在 Node.js 中时,就得做的更多些了 -- 因为 node 所承诺的能力也更强。在浏览器中,我们被能在后台做什么掣肘。...但在 node 中,能在后台做到几乎大部分的事情,尽管那只是个简单的 JS 程序。但是,这是如何做到的呢?

    2.8K10

    简历上写精通多线程!却不知道:多线程为什么会有并发问题?

    线程的工作内存中保存了该线程中用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存。...可见性:多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。 有序性:程序执行的顺序按照代码的先后顺序执行。 三、怎么做,才能解决止并发问题?...重量级锁:如果线程A和线程B同时访问同步代码块,则轻量级锁会升级为重量级锁,线程A获取到重量级锁的情况下,线程B只能入队等待,进入BLOCK状态。...:我在等待通知的到来... lock 我要通知在等待的线程,condition.signal() unlock 测试Condition的线程:等到通知了,我继续执行>>> unlock 复制代码 上面演示了...和signal方法之前,必须调用lock方法获得对象监视器 四、并发包 通过上面分析,并发严重的情况下,使用锁显然效率低下,因为同一时刻只能有一个线程可以获得锁,其它线程只能乖乖等待。

    1.1K30

    Java分布式面试题集合(收藏篇)

    比如,冻结库存的字段, prepare _ remove _ stock 字段,将冻结的库存 2 清零。...同样地,如果我想从集群中移除节点 A ,我只需要移动 A 的哈希槽到 B 和 C。当节点 A 变成空的以后,我就可以从集群中彻底删除它。...由于缓存不命中,并且出于容错考虑,如果从数据库查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,失去了缓存的意义。 问:怎么解决缓存穿透?...只有是当前线程获取的锁,当前线程才可以删除。 问:Redis 分布式锁,怎么保证可重入性? 可以将锁的 value 设置为 Json 字符串,在其中加入线程的 id 和 count 变量。...sprin-Kafka 中的 offset 提交策略可以保证一批消息数据没有完成消费的情况下,也能提交 offset ,从而避免了提交失败而导致永远重复消费的问题。 问:怎么避免重复消费?

    1.4K30

    不讲武德,Java分布式面试题集合含答案!

    比如,冻结库存的字段, prepare _ remove _ stock 字段,将冻结的库存 2 清零。...同样地,如果我想从集群中移除节点 A ,我只需要移动 A 的哈希槽到 B 和 C。当节点 A 变成空的以后,我就可以从集群中彻底删除它。...由于缓存不命中,并且出于容错考虑,如果从数据库查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,失去了缓存的意义。 问:怎么解决缓存穿透?...只有是当前线程获取的锁,当前线程才可以删除。 问:Redis 分布式锁,怎么保证可重入性? 可以将锁的 value 设置为 Json 字符串,在其中加入线程的 id 和 count 变量。...sprin-Kafka 中的 offset 提交策略可以保证一批消息数据没有完成消费的情况下,也能提交 offset ,从而避免了提交失败而导致永远重复消费的问题。 问:怎么避免重复消费?

    69020

    MySQL实战第二十九讲-如何判断一个数据库是不是出问题了?

    主备切换有两种场景,一种是主动切换,一种是被动切换。而其中被动切换,往往是因为主库出问题了,由 HA 系统发起的。 这也就引出了我们今天要讨论的问题:怎么判断一个主库出问题了?...因为,一个机器的 CPU 核数有限,线程全冲进来,上下文切换的成本就会太高。 所以,通常情况下,我们建议把 innodb_thread_concurrency 设置为 64~128 之间的值。...因为,进入锁等待的线程已经不吃 CPU了,更重要的是,必须这么设计,才能避免整个系统锁死。 为什么呢?假设处于锁等待的线程也占并发线程的计数,你可以设想一下这个场景: 1. ...为了让主备之间的更新不产生冲突,我们可以在 mysql.health_check 表上存入多行数据,并用 A、B 的 server_id 做主键。...今天,我想问你的是:业务系统一般也有高可用的需求,在你开发和维护过的服务中,你是怎么判断服务有没有出问题的呢? 问题答案: 方案一:利用服务状态和服务质量的监控。

    61010

    分布式系统架构,回顾2020年常见面试知识点梳理(每次面试都会问到其中某一块知识点)

    比如,冻结库存的字段, prepare _ remove _ stock 字段,将冻结的库存 2 清零。...同样地,如果我想从集群中移除节点 A ,我只需要移动 A 的哈希槽到 B 和 C。当节点 A 变成空的以后,我就可以从集群中彻底删除它。...由于缓存不命中,并且出于容错考虑,如果从数据库查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,失去了缓存的意义。 问:怎么解决缓存穿透?...只有是当前线程获取的锁,当前线程才可以删除。 问:Redis 分布式锁,怎么保证可重入性? 可以将锁的 value 设置为 Json 字符串,在其中加入线程的 id 和 count 变量。...sprin-Kafka 中的 offset 提交策略可以保证一批消息数据没有完成消费的情况下,也能提交 offset ,从而避免了提交失败而导致永远重复消费的问题。 问:怎么避免重复消费?

    77800

    mysql主从同步(5)-同步延迟状态考量(seconds_behind_master和pt-heartbea)

    但是经验告诉我,仅仅依靠Seconds_Behind_Master的值来监测主从同步数据是否延迟是绝对不可靠的!!!...MySQL复制线程会自动将目前复制位置记录下来,在主备复制中断的时候自动连上主库,并从上次中断的位置重新开始复制。这些操作都是全自动化的,不需要人为的干预。...那么MySQL具体是怎么“推”的列呢?...而备库只能在默认的3600s后主动地重新去连接主库,届时它才会发现主库的数据有变动了,才会自动同步过来,这是需要等待很长时间。...那么像上面说的这种情况下, Seconds_Behind_Master就无法用来真实的衡量主备之间的复制延迟了。

    1.9K80

    RAC Object Remastering (Dynamic Remastering)

    此块不在任何实例的buffer cache中,但是实例3是这个块的属主,所以只需要消耗少量GC消息和等待而获得本节点的affinity locks,然后将数据块从磁盘读到缓存中来。...但实际上会有几个问题: 1.重启以后实例不会记住之前的属主情况。这意味着每次重新启动实例都需要重新学习对象的属主情况图。我能预计想要记住属主情况是比较复杂的,但是我认为还是有可能实现的。...我们不希望任何对象都能成为候选者而发生remastering,也就是说,如果仅仅是实例1在某对象上打开了101个BL锁而实例2打开了50个BL锁,那么我们不希望触发该对象的remastering。...以下AWR报告显示了DRM重配置问题导致的实例冻结。同样类型的冻结在其它的所有节点上也都可以看见。gc buffer busy等待只是DRM冻结的副作用(不是总有,但是在这个case是这样)。 ?...我创建了一个活动事务在一个节点上产生了200K回滚数据块,然后另外一个节点在读这个表,我观察到在回滚数据块上有大量等待。但是我没有发现这个回滚段上有任何remastering事件。

    1.1K30

    Android vitals 帮您解决应用质量问题

    在界面冻结时,若您的应用在前台运行,会出现对话框提醒用户 “关闭应用” 或者 “等待响应”。对用户而言,此类行为和应用崩溃一样糟糕。...它又是怎么影响到用户的呢? 对用户而言,ANR 就是指当他们试图与应用进行交互时,但界面卡住的事件。界面卡屏几秒后,会出现对话框让用户选择继续等待或者强行停止应用。...那么内存计算又是怎么一回事呢?访问时间长并不会对内存造成影响,较小的操作应该也没什么问题。但是如果您开始循环运行复杂计算并且处理大数据集,主线程就很容易发生阻塞了。...在最糟糕的情况下,可能会出现死锁问题,即不同线程相互卡死。最好不要自己设计同步,建议使用专门的解决方案,比如说 Handler,将不可变数据从后台线程传回主线程。...SharedPreferences 又怎么处理呢? 如果您是在后台读取数值的话,您能在前台调用 getSharedPreferences 吗? 这两种情况都很可能导致长时间阻塞操作。

    2.1K10

    深入解析volatile关键字

    然后我们再开另外一个线程,把stopSignal改成true。如果按照正常的情况下,应该是先打印“给我停下来”,然后再打印10个“我停下来了”,最后结束进程。我们看看具体情况如何。...线程无法访问另一个线程的数据,这也就是为什么线程私有的数据不存在并发问题。 那为什么不直接从主内存修改数据,而要先在工作内存修改后再写回主内存呢?这就涉及到了高速缓冲区的设计。...因而,只有必须使用volatile的地方,才使用他。 volatile修饰的变量一定是线程安全吗 首先明确一下,怎么样才算是线程安全?...一个操作要符合原子性,要么不执行,要么一次性执行完成,在执行过程中不会受其他操作的影响。 对于变量的修改相对于其他线程必须立即可见。 代码的执行在其他线程看来要满足有序性。...通俗点来讲,就是运算不需要依赖于任何状态的运算。因为依赖的状态,可能在运算的过程中就已经发生了变化了,而处理器并不知道。

    53610

    JUC系列(二)回顾Synchronized关键字

    多线程一直Java开发中的难点,也是面试中的常客,趁着还有时间,打算巩固一下JUC方面知识,我想机会随处可见,但始终都是留给有准备的人的,希望我们都能加油!!!...,因为一个如果某一块代码被synchronized 修饰了,当某一个线程进入了synchronized 修饰的代码块,那么其他线程只能一直等待,等待获取锁的线程释放锁,才能进入再次进入同步代码块。...那么你试想一个如果获取到锁的这个线程,由于一些等待IO原因或其他原因被堵住了,但是又不能释放锁,其他线程就只能在synchronized的门口看着啦,你想一下这个效率吧,出现一次,可能就把人心态玩没啦哈...因此非常需要有一种机制能够不让等待的线程一直无限期的等待下去,比如改成等待一段时间或者响应中断,该怎么做呢? 我们可以通过Lock来做这件事情。...最近在持续更新中,如果你觉得对你有所帮助,也感兴趣的话,关注我吧,让我们一起学习,一起讨论吧。 你好,我是博主宁在春,Java学习路上的一颗小小的种子,也希望有一天能扎根长成苍天大树。

    34130

    DAY63:阅读Execution Environment

    请注意的是, 你不需要手工使用一次最后的cudaDeviceSynchronize()去等待(该函数是能在设备端使用的Runtime API的子集的其中一个函数),这种等待是自动的.以及, 这里的父kernel...关于ordering这里, 还需要说一点.刚才说了, 如果中途要求进行同步等待, 会*可能*导致父kernel的block被切换到显存冻结状态, 暂停执行(例如资源不足的时候).如果中途不要求进行等待,..., 这种中途的等待, 导致父kernel的block被切换到显存冻结状态, 需要一定量的显存空间,所以同步等待的层数越多, 例如连续3层kernel都因为等待被切换blocks出去到显存了,这种消耗越大...),还算是比较安全的.不用担心出现在父kernel的多个blocks的线程们之间,某个block当前正持有锁的所有权的线程, 因为突然莫名的被切换出去, 冻结执行,导致其他锁有需要等待锁的线程和block...整体卡死.但在父kernel和子kernel之间使用同一个锁的需要需要注意了,任何时候不建议在持有锁的同时, 进行同步等待操作.

    49130

    android学习笔记----ANR

    如果您没有以这种方式将线程设置为较低的优先级,那么线程仍然会使您的应用程序变慢,因为默认情况下它的操作优先级与UI线程相同。...如果你实现Thread或HandlerThread,请确保您的UI线程在等待工作线程完成时不会阻塞-不要调用。Thread.wait()或Thread.sleep()。...主线程不应在等待工作线程完成时阻塞,而应提供Handler供其他线程在完成时回发。以这种方式设计应用程序将允许应用程序的UI线程保持对输入的响应,从而避免由5秒输入事件超时引起的ANR对话框。...提示: 您可以使用 StrictMode 帮助查找可能长时间运行的操作,例如您可能在主线程上意外执行的网络或数据库操作。 加强响应能力 通常,100到200ms是用户将感知应用程序缓慢的阈值。...在任何一种情况下,您都应该以某种方式表明正在取得进展,以免用户认为应用程序被冻结。 使用性能工具,如 systrace 和 Traceview 确定应用响应的瓶颈。

    1K00

    微服务应该这么搞,才能少踩坑!

    假如C发生故障,B方法1调用C方法1的请求不能及时返回,B的线程会发生阻塞等待。B会在一定时间后因为线程阻塞耗尽线程池所有线程,这时B就会无法响应A的请求。...如果你的场景适合异步通信,可以采用消息队列,这样也可以有效避免同步调用的线程等待问题。 ? 服务内(JVM内)线程隔离。解决横向线程池污染的问题。...为了避免因为一个方法出问题导致线程等待最终引发线程资源耗尽的问题,我们可以对tomcat,dubbo等的线程池分成多个小线程组,每个线程组服务于不同的类或方法。...避免因为B故障,导致A的请求线程持续等待,进而导致线程池线程和CPU资源耗尽,最终导致A无法响应,甚至整条调用链故障。...再考虑一个场景,try阶段冻结库存的时候,因为是rpc远程调用,在网络拥塞等情况下,是有可能超时的。

    4.2K20

    JMM内存模型

    "+isLookData.i); } 执行上面的代码会怎么:会死循环,main线程在启动后拿到的值是0所以会进入while循环等待值不为0,线程里sleep是让它的问题放大,就是保证main线程进入...,所以值出现了差异,怎么解决这样的问题,想到的肯定是加锁synchronized、locks,这样肯定可以解决这个问题,但是我只为了一个数值的变化就加锁,锁可是很影响效率的,所以使用原子类,我们用的int...有序性 有序性,在我们的机器执行代码的时候他并不是按照我们写的顺序执行的,它会为了优化执行顺序进行指令重排,单线程的情况下是没问题的,保证了单线程的执行,而多线程的情况下因为交替执行很可能因为指令重拍而出现错误...write 写入 作用于主内存的变量,它把store操作从工作内存中一个变量的值传送到主内存的变量中。 lock 锁定 :作用于主内存的变量,把一个变量标识为一条线程独占状态。...一个新的变量只能在主内存中诞生,不允许在工作内存中直接使用一个未被初始化(load或assign)的变量。即就是对一个变量实施use和store操作之前,必须先执行过了assign和load操作。

    37530

    Git相关介绍

    而且有网络的情况下每一次commit都会花上数秒甚至更长时间。...二、开发实现,提交代码 功能开发会先提交代码到本地仓库,然后提交到gerrit仓库等待代码review,通过Gerrit的权限控制不会把代码提交到远程Git仓库。...3.会不会存在开发随意/不小心merge到发版分支的情况? Answer:不会。发版分支在测试阶段会冻结,直到测试通过进入到集成测试阶段后解冻。Merge只能在解除冻结后进行。...是否会冻结? Answer:灰度期间不做冻结,方便开发修复Bug,在正式版发布后对发版支线进行冻结,并Merge代码到Master支线进行备份。 2.上线后发现bug怎么修复?...3.如果发现历史bug,怎么在以前的支线上修复并Merge? Answer:不需要在以前支线修复,在最新待发版的支线修复,可能在功能分支上,可能在发版分支上。

    1.5K50
    领券