我在Eclipse Memory Analyzer(也称为MAT)的帮助下分析了我的Android应用程序的内存使用情况.有时我可以找到奇怪的android.graphics.Bitmap
类实例,利用大部分堆.问题是我找不到这个位图的来源,没有文件名,没有resourceID,什么都没有.我能找到的关于位图的所有信息如下:
mBuffer
我假设有一个带有图像像素阵列的场.但它采用的是一些内部Android格式,而不是PNG.
问题:如何从内存转储中查看此位图表示的图像?
我想将我的项目推送到 github,但是我注意到在 android 文件夹中有一个名为java_pid14920.hprof的文件,导致大约 300MB
remote: error: File android/java_pid14920.hprof is 301.75 MB; this exceeds GitHub's file size limit of 100.00 MB
我想知道删除这个文件是否安全?
-XX:+HeapDumpOnOutOfMemoryError
每当Java进程用完堆时,sun JVM都支持转储堆的选项.
在Android上是否有类似的选项可以在OutOfMemoryException上创建一个Android应用程序转储堆?手动使用DDMS时,可能很难尝试正确计时.
我有一些Clojure代码,它模拟然后处理数值数据.数据基本上是双值的向量; 处理主要涉及以各种方式对它们的值进行求和.我将在下面包含一些代码,但我的问题是(我认为)更一般 - 我只是不知道如何解释hprof结果.
无论如何,我的测试代码是:
(defn spin [n]
(let [c 6000
signals (spin-signals c)]
(doseq [_ (range n)] (time (spin-voxels c signals)))))
(defn -main []
(spin 4))
Run Code Online (Sandbox Code Playgroud)
哪里spin-voxels
应该比更贵spin-signals
(特别是重复多次).我可以提供较低级别的例程,但我认为这个问题更多的是关于我不理解跟踪的基础知识(下面).
当我用lein编译它然后做一些简单的分析:
> java -cp classes:lib/clojure-1.3.0-beta1.jar -agentlib:hprof=cpu=samples,depth=10,file=hprof.vec com.isti.compset.stack
"Elapsed time: 14118.772924 msecs"
"Elapsed time: 10082.015672 msecs"
"Elapsed time: 9212.522973 msecs"
"Elapsed time: 12968.23877 msecs"
Dumping CPU usage by sampling running threads ... done.
Run Code Online (Sandbox Code Playgroud)
和配置文件跟踪看起来像:
CPU SAMPLES BEGIN (total = 4300) Sun Aug 28 15:51:40 2011
rank self accum count …
Run Code Online (Sandbox Code Playgroud) 我正在调查使用Eclipse的Memory Analyzer(MAT)分析HPROF文件.统治者树,报告和OQL界面看起来非常有用.但所有这一切都必须通过MAT软件手动完成.
是否有命令行界面,因此我可以通过编程方式解析HPROF并自动生成自定义报告.
这对于集成此测试基础结构以进行自动内存分析非常有用.
顺便说一句,堆大小将在10-60MB之间.
在我的工作中,我们遇到了难以重现的OOM问题.或者,更准确地说,它很容易在一个系统上重现,使得该系统无法使用,但在相同的输入下难以在其他任何地方重现.
应用程序使用服务包装器作为服务运行.我们确实设法更改配置以启动它,并选择在OOM上输出堆转储文件,但不幸的是,它们被截断,很可能是由于服务包装器超时并在写入文件时终止进程.这很明显,因为最大内存设置为1GB,而hprof文件小到700MB,这对于OOM上的整个堆来说太小了.
需要花费大量资金来进一步配置包装器以使java进程有更长的时间来写出堆,但我们正在使用这两个选项来实现这一点:
wrapper.jvm_exit.timeout=600
wrapper.shutdown.timeout=600
Run Code Online (Sandbox Code Playgroud)
问题是,我能用截断的hprof文件做些什么有用吗?Eclipse MAT扼杀它们.Jhat似乎加载了它们,但随后只显示了3个大小为0的Java.Object实例.我试过YourKit,它无法写出它的oids文件.
在我看来,这些文件应该包含一些有用的,可访问的信息.有没有一个工具可以读取那里有什么?
感谢您的时间!
HPROF Analyzer/Analyzer任务是android studio 2中的一个很好的工具,可以帮助检测内存泄漏.它比使用eclipse MAT工具耗时少.但是,我无法在AS3中使用新的Android Profiler找到它.
任何帮助是极大的赞赏!