我最近修改了我的代码的一大块,垃圾收集器发疯了,我无法弄清楚它删除了什么。所以我想得到垃圾收集器删除的东西的名称。
我已经尝试了Android设备监视器,但我无法弄清楚在哪里或如何找到它或者它是否可能。
我该怎么做才能找出修改代码的位置?
答案 0 :(得分:0)
finalize()
,
此API由Java提供,JVM会在对象即将通过GC时调用,但如果没有保证,如果它将按照JAVA DOC进行调用,则可以尝试在此处打印名称。
希望这能解决你的问题。
答案 1 :(得分:0)
(实际上,如果GC“疯了”,更可能的问题是它无法删除的对象比它删除的对象。)
首先,对象(通常)没有名称。
其次,我认为无法跟踪GC实际删除对象的时间。
因此跟踪对象删除不太可行......反正可能无济于事。
我认为你真正需要的是一个内存分析器工具(例如DDMS),它可以告诉你对象是否被分配,并且可以帮助你分析所有现场(可达)的对象和垃圾(无法到达)。
可能使GC使用大量时间(或“疯狂”)的两个最可能的事情是:
拥有太多可访问的数据。随着堆接近满,尝试收集垃圾所花费的时间百分比急剧增加。导致数据过多的常见原因是应用程序存储泄漏。
创建过多的临时对象。分配率越高意味着收集器必须更频繁地运行。
参考文献: