- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在检查内存,试图通过 hprof 转储查找最终的内存泄漏。
我发现有时当我通过后退按钮离开 Activity 时(这将结束 Activity ), Activity 仍会保留在内存中但它只有两个 GC 根,这似乎不是很“强”虽然。
这是我的 Activity 流程/我点击和测试的方式:
A、B、C 是 Activity 。
1) A -> B -> (回到) A
2) 执行 hprof 转储,结果如下:
B 仍在内存中,B Activity 的 GC 根中唯一的元素是:
com.myapp.android.activity.directory.B
com.android.internal.policy.impl.PhoneLayoutInflater 的 mContext
android.app.ContextImpl 的 mLayoutInflater [堆栈本地]
mOuterContext of android.app.ContextImpl [Stack Local]
(线程“main”似乎是 UI 线程)
从 A 继续:
3) A -> C -> (回到) A
4) 执行 hprof 转储,结果如下(如预期):
B不在内存中,C不在内存中,只有A
现在我的问题是:这个PhoneLayoutInflater是从哪里来的/为什么从B返回到A的时候还在内存中,但是再到C再返回到A的时候就没有了。
很明显,PhoneLayoutInflater 用于膨胀 View ,我知道它的用途。我只是不明白为什么它会通过主 UI 线程的 GC 根保存在内存中。
当我检查上面列出的 GC 根时
[local variable] of java.lang.Thread [Thread] "main
它将具有以下内容:
我从 A 调用 Activity B 和 C 的方式是通过常规 startActivity(intent)
为什么 Activity A 的主 UI 线程会以某种方式关联并从 Activity B 引用?
最佳答案
这是我最后做的,但我仍然不高兴我使用反射来解决这个问题。有人吗??
public static boolean ReleaseActivityContext(Context context)
{
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
Class<?> i = inflater.getClass();
try
{
Field f = i.getSuperclass().getDeclaredField("mContext");
f.setAccessible(true); // prevent IllegalAccessException
f.set(inflater, null); // can cause IllegalAccessException
return true;
}
catch (Exception e)
{
e.printStackTrace();
}
return false;
}
关于android - com.android.internal.policy.impl.PhoneLayoutInflater 有时会保留在内存中(hprof 转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3149670/
我有一个 java.hprof.txt 文件(在 OutOfMemoryError 后自动生成),我想将其转换为二进制 hprof 格式。有什么简单的方法可以做到这一点吗? 最佳答案 不,没有。您必须
我的测试设备版本是 5.0.1 (Lollipop)。 我在 Android Studio 1.3 中获取了 Android 堆转储文件。 但是我看到了错误信息。 所以我尝试在 DDMS 中获取转储文
尝试使用内存分析器打开 HPROF 文件(由 Debug.dumpHprofData 创建)时出现以下异常: java.io.IOException: Unknown HPROF Version (J
Eclipse Memory Analyzer 文档说它可以打开 IBM 可移植堆转储文件 (*.phd): http://help.eclipse.org/luna/index.jsp?topic=
如果我使用任何 Java 应用程序(例如 VisualVM)打开堆转储(hprof 文件),VisualVM 是否需要比 hprof 文件大小更多的堆内存? 就我而言,hprof 是 4Gb 文件,V
我正在使用 Eclipse Memory Analyzer 查看 HPROF 文件。它为同一类的不同实例显示不同数量的字段: 看起来缺失的字段可能从未被分配过,但是这些缺失字段的值是多少?它们是“零”
我想知道是否有办法“安排”HPROF转储,以便我们可以每天(或每小时,具体取决于大小)生成一个 HPROF 文件。 我的想法是在生产系统上添加分析,并将其作为日常报告的一部分,这样它就成为“例行公事”
目前我有一个核心转储文件,我想提取堆转储。无论我尝试什么,我总是会收到以下错误消息: god@heaven:~$ sudo /opt/java-MyApp/bin/jmap -dump:format=
我在控制台日志中看到以下错误: HPROF ERROR: unable to resolve a method id HPROF ERROR: got NULL trace in obj_alloc
在我的应用程序中,我可以选择捕获 hprof 转储。我使用过 android.os.Debug.dumpHprofData(字符串文件名) 最初我虽然通过上述方法生成的 hprof 数据是用于整个装置
最近,我在运行应用程序时遇到了 java.lang.OutOfMemoryError 异常。 在一个这样的实例中,我能够使用 jvisualvm 获取堆转储。 我可以使用 NetBeans 8.1 I
这个问题在这里已经有了答案: How do I analyze a .hprof file? (7 个答案) 关闭 5 年前。 我正在运行 Java 应用程序并遇到内存不足的错误。 .hprof 文
正如许多有用网站所详述的那样,分析 Android 应用程序内存使用情况的一种方法是执行“kill -10 [PID]”以触发 HPROF 转储。这似乎适用于某些设备,并且 logcat 通常包含如下
我想跟踪我的应用程序的内存泄漏。但是当我想从 DDMS 按下转储 HPROF 文件按钮时,我收到一条错误消息:“hprof:无法打开/sdcard/com.google.android.apps.up
我尝试将转储从 Android Device Monitor 转换为 Eclipse Memory Analyzer 格式。我使用下一个命令 hprof-conv dump.hprof convert
有时,尤其是在我的应用程序中实现新功能时,我会使用 DDMS + HPROF 来分析内存和堆的使用情况。由于该应用程序似乎没有任何性能 - ANR 问题并且一切正常,最初我并不关心它 - 但现在,我看
我有一个非常大的堆转储 (.hprof) 文件 (16GB)。当我尝试在 Visual Vm 中打开它时,VM 只是挂起。我试图在 JProfiler 中打开它。 Jprofiler 给了我一个内存不
我正在尝试以编程方式分析 hprof 文件。使用 android-sdk 中的 hprof-conv 工具,我生成了一堆 com.your.package.index 文件。 如何以编程方式解析这些
我的程序抛出以下异常: java.lang.OutOfMemoryError: unable to create new native thread 但是当我将 -XX:+HeapDumpOnOutO
我正在调查使用 Eclipse 的内存分析器 (MAT) 分析 HPROF 文件。支配树、报告和 OQL 界面看起来非常有用。但所有这些都必须通过 MAT 软件手动完成。 是否有命令行界面,以便我可以
我是一名优秀的程序员,十分优秀!