专栏首页程序亦非猿震惊!app为何会突然崩溃???

震惊!app为何会突然崩溃???

王小虎看电影的app突然莫名崩溃?李二狗新买的手机为何无故变卡?

黑屏、死机,怪事频发,这一切的背后到底是设备的沦丧,还是程序员技术的扭曲?

Android技术优化日新月异,如今Android 10.0 已经发布,系统性能非常流畅,体验上完全可以媲美iOS;到了各大厂商手里,改源码、自定义系统,使得Android原生系统变得鱼龙混杂;再到不同层次的开发工程师手里,做出来的应用参差不齐,所以很多手机跑分软件上遥遥领先,打开应用依然会卡顿。

安卓手机卡顿、app崩溃、黑屏死机、OOM,主要是内存问题,罪不在Android系统,罪在开发APP的各位。

Android本身有自动管理内存的机制,但是对内存的不恰当使用很容易引起严重的性能问题。Android系统里面有一个Generational Heap Memory的模型,系统会根据内存中不同的内存数据类型分别执行不同的GC操作。

根据不同内存数据类型执行不同GC操作

执行GC操作的时候,任何线程的任何操作都会需要暂停,等待GC操作完成之后,其他操作才能够继续运行。(所以垃圾回收运行的次数越少,对性能的影响就越少)

导致GC频繁执行有两个原因:

1.Memory Churn内存抖动:内存抖动是因为大量的对象被创建又在短时间内马上被释放。

2.瞬间产生大量的对象会严重占用Young Generation的内存区域,当达到阀值,剩余空间不够的时候,也会触发GC。即使每次分配的对象占用了很少的内存,但是他们叠加在一起会增加Heap的压力,从而触发更多其他类型的GC。这个操作影响到帧率时,用户就会感知到性能问题。

如果你在Memory Monitor里面查看到短时间发生了多次内存的涨跌,这意味着很有可能发生了内存抖动;

同时我们还可以通过Allocation Tracker来查看在短时间内,同一个栈中不断进出的相同对象。这是内存抖动的典型信号之一。


内存泄露 memory leak

就是系统回收不了那些分配出去但是又不使用的内存, 形象点比喻就像家里的水龙头没有拧紧,漏水了。

内存泄漏分为:

常发性内存泄漏,偶发性内存泄漏,一次性内存泄漏,隐式内存泄漏。

隐式内存泄漏危害性非常大,因为较之于常发性和偶发性内存泄漏更难被检测到。

内存泄漏对程序造成的影响

1.直接:消耗内存,造成系统应用Out Of Memory.

一个android应用程序,其实就是一个jvm虚拟机实例,而一个jvm的实例,在初始的时候,大小不等 16M,32M,64M(根据手机厂商和版本不同而不同),当然大小也可以修改;

2.间接:gc回收频繁 造成应用卡顿ANR.

内存泄漏本身不会产生什么危害,一般用户,根本感觉不到。真正有危害的是内存泄漏的堆积,将会消耗系统所有的内存!随着程序的运行,可以使用的内存就会越来越少,机子就会越来越卡,直到内存数据溢出,然后程序就会挂掉,再跟着操作系统也可能无响应,接着你就按重启了…

手机变卡,就在所难免了。

要深入理解并提升Android性能优化技术,就需要我们深入理解JVM原理在移动端的实战应用。JVM原理是如何指导我们代码实践开发的?我们该如何从架构层面优化app性能?

太多的开发者对性能优化没有实际开发经验,这个是病得治,灵丹妙药就是项目实战!

为了解答这些疑问,我特邀我的好友,前东芝资深架构师Jett为大家带来《JVM核心原理与性能优化技术实战》,带你深度掌握JVM核心原理,并透过原理实现字节码插桩技术,以及常见内存问题的精准定位与分析处理,如抖动,泄漏等,掌握大厂项目中常用的开发与优化技术,很适合缺少一线互联网项目开发经验,渴望突破自己的安卓开发者。

本文分享自微信公众号 - 程序亦非猿(chengxuyifeiyuan)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 从计算机的角度理解volatile关键字

    像之前我在2019,船往哪里开呢?提到的的,我会慢慢把内容做起来,包括非原创的,挑选质量较高的文章分享给大家,也有船员开始给我推荐内容书籍等,也有约稿的,非常感...

    程序亦非猿
  • Myers 差分算法 —— Android DiffUtils 之实现(二)

    Myers 差分算法 (Myers Difference Algorithm) —— DiffUtils 之核心算法(一)

    程序亦非猿
  • 《高性能 Android 应用开发》笔记

    近些日子又温习了一下《高性能 Android 应用开发》这本书,是的,又一本关于 Android 性能优化的一本书,顺便整理了一下书的内容以及知识点,把其中相对...

    程序亦非猿
  • 关于redis内存分析,内存优化

    可以看到,当前节点内存碎片率为226893824/209522728≈1.08,使用的内存分配器是jemalloc。

    WindWant
  • 一次“内存泄露”引发的血案

    对性能不佳的Ark Server进行了改造和重写。重编发布一段时间后,结果发现新发布的Svr的机器内存一直在上涨。如下图示:

    烂猪皮
  • MMU那些事儿

    [导读] 本文从内存管理的发展历程角度层层递进,介绍MMU的诞生背景,工作机制。而忽略了具体处理器的具体实现细节,将MMU的工作原理从概念上比较清晰的梳理了一遍...

    逸珺
  • JavaScript内存泄漏了解

    程序的运行需要内存。只要程序提出要求,操作系统或者运行时(runtime)就必须供给内存。

    javascript.shop
  • Android平台上的Native内存分析

    UE4游戏在Android上的进程内存占用(PSS)很让人困惑, 没有一个清晰直观的方式可以统计到每一部分的内存占用. 所以在做内存分析的过程中顺手做了一个统计...

    逍遥剑客
  • GPU内存分级

    在NVIDIA的GPU中,内存(GPU的内存)被分为了全局内存(Global memory)、本地内存(Local memory)、共享内存(Shared me...

    刘盼
  • JavaScript 内存泄漏教程

    一、什么是内存泄漏? 程序的运行需要内存。只要程序提出要求,操作系统或者运行时(runtime)就必须供给内存。 对于持续运行的服务进程(daemon),必须及...

    ruanyf

扫码关注云+社区

领取腾讯云代金券