堆转储是诊断与内存相关的问题(例如内存泄漏,垃圾回收问题和java.lang.OutOfMemoryError)的重要工件。 它们也是优化内存使用的重要工件。
在本文中,我们提供了几种不同的选项来从Android Apps捕获堆转储。 捕获堆转储后,您可以使用HeapHero和Android studio的堆分析器等出色的工具来分析堆转储。
内存分析器
以下是从Android Studio中的Memory Profiler捕获堆转储的步骤:
一个。 运行该应用,然后从Android Studio中选择要配置的设备。
b。 在您的Android Studio中,单击查看 >> 工具窗口 >> Android Profiler
C。 将有“内存”时间轴,该时间轴将在“ CPU”时间轴下方,但在“网络”时间轴上方。 在此内存时间轴中,单击下载按钮(下图突出显示)以从Android应用程序生成堆转储。
![](https://i-blog.csdnimg.cn/blog_migrate/ad258875af540295d65eed10ed211371.png)
d。 要将堆转储存储在系统中,请单击下图中突出显示的图标。
![](https://i-blog.csdnimg.cn/blog_migrate/a29762e39a4cbad46189db0a996038b2.png)
e。 选择一个位置来保存生成的堆转储文件。
![](https://i-blog.csdnimg.cn/blog_migrate/8341f8f4cb88871788be5d9327853c4b.png)
Android调试桥(ADB)
Android Debug Bridge是一个命令行工具,可让您与设备进行交互。 亚行提供了各种设备操作,例如安装和调试应用程序。 它还可以访问Unix Shell,以在设备上运行各种命令。 您可以使用此工具生成android堆转储。 启动ADB Shell,并执行以下步骤:
一个。 识别您的Android应用的流程ID
第一步是确定您的Android应用的流程ID。 您可以通过发出以下命令来做到这一点:
adb shell ps | grep <APP-NAME>
![](https://i-blog.csdnimg.cn/blog_migrate/6abc27eb6ee1eb9801dc87a04c49826e.png)
上面的命令将返回有关该过程的详细信息。 第二个数字将是您应用的PID。 请检查以下屏幕截图。
b。 创建一个堆转储:
adb shell am dumpheap <PID> <HEAP-DUMP-FILE-PATH> PID: Your Android App Process Id HEAP-DUMP-FILE-PATH: Location where heap dump file should be generated
例:
adb shell am dumpheap 1769 /data/local/tmp/android.hprof
C。 将文件拉到计算机上
上面的步骤将在设备中生成堆转储文件。 为了进行分析,您需要将生成的文件拉到计算机上。 您可以通过发出以下命令来做到这一点:
adb pull <HEAP-DUMP-FILE-PATH> HEAP-DUMP-FILE-PATH: Location where heap dump file
例:
adb pull /data/local/tmp/android.hprof
在OutOfMemoryError上捕获堆转储
如果将以下代码放置在应用程序中,则当您的应用程序收到OutOfMemoryError时,它将捕获堆转储。
public class CaptureHeapDumps extends Application {
private static final String FILE_NAME = "heap-dump.hprof" ;
@Override
public void onCreate() {
super .onCreate(); Thread.currentThread().setUncaughtExceptionHandler(OutOfMemoryException());
}
@NonNull
private Thread.UncaughtExceptionHandler OutOfMemoryException() {
return new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
String directory = getApplicationInfo().dataDir;
String absolutePath = new File(directory, FILE_NAME)
.getAbsolutePath();
try {
Debug.dumpHprofData(absolutePath);
} catch (IOException e) {
e.printStackTrace();
}
}
};
} }
这将在以下位置生成堆转储文件:/data/user/0/appname/heap-dump.hprof
翻译自: https://www.javacodegeeks.com/2019/09/hcapture-heap-dumps-from-android-app-3-options.html