如何从Android App捕获堆转储? – 3个选项

堆转储是诊断与内存相关的问题(例如内存泄漏,垃圾回收问题和java.lang.OutOfMemoryError)的重要工件。 它们也是优化内存使用的重要工件。

在本文中,我们提供了几种不同的选项来从Android Apps捕获堆转储。 捕获堆转储后,您可以使用HeapHeroAndroid studio的堆分析器等出色的工具来分析堆转储。

内存分析器

以下是从Android Studio中的Memory Profiler捕获堆转储的步骤:

一个。 运行该应用,然后从Android Studio中选择要配置的设备。

b。 在您的Android Studio中,单击查看 >> 工具窗口 >> Android Profiler

C。 将有“内存”时间轴,该时间轴将在“ CPU”时间轴下方,但在“网络”时间轴上方。 在此内存时间轴中,单击下载按钮(下图突出显示)以从Android应用程序生成堆转储。

d。 要将堆转储存储在系统中,请单击下图中突出显示的图标。

e。 选择一个位置来保存生成的堆转储文件。

Android调试桥(ADB)

Android Debug Bridge是一个命令行工具,可让您与设备进行交互。 亚行提供了各种设备操作,例如安装和调试应用程序。 它还可以访问Unix Shell,以在设备上运行各种命令。 您可以使用此工具生成android堆转储。 启动ADB Shell,并执行以下步骤:

一个。 识别您的Android应用的流程ID

第一步是确定您的Android应用的流程ID。 您可以通过发出以下命令来做到这一点:

 adb shell ps | grep <APP-NAME> 

上面的命令将返回有关该过程的详细信息。 第二个数字将是您应用的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值