超赞的OOM检测(除了mat以外)

Android 一篇讲完Crash治理之OOM及内存检测工具 系列推荐: Android性能优化(一)闪退治理、卡顿优化、耗电优化、APK瘦身 Android 性能优化(二)Handler运行机制原理,源码分析 Android 性能优化(三)认识错误Error和异常Exception及栈轨迹StackTrace Android 性能优化(四)Crash治理之路,UncaughtException 前言 性能优化第一篇中的Crash治理说过:... 阅读详情

今天看了下微博,扔物线分享了个内存检测的工具:

内存泄露是 OOM 最常见的原因,但它的侦测需人工排查,往往眼看瞎也未必能找到泄露的内存。Square 新库 LeakCanary 用一种巧妙的思路实现了自动探测内存泄露,这已经帮他们减少了94%的 OOM。 在这篇文中,Square 介绍了这个帅气的库,也提出了一种新颖的获取测试设备的方式:"偷":

是不是这种检测OOm问题的方式比其MAT来说简直爽的一逼一逼的。
这是这个检测工具的官网: https://corner.squareup.com/2015/05/leak-canary.html
开源库地址:https://github.com/square/leakcanary
一下是相关翻译:

LeakCanary: Detect all memory leaks!

May 08, 2015
java.lang.OutOfMemoryError
        at android.graphics.Bitmap.nativeCreate(Bitmap.java:-2)
        at android.graphics.Bitmap.createBitmap(Bitmap.java:689)
        at com.squareup.ui.SignView.createSignatureBitmap(SignView.java:121)

没有任何人会喜欢OOM问题的出现

In Square Register, we draw the customer's signature on a bitmap cache. This bitmap is the size of the device's screen, and we had a significant number of out of memory (OOM) crashes when creating it.

这个图片的大小是设备大小,我们在显示这个图片的时候会出现OOM的问题。

We tried a few approaches, none of which solved the issue:

