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

Android OOM案例分析

Android(Java)开发中,基本都会遇到java.lang.OutOfMemoryError(本文简称OOM),这种错误解决起来相对于一般的Exception或者Error都要难一些,主要是由于错误产生的...由于发生OOM时,用户操作路径的不确定性,无法精确复现线上的OOM,因此采取模拟复现的方式,最终发生OOM时的栈信息基本一致即可。...OOM发生后,使用Android Studio自带的Android Monitor dump出HPROF文件,然后使用SDK中的hprof-conv(位于sdk_root/platform-tools)...虽然最终造成OOM突然增多的原因只是开启一个标志位,但是这也告诫大家阅读API文档的重要性,其实很多时候API的使用说明已经明确告知了使用的限制条件甚至风险。...利用MAT分析dump文件,MAT可以方便的按照大小排序实例,可以查看某些实例到GC ROOT的路径。

1.3K40

去公司的第一天老大问我:内存泄露检测工具你知道几个?

内存泄漏的一个常见迹象是 java.lang.OutOfMemoryError例外情况。在这种情况下,垃圾回收器无法腾出空间来容纳新对象,堆也无法进一步扩展。...此外,当本机内存不足,无法支持Java类的加载时,可能会抛出此错误。在极少数情况下 java.lang.OutOfMemoryError在执行垃圾收集的时间过长,并且释放的内存很少时,会引发。...线程线程名中出现异常:Java.Lang.OutOfMemoryError: GC Overhead Limit Exceeded 超出GC限制 原因:详细消息“GC overhead limit exceeded...这个 java.lang.OutOfMemoryError可以使用命令行标志-XX:-usegcoveredlimit关闭超出GC开销限制的异常。...线程线程名中出现异常:Java.Lang.OutOfMemoryError:请求的数组大小超过VM限制 原因:详细信息“请求的数组大小超过VM限制”表示应用程序(或该应用程序使用的API)试图分配大于堆大小的数组

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

Android | App内存优化 之 内存泄漏 要点概述 以及 解决实战

