【发布时间】:2019-02-07 15:22:49
【问题描述】:
我的应用程序无法在 android 4.x 上运行,所以我只是在分析我的应用程序的堆数据,我发现 java.lang.FinalizerReference 保留了这么多内存。任何人都可以解释一下吗?任何想法将不胜感激。
【问题讨论】:
-
为每个具有“非平凡”
finalize()方法的对象创建一个FinalizerReference。您可以检查FinalizerReference实例的引用以找出负责的对象(以及相应的类)。然后,您可能会重新考虑它是否真的需要自定义finalize()方法。 -
@Holger 是的,我查过了,都是框架的类,比如android.os.Parcel,我自己定义的类没有覆盖finalize()方法。
-
那么,没有什么可以改变的了。但请注意,
FinalizerReference实例不会消耗那么多内存 (48kB); “保留大小”包括所指对象的内存以及可能通过该对象可访问的更多对象。当这些对象只能通过这些引用对象访问时,这表明后续的垃圾收集/终结循环可以删除它们。 -
我观察了我的应用程序 30 分钟,FinalizerReference 保留的内存在增加,并且没有减少。⊙﹏⊙‖∣
-
好吧,一个应用程序可以运行 30 分钟甚至几天而无需任何垃圾收集。这可能违反直觉,但分配的内存不会受到伤害,只要它实际上不需要用于其他目的。所以他们的问题是,这些对象是否继续使用内存,当你这样做时,强制垃圾收集或让内存完全运行。
标签: java android memory-management heap-memory