我正在分析我们的应用程序的内存使用情况,并发现奇怪Drawables,它不断"吃"几兆字节的堆.以下是来自MAT的一些截图:
支配树有2个相当大的位图
以上位图之一的GC根路径
这个位图总是出现在我的手机(三星Galaxy Nexus,OS 4.1.1)的堆转储中,无论我使用我们的应用多长时间或多么密集.
我已经尝试使用MAT搜索这个位图的来源 - 没有运气.所有有用的信息,我能找到的就是width和height位图,它的512×512两种:

但我们的应用程序没有任何单个512x512 drawables.我认为这是一些"系统"可绘制的.但到底是什么?为什么他们这么大?
我也查看了android.content.res.Resources类的源代码,搜索sPreloadedDrawables字段的用法- 也没有运气.我从内存转储获取的所有内容都key来自sPreloadedDrawables数组,但我无法从此密钥中确定文件名或资源ID.
所以,我的问题是:
如何确定此位图的名称或ID?
这个巨大的位图是如何加载的以及为什么它们总是留在内存中?
更新:
我找到了一种从内存转储中查看此位图的方法.这两个位图是一个简单的渐变,一个是黑色,另一个是白色.我想这是对资源Holo.Light和Holo.DarkICS主题.但我的第二个问题仍然是实际的:为什么这个位图总是停留在内存中?有没有办法上传或回收它们?
android memory-management bitmap eclipse-memory-analyzer android-resources
使用工具jmap,可以创建两种格式的内存转储:
Binary format: jmap -dump:format=b,file=binary_dump.dat <pid>
Run Code Online (Sandbox Code Playgroud)
要么
Other format: jmap -dump:file=other_format_dump.dat <pid>
Run Code Online (Sandbox Code Playgroud)
我读过很多地方,例如jhat和jvisualvm等工具只能读取二进制格式。
所以:
我有一个使用其他格式创建的内存转储文件,需要能够对其进行检查,最好使用Eclipse Memory Analyzer Tool进行检查。
我从官方网站下载了一个独立的Eclipse Memory Analyzer,打算用它来打开一个hprof文件来做一些分析工作.但是,应用程序似乎在启动后卡住了.我无能为力,只能拖动窗口,如下图所示:
我正在使用的操作系统是macOS Sierra,mat版本是1.6.1,这里是MemoryAnalyzer.ini:
-startup
../Eclipse/plugins/. org.eclipse.equinox.launcher_1.3.100.v20150511-1540.jar
-data
/Users/XXX/eclipse_data
--launcher.library
../Eclipse/plugins/org.eclipse.equinox.launcher.cocoa.macosx.x86_64_1.1.300.v20150602-1417
-vm
/Library/Java/JavaVirtualMachines/jdk1.8.0_152.jdk/Contents/Home/bin/java
-vmargs
-Xmx2g
-Dorg.eclipse.swt.internal.carbon.smallFonts
-XstartOnFirstThread
Run Code Online (Sandbox Code Playgroud)
谁能给我一些建议?非常感谢.
我试图使用 Eclipse MAT 解析 11GB 堆转储,但出现以下错误
An internal error occurred during: "Parsing heap dump"
Run Code Online (Sandbox Code Playgroud)
我认为 MAT 无法解析如此巨大的堆转储。我阅读了一些帖子并将 VM 配置增加到转储大小的 80% 以上。以下是我的虚拟机配置
-vmargs -Xms8192m -Xmx10240m
Run Code Online (Sandbox Code Playgroud)
我仍然无法加载转储。我尝试使用 ParseHeapDump.bat 没有任何变化......
我有Eclipse Memory Analyzer v1.3.1,需要分析一些.phd堆转储。
根据这个问题,有必要在Eclipse Memory Analyzer上安装DTJF。
问题中的此链接说:内存分析器还可以从IBM系统转储和可移植堆转储(PHD)文件中读取与内存有关的信息。为此,只需将IBM DTFJ功能部件安装到Memory Analyzer版本0.8或更高版本中。请遵循IBM DTFJ功能部件安装说明。如果成功安装了DTFJ功能,则“文件”“打开堆转储”应为文件类型提供以下选项……
当我单击“安装”部分中的链接时,到达此位置,似乎是一个文件列表,其中包含一些.jar文件和1个.xml文件,但没有安装说明。
有人知道我应该做什么吗?我没有“正确”安装Eclipse Memory Analyzer v1.3.1-我只是下载了所有文件,并将它们放在C:\ Users(我的用户名)\ Documents \ Software \ MemoryAnalyzer-1.3.1.20140107-win32.win32.x86 \ mat下并通常通过双击文件MemoryAnalyzer.exe来运行它。在安装DTFJ之前我需要做些什么吗?
我安装了eclipse内存分析器(mat)并遵循官方网站上的教程,但.hprof文件在标准文本编辑器中打开,而不是像我预期的那样.
我可能遗漏了一些基本的东西,但我找不到如何明确启动程序.或者如何配置.hprof文件以在地图中打开
我可以使用 OQL 查询 in mat 的所有实例com.google.common.cache.LocalCache$StrongAccessWriteEntry
:
SELECT * FROM com.google.common.cache.LocalCache$StrongAccessWriteEntry
Run Code Online (Sandbox Code Playgroud)
Keep unreachable objects我已经在垫子上打开了。因此结果包含可到达和不可到达的对象。现在我想要获取所有无法访问的com.google.common.cache.LocalCache$StrongAccessWriteEntry instances(又名无 gc 根),如下所示:
SELECT * FROM com.google.common.cache.LocalCache$StrongAccessWriteEntry WHERE unreachable=true
Run Code Online (Sandbox Code Playgroud)
我可以使用 OQL 来完成吗?
必须提供Java RunTime Environment(JRE)或Java Development Kit(JDK)才能运行MemoryAnalyzer.搜索以下位置后未找到Java虚拟机:C:\ Documents and Settings ......
我的问题是如何更改JRE或JDK的路径?
注意我的日食工作完全正常.