我们尝试了一些方法,其中没有解决的问题:

  • Use Bitmap.Config.ALPHA_8 (a signature doesn't need color).
  • 使用bitmap.config.alpha_8
  • Catch OutOfMemoryError, trigger the GC and retry a few times (inspired from GCUtils).
  • 抓住OutOfMemoryError,触发GC和重试几次(灵感来自gcutils)。
  • We didn't think of allocating bitmaps off the Java heap. Lucky for us, Fresco didn't exist yet.
  • 我们不想把Java堆分配位图。幸运的是,Fresco 这个开源项目不存在这种问题。

We were looking at it the wrong way

The bitmap size was not a problem. When the memory is almost full, an OOM can happen anywhere. It tends to happen more often in places where you create big objects, like bitmaps. The OOM is a symptom of a deeper problem: memory leaks.

位图是没问题的,如果内存满的话,一个oom会出现在任何地方。当你创建比较大的对象,像bitmap这种东西的地方就会出现这种问题,oom更深层次的问题就是内存泄漏的问题。

What is a memory leak?

什么是内存泄漏呢?

Some objects have a limited lifetime. When their job is done, they are expected to be garbage collected. If a chain of references holds an object in memory after the end of its expected lifetime, this creates a memory leak. When these leaks accumulate, the app runs out of memory.

许多对象是有有限制的生命周期的,当他们工作完成后,就会被垃圾回收。当对象的引用在对象的生命周期后还在持有该引用的话,就会出现内存泄漏的问题。当引用累计到一定一定时候,就会出现OOM的问题。

For instance, after Activity.onDestroy() is called, the activity, its view hierarchy and their associated bitmaps should all be garbage collectable. If a thread running in the background holds a reference to the activity, then the corresponding memory cannot be reclaimed. This eventually leads to an OutOfMemoryError crash.

例如,在Actiivity ondestroy()后,它的视图层次结构及其相关的位图应该都是垃圾收集。如果一个线程在后台运行,持有该activity引用,那么相应的内存不能被回收。这最终导致OutOfMemoryError错误,崩溃。

捕获OOM的问题

Hunting memory leaks is a manual process, well described in Raizlabs’ Wrangling Dalvik series.

捕获OOM的问题是一个手动的过程。

Here are the key steps:

关键步骤如下:

  1. Learn about OutOfMemoryError crashes via Bugsnag, Crashlytics, or the Developer Console.
  2. 在使用Bugsnag, Crashlytics以及 Developer Console工具去检测OutOfMemoryError这种问题。 
  3. Attempt to reproduce the problem. You might need to buy, borrow, or steal the specific device that suffered the crash. (Not all devices will exhibit all leaks!) You also need to figure out what navigation sequence triggers the leak, possibly by brute force.
  4. 重现问题,你可能需要购买或者借到一些特殊的设备来重现crash问题(并不是所有的设备都会出现这种问题),你需要知道是什么导致内存泄漏的问题,有可能是蛮力(这句翻译的有点怪,我擦)。
  5. Dump the heap when the OOM occurs (here's how).
  6. 堆积OOM的问题
  7. Poke around the heap dump with MAT or YourKit and find an object that should have been garbage collected.
  8. 使用MAT或者 YourKit 工具去发现那些对象应该被回收。
  9. Compute the shortest strong reference path from that object to the GC roots.
  10. 计算最短路径的强引用对象的GC根。
  11. Figure out which reference in the path should not exist, and fix the memory leak.
  12. 找出那些引用是不应该存在的,并处理内存对这些引用。

What if a library could do all this before you even get to an OOM, and let you focus on fixing the memory leak?

如果有一个库帮助你在oom问题出现之前去检测OOM的问题,你会去关注如何修复内存引用的问题吗?

介绍使用LeakCanary

LeakCanary is an Open Source Java library to detect memory leaks in your debug builds.

LeakCanary是一个开源项目,通过java库去检测内存泄漏的问题。

Let's look at a cat example:

看下下面的例子:

class Cat {
}
class Box {
  Cat hiddenCat;
}
class Docker {
  static Box container;
}

// ...

Box box = new Box();
Cat schrodingerCat = new Cat();
box.hiddenCat = schrodingerCat;
Docker.container = box;

You create a RefWatcher instance and give it an object to watch:

你创造了一个refwatcher实例,给它一个对象去检测:

// We expect schrodingerCat to be gone soon (or not), let's watch it.
refWatcher.watch(schrodingerCat);

When the leak is detected, you automatically get a nice leak trace:

当内存检测的时候,你会检测到内存的内存的使用的痕迹。

* GC ROOT static Docker.container
* references Box.hiddenCat
* leaks Cat instance

We know you're busy writing features, so we made it very easy to setup. With just one line of code, LeakCanary will automatically detect activity leaks:

public class ExampleApplication extends Application {
  @Override public void onCreate() {
    super.onCreate();
    LeakCanary.install(this);
  }
}

You get a notification and a nice display out of the box:

你能得到通知,并且能够良好的展示在界面上:

Conclusion

After enabling LeakCanary, we discovered and fixed many memory leaks in our app. We even found a few leaks in the Android SDK.

在启用的leakcanary,我们能够发现并修复你APP里面出现的内存泄漏的问题。我们甚至发现了一些 leaks in the Android SDK。

The results are amazing. We now have 94% fewer crashes from OOM errors.

结果让人吃惊,能够检测出94%的OOM的问题。

If you want to eliminate OOM crashes, install LeakCanary now!

如果你想消除OOM导致额问题,先学习leakcanary开始
 
我英语是数学老师教的,如果翻译的不好,请留言指教下我这个小学生,我一定会改正。
实操---->创建一个OOM或者FullGC,生成jvm的dump文件,通过jvisualvm工具或者MAT工具解析 实操---->创建一个OOM或者FullGC,生成jvm的dump文件,通过jvisualvm工具或者MAT工具解析 阅读详情

相关推荐

实战指南:利用MAT深度剖析Java OOM dump文件

本文详细介绍了如何利用MAT工具深度分析Java OOM dump文件,从告警到dump文件的获取,再到MAT工具的配置与使用技巧。通过实战案例,展示了如何通过Histogram、Dominator Tree和Leak Suspects等核心功能快速定位内存泄漏和内存溢出问题,并提供了性能优化和监控体系搭建的实用建议。

weixin_30899023的博客 244

MAT分析OOM问题

生产环境,我们的 Flink 作业偶尔会出现 heap OOM,那么当出现这种情况我们会怎么办?通常来说会通过 jmap 命令去将作业的 heap dump 一份文件出来,可是 jmap 导出的文件我们也看不懂啊,那么该怎么分析呢?今天推荐 memory analyzer(mat)这个工具,让他帮助我们来观察程序的内存分布情况吧。 MAT 不是一个万能工具,它并不能处理所有类型的堆存储文件。但是比较主流的厂家和格式,例如 Sun, HP, SAP 所采用的 HPROF 二进制堆存储文件,以及 IBM 的

hellozhxy的博客 1475

使用MAT命令行工具生成堆dump分析文件

写作目标 Java程序运行过程中,难免会出现 OOME,往往是在 JVM 启动参数中添加出现OOME时输出堆dump(又名:堆转储、堆快照)的参数,就在昨天下午我司生产环境出现 OOME错误,生成的堆dump有16个G,压缩后传回本地,想分析时犯了难——本地电脑16G内存,用Mat打不开! 通过查询相关文档,发现可以使用Mat命令行脚本生成可供Mat图形化界面展示的文件,也就是 用Linux服务器进行分析大堆/超大堆 dump文件,输出分析报告,通过浏览器直接查看! 运行环境 CentOS 7.4 Mem

拾级而上 2910

使用MAT分析生产线上OOM问题

java线程池如何合理配置核心线程数java线程池如何合理配置核心线程数

CarryBest的博客 995

CamoFox MCP:让AI助手隐身操作浏览器的反检测自动化实战

浏览器自动化是提升工作效率和实现数据采集的关键技术,其核心原理在于通过程序脚本模拟人类在网页上的交互行为。传统方案如Selenium或Playwright虽功能强大,但需要开发者编写复杂脚本并处理反爬机制。随着AI Agent技术的发展,自然语言驱动的自动化成为新趋势,它能将任务规划与逻辑判断交由AI处理,大幅降低使用门槛。Model Context Protocol(MCP)作为连接AI与外部工具的标准协议,在此场景下价值凸显,它使得AI助手能直接调用丰富的浏览器操作工具。CamoFox MCP创新性地将

weixin_42551967的博客 724

《AI大模型评测与智能测试》

第三篇“实践蓝图”(第6-7章)着眼于测试领域AI应用,重点介绍了RAG、AI Agent开发及构建端到端智能测试系统的方法。本书聚焦AI时代的“质量”核心,以“AI赋能测试”(AI For Testing)与“AI模型评测”(Testing For AI)为双轮驱动。内容不仅深入剖析如何科学度量AI大模型的内在质量,还系统讲解如何利用AI赋能传统软件测试,帮助读者贯通从模型原理、评测到应用开发的全链路知识。

酌沧 1138

使用MAT分析OOM问题

通过MAT打开java_pid12300.hprof文件后,首先进入的是概览信息界面。从这个概览图中,我们可以看出整个堆的大小是437.6MB。接下来我们可以通过直方图来看这437.6MB的对象都是哪些对象。

weixin_44335140的博客 1787

从Zemax到Speos:HUD设计数据无缝迁移避坑指南(含STEP文件精度验证)

本文详细介绍了从Zemax到Speos的HUD设计数据无缝迁移方法,重点解决Zernike曲面参数保真、虚拟厚度设置和坐标系对齐等核心问题。通过STEP文件精度验证和工程化解决方案,帮助工程师避免数据迁移中的常见陷阱,提升HUD系统设计效率。适用于Ansys Zemax和Ansys Speos用户,优化光学性能验证流程。

h6i7j8的博客 1063

Java对象的创建过程以及OOM测试

一、对象的创建   在Java语言层面上,创建对象通常仅仅是一个new关键字,当JVM遇到一条new的字节码指令时,首先先去检查这个指令的参数能否在常量池定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析,若没有,要先执行类加载。   接着为新生对象分配内存,内存大小在类加载完成后就已经确定了,分配内存实际上就是把一块大小确定的内存从堆中划分出来,分配的方法又有俩种:   指针碰撞法:这种方法有个前提:堆中的内存是绝对规整的,被使用过的内存放在一边,没被使用的放在另一边,中间有一个指针作

Lxd_的博客 579

ArcGIS通过已知坐标点转面(通过excel文件,有工具可批量生成面要素)

通过使用ArcGIS中的工具,将坐标点XY数据转换成可视化的点线面矢量数据,更加方便快捷有效的获取对应信息

qq_41046162的博客 3万+

EFR32无线SoC开发指南:从环境搭建到性能优化

物联网边缘设备开发中,无线SoC芯片的选择与开发环境配置是关键第一步。EFR32作为Silicon Labs推出的多协议无线SoC系列,配合Simplicity Studio IDE,为开发者提供了完整的解决方案。本文以EFR32xG22开发套件为例,详细介绍开发环境搭建、工程创建、硬件配置等核心环节,特别针对RAILtest示例工程进行深入解析。通过实际案例演示如何配置无线参数、优化低功耗模式,并分享串口终端交互、吞吐量测试等实战技巧。对于开发者常见的问题如设备识别失败、无线通信异常等,提供了系统化的排查

weixin_30342363的博客 350

利用性能分析工具MAT分析OOM

OOM介绍 1、OOM,全称“Out Of Memory”,计算机内存被耗尽,JVM没有办法继续给新对象分配空间,而报出的错误,属于严重错误。 2、产生原因: 内存溢出:JVM本身分到的内存空间较少,无法提供充足的内存空间,可以通过启动参数VM进行调节 内存泄漏:内存被是用完之后没有被释放,无法重复使用该内存,那这段内存就是泄露状态 注:JVM的垃圾回收机制会自动释放掉没有使用的对象的内存,...

shenzhou_yh的博客 2106

buildozer

/home/chenyang/new_kivy/.buildozer/android/platform/build/build/other_builds/hostpython3/desktop/hostpython3/Lib

东方佑 16万+

行车记录仪怎么选?2026年前后双录选购避坑指南

行车记录仪作为日常出行的“黑匣子”,其核心价值在于事故发生时提供客观、可追溯的视频证据。随着影像技术的发展,传感器型号、光圈大小、帧率与HDR算法等底层参数,共同决定了画质在暗光、高速等复杂场景下的可用性。前后双录机型能覆盖车尾盲区,尤其适合停车环境复杂、常跑陌生路况或频繁遭遇加塞变道的用户,但同时也带来走线、存储与安装维护等隐性成本。选购时需根据真实用车场景平衡预算与需求:300元以内前摄单录可靠够用,500-800元是双录甜点区间,千元以上则更看重App体验、语音控制与高温稳定性。本文从概念到原理,结合

weixin_34318272的博客 236

【AutoSAR】【以太网】TCP/IP 栈详述与配置

目录 一、TCP/IP栈架构 二、TCP\IP栈的可扩展性 三、以太网协议V4 四、以太网协议 V6 五、基于IP的协议 六、函数调用序列图 一、TCP/IP栈架构 根据以上架构图,该栈主要包括:UPD\TCP\DHCP\ICMP\IPV4\IPV6\ARP; 二、TCP\IP栈的可扩展性 TCP\IP栈为适应不同的应用场景需求,将分为三类: 配置工程里的配置项: 三、以太网协议V4 1 IPV4 Internet Protocol (IP)是T.

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 5695

HanLP的分词

HanLP的分词

sikh_0529的博客 1万+

使用 Eclipse MAT 与 VisualVM 分析 Java OOM 堆转储文件(heapdump.hprof)全过程

在 Java 开发中,内存溢出(OutOfMemoryError)是常见的运行时问题之一。为了快速定位原因,我们通常会配置 JVM 参数在发生 OOM 时自动生成堆转储文件(.hprof),然后通过专业的工具进行分析。本文将带你一步步使用和VisualVM来打开并分析由 Spring Boot 接口触发的 OOM 堆转储文件,帮助你掌握内存泄漏排查的核心技能!Eclipse MAT 是一个强大的 Java 堆内存分析工具,能帮助开发者快速识别内存泄漏、大对象、GC Roots 等关键信息。

用文字记录技术,用分享回馈社区,用坚持见证成长 2255

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

oom问题的处理

我们POS软件线上的高crash原因中,OOM位居首位,并且LLC切店过程中也发生了较多次的OOM crash。在此背景下,我们发起了一次内存治理。在一次QA的长时间待机测试中发现POS最终异常退出了,通过日志分析发现是OOM异常导致,通过mat内存分析软件()分析内存dump文件发现占比最高的对象是SocketIO(占用320多M)及AppClassLoader,存在内存泄漏,其中在叫号模块中对象CfnHardwareAddTvDialog存在内存泄漏问题。

m0_63421495的博客 1269

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

通过内存分析工具MAT(Memory Analyzer Tool),找出导致OOM的代码

程序放到生产服务器上跑了一段时间之后发现,程序报出了OOM了,导致程序无法运行 于是开始了排查之路 首先下载一个MAT工具 强烈建议安装独立版的,虽然编译器

波波的博客 891

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

MAT 分析OOM out of memory模拟OOM Killer

就是整个堆的概括情况,例如:堆内存大小、对象个数、类的个数、类加载器的个数、GC root的个数、堆内存文件的格式、文件的创建时间、位置等信息。java -Xms3g -Xmx3g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/root/ -Xloggc:/root/gc-myapp.log 编译后你的类名。怎么加载/这里边的一些概念 分别对应分析什么问题(泄露,线程,类加载器导致的泄露, 对象空间情况/模拟oom killer。java不断开辟空间。

小獣专栏 372

android oom工具,Android OOM-Heap,MAT工具检测内存泄露

概述在android的开发中,要时刻主要内存的分配和垃圾回收,因为系统为每一个dalvik虚拟机分配的内存是有限的,在google的G1中,分配的最大堆大小只有16M,后来的机器一般都为24M,实在是少的可怜。这样就需要我们在开发过程中要时刻注意。不要因为自己的代码问题而造成OOM错误。JAVA的内存管理大家都知道,android应用层是由java开发的,android的davlik虚拟机与jvm...

weixin_39756273的博客 194

【Java】内存分析:MAT分析OOM原因(Leak Suspects)、大对象定位

MAT 是分析 Java 堆内存快照的核心工具,提供自动内存泄漏检测、大对象定位等功能。获取堆快照可通过 JVM 参数、jmap、jcmd 或 Arthas 四种方式。分析时重点关注 Leak Suspects 报告、Dominator Tree 和 Histogram,识别静态集合、ThreadLocal 未清理等常见泄漏模式。生产环境应配置自动 Dump,并通过 OQL 查询快速定位问题。典型 OOM 场景包括内存泄漏、大对象分配和线程过多,需结合 MAT 特征和代码分析综合排查。

瘦到被风吹走的博客 1218

从 Android OOM监控与分析

简单介绍 What's OOM? Why OOM? 常见的OOM 一般的解决办法 监控阶段 端上内存自监控 端上内存主动释放 端上dump时机 内存泄漏加成 处理阶段 解析泄漏路径 大内存解析 压缩上传 展示 Qmas数据展示 后续 遗留问题 后续方案 简单介绍 What's OOM? 全称“Out Of Memory”,指的是内存超出了限制,抛出的一个异常。 Why OOM? 内存泄漏,导致可回收的内存回收失败,比如Ac

王温暖的博客 2333
上一篇: Android获取32位应用签名及如何判断该签名为debug还是release
下一篇: QtXlsx读写.xlsx的图片
鱼公子哟西
博客等级 码龄14年 17粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值