内存泄漏指的是进程中某些对象(垃圾对象)已经没有使用价值了, 但是它们却可以直接或间接地引用到gc roots导致无法GC回收。...图片显示:加载合适尺寸的图片,比如显示缩略图的地方不要加载大图。 1.2. 图片回收:使用完bitmap,及时使用Bitmap.recycle()回收。...线程池:与对象池差不多, 将线程对象放在池中供反复使用,减少反复创建线程的开销。 4....Android studio 进入 adb 命令 ---使用terminal 终端 进入sdk 找到 platform-tools 目录进入即可 使用cd指令, 进入到配套SDK目录下的platform-tools...(GC上说,除了强引用外, 其他的引用在JVM需要的情况下是都可以 被GC掉的!!! 所以!!! 如果一个对象始终无法GC,就是因为强引用的存在,!!!

1.3K10

Java 内存溢出(OOM)异常完全指南

Java 中的内存泄漏是由于 GC 无法识别一些已经不再使用的对象,而这些未使用的对象一直留在堆空间中,这种堆积最终会导致java.lang.OutOfMemoryError: Java heap space...垃圾收集器怎样检测内存中的某些空间不再使用已经超出本文的范围,但你只需要相信 GC 可以做好这些工作即可。...以上这些变化可以说明,在资源有限的情况下,你根本无法无法预测你的应用是怎样挂掉的,什么时候会挂掉,所以在开发时,你不能仅仅保证自己的应用程序在特定的环境下正常运行。...还有一点需要注意,这些工具在 Java 运行时有显著的开销,因此不建议在生产环境中使用。...默认情况下,对于 64 位服务器端 JVM,MetaspaceSize默认大小是 21M(初始限制值),一旦达到这个限制值,Full GC 将被触发进行类卸载,并且这个限制值将会被重置,新的限制值依赖于

3.9K13

Android性能优化之内存优化

3、Invisible(不可见) 当一个对象处于不可见阶段时,说明程序本身不再持有该对象的任何强引用,虽然该对象仍然是存在的。简单的例子就是程序的执行已经超出了该对象的作用域了。...Android SDK自带了一个转换工具在SDKplatform-tools下,其中转换语句为: ....API 9起(Android 2.3)开始,Android系统垃圾回收器更倾向于回收持有软引用和弱引用的对象,所以不是很靠谱,Android 3.0开始(API 11)开始,图片的数据无法用一种可遇见的方式将其释放...2、bitmap内存复用 Android3.0开始Bitmap支持内存复用,也就是BitmapFactoy.Options.inBitmap属性,如果这个属性被设置有效的目标用对象,decode方法就在加载内容时重用已经存在的...,因为使用inBitmap有一些限制,在Android 4.4之前,只支持同等大小的位图。

2.4K30

高手总结的9种 OOM 常见原因及解决方案

2、超出预期的访问量/数据量,通常是上游系统请求流量飙升,常见于各类促销/秒杀活动,可以结合业务流量指标排查是否有尖状峰值。 3、过度使用终结器(Finalizer),该对象没有立即被 GC。...2、GC overhead limit exceeded 当 Java 进程花费 98% 以上的时间执行 GC,但只恢复了不到 2% 的内存,且该动作连续重复了 5 次,就会抛出 java.lang.OutOfMemoryError...简单地说,就是应用程序已经基本耗尽了所有可用内存, GC无法回收。 此类问题的原因与解决方案跟 Javaheap space 非常类似,可以参考上文。...://www.eclipse.org/mat 功能逐一分析开销最大的 classloader 和重复 class。...原因分析 Direct ByteBuffer 的默认大小为 64 MB,一旦使用超出限制,就会抛出 Directbuffer memory 错误。

1.7K30

教你分析9种 OOM 常见原因及解决方案

2、超出预期的访问量/数据量,通常是上游系统请求流量飙升,常见于各类促销/秒杀活动,可以结合业务流量指标排查是否有尖状峰值。 3、过度使用终结器(Finalizer),该对象没有立即被 GC。...2、GC overhead limit exceeded 当 Java 进程花费 98% 以上的时间执行 GC,但只恢复了不到 2% 的内存,且该动作连续重复了 5 次,就会抛出 java.lang.OutOfMemoryError...简单地说,就是应用程序已经基本耗尽了所有可用内存, GC无法回收。 此类问题的原因与解决方案跟 Javaheap space 非常类似,可以参考上文。...://www.eclipse.org/mat 功能逐一分析开销最大的 classloader 和重复 class。...原因分析 Direct ByteBuffer 的默认大小为 64 MB,一旦使用超出限制,就会抛出 Directbuffer memory 错误。

12.7K71

Android | 关于 OOM 的那些事

前言 Android 系统对每个app都会有一个最大的内存限制,如果超出这个限制,就会抛出 OOM,也就是Out Of Memory 。本质上是抛出的一个异常,一般是在内存超出限制之后抛出的。...最为常见的 OOM 就是内存泄露(大量的对象无法被释放)导致的 OOM,或者说是需要的内存大小大于可分配的内存大小,例如加载一张非常大的图片,就可能出现 OOM。...JVM 将所管理的内存分为以下几个部分: 方法区 各个线程锁共享的,用于存储已经被虚拟机加载的类信息,常量,静态变量等,当方法区无法满足内存分配需求时,将会抛出 OutOfMemoryError 异常...出现 OOM 是应为 Android 系统对虚拟机的 heap 做了限制,当申请的空间超过这个限制时,就会抛出 OOM,这样做的目的是为了让系统能同时让比较多的进程常驻于内存,这样程序启动时就不用每次都重新加载到内存...,可能是测试的方法有问题,或者说是还没有达到最大线程的限制,由于手机没有权限,无法查看线程数量限制,所以等有机会了再看。

1.1K20

【玩转 Cloud Studio】Android 中关于 OOM 的那些事

### 前言 **Android 系统对每个app都会有一个最大的内存限制,如果超出这个限制,就会抛出 OOM,也就是Out Of Memory** 。...本质上是抛出的一个异常,一般是在内存超出限制之后抛出的。...最为常见的 OOM 就是内存泄露(大量的对象无法被释放)导致的 OOM,或者说是需要的内存大小大于可分配的内存大小,例如加载一张非常大的图片,就可能出现 OOM。...[请添加图片描述](https://img-blog.csdnimg.cn/8477df6c42ee4fb5b888b4945c5b6c58.png) - 方法区 **各个线程锁共享的,用于存储已经被虚拟机加载的类信息...出现 OOM 是应为 **Android 系统对虚拟机的 heap 做了限制,当申请的空间超过这个限制时,就会抛出 OOM**,这样做的目的是为了让系统能同时让比较多的进程常驻于内存,这样程序启动时就不用每次都重新加载到内存

90330

10种常见OOM分析——手把手教你写bug

过度使用终结器(Finalizer),该对象没有立即被 GC 内存泄漏(Memory Leak),大量对象引用没有释放,JVM 无法对其自动回收,常见于使用了 File 等资源没有回收 2.3 解决方案...简单地说,就是应用程序已经基本耗尽了所有可用内存, GC无法回收。...: GC overhead limit exceeded 输出结果可以看到,我们的限制 1000 条数据没有起作用,map 容量远超过了 1000,而且最后也出现了我们想要的错误,这是因为类 Key...xxx 调整最大线程数限制 六、Metaspace JDK 1.8 之前会出现 Permgen space,该错误表示永久代(Permanent Generation)已用满,通常是因为加载的 class...此限制是通过-Xmx和其他类似的启动参数指定的。 在 JVM 请求的总内存大于可用物理内存的情况下,操作系统开始将内容内存换出到硬盘驱动器。

79341

Android Monkey压力测试

%\ tools;%ANDROID_HOME%\ platform-tools; ?...3.打开Android SDK Manager,选择替换下载的工具包 一般类型是选择工具底下前3个,然后是Android最新的SDK平台,Android电视Intel x86 Atom系统映像,Google...所以,可以按需选择要下载的api,不一定下载最新的Android版本 ? ? 4.SDK环境变量检查 顶部的工具下载完后,打开cmd接口,输入adb,如果能够成功返回,则说明安装和配置成功 ? 三。...Android Monkey压力测试 :模拟器中,打开cmd接口,输入adb设备,看是否连接了模拟器设备 C:\ Users \ Administrator> adb设备连接的模拟器5504设备列表...然后输入adb shell进入到shell界面 C:\ Users \ Administrator> adb shellroot @ generic_x86:/ \# 选择com.android.email

1.8K20

Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day25】—— JVM1

超出预期的访问量/数据量,通常是上游系统请求流量飙升,常见于各类促销/秒杀活动,可以结合业务流量指标排查是否有尖状峰值。 过度使用终结器(Finalizer),该对象没有立即被 GC。...2、GC overhead limit exceeded   当 Java 进程花费 98% 以上的时间执行 GC,但只恢复了不到 2% 的内存,且该动作连续重复了 5 次,就会抛出 java.lang.OutOfMemoryError...简单地说,就是应用程序已经基本耗尽了所有可用内存, GC无法回收。   此类问题的原因与解决方案跟 Javaheap space 非常类似,可以参考上条。...原因分析   Direct ByteBuffer 的默认大小为 64 MB,一旦使用超出限制,就会抛出 Directbuffer memory 错误。...首先校验当前类是否被加载,如果没有加载,执行类加载机制 加载:就是字节码加载成二进制流的过程 验证:当然加载完成之后,当然需要校验Class文件是否符合虚拟机规范,跟我们接口请求一样,第一件事情当然是先做个参数校验了

32610

高频面试点:Android性能优化之内存优化(下篇)

枚举最大的优点是类型安全,但在Android平台上,枚举的内存开销是直接定义常量的三倍以上。所以Android提供了注解的方式检查类型安全。...MiniImageLoader是一个单例,保证一个应用只维护一个ImageLoader,减少对象开销,并管理应用中所有的图片加载。...API 9起(Android 2.3)开始,Android系统垃圾回收器更倾向于回收持有软引用和弱引用的对象,所以不是很靠谱,Android 3.0开始(API 11)开始,图片的数据无法用一种可遇见的方式将其释放...b、bitmap内存复用 Android3.0开始Bitmap支持内存复用,也就是BitmapFactoy.Options.inBitmap属性,如果这个属性被设置有效的目标用对象,decode方法就在加载内容时重用已经存在的...,因为使用inBitmap有一些限制,在Android 4.4之前,只支持同等大小的位图。

57830

OutOfMemory及其解决方法「建议收藏」

如果web app用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小,超出了也会导致这块内存的占用过多造成溢出,或者tomcat热部署时侯不会清理前面加载的环境,只会将...因为这个异常根据系统运行环境决定,所以无法预期它何时出现。 根据GC的机制,程序的运行会引起系统运行环境的变化,增加GC的触发机会。...为了避免这些问题,程序的设计和编写就应避免垃圾对象的内存占用和GC开销。...去回收,程序内过多的出现这样的情况就会报上面的那个错误,建议在使用字符串时能使用StringBuffer就不要用String,这样可以省不少开销; 3、尽量少用静态变量,因为静态变量是全局的,GC不会回收的...java.lang.OutOfMemoryError异常解决方法 原因: 常见的有以下几种: 1.内存中加载的数据量过于庞大,如一次数据库取出过多数据; 2.集合类中有对对象的引用,使用完后未清空

7K10

看完这篇文章,解决 APP 中 90 % 的内存异常问题

JVM 会把描述类的数据 class 文件加载到内存,Java 有一个很好的管理内存的机制,垃圾回收机制 GC 。... GC Roots 作为起点开始搜索,那么整个连通图中额对象边都是活对象,对于 GC Roots 无法到达的对象便成了垃圾回收的对象,随时可能被 GC 回收。...反正对于对象之间循环引用的情况,引用计数算法无法回收这 2 个对象,而可达性是 GC Roots 开始搜索,所以能够正确的回收。...转换 profile 文件格式 * 将 export 导出的 dprof 文件转换为 Mat 的 dprof 文件 * cd /d 进入到 Android sdk/platform-tools.../hprof-conv.exe ``` //转换命令 hprof-conv -z src des D:\Android\AndroidDeveloper-sdk\android-sdk-windows

74030
领券