我对内存泄漏以及可能导致它们的原因有基本的了解。这就是为什么我不明白我的代码是否有问题或者是误报。由于项目不小,不知道该分享哪一部分代码。但请在评论中告诉我,我会添加所需的代码。
我使用导航拱组件并遵循 MVVM 模式。我后来在项目开发中添加了 LeakCanary 库,当我在屏幕之间导航时,它立即开始向我发出有关保留实例的警告。
当我将片段添加到后堆栈时会出现问题。随着每个添加到返回堆栈的片段,保留实例的计数器增加。当达到阈值 5 LeakCanary 转储堆并提供报告。
但是,如果我单击后退按钮并返回到之前的屏幕,则保留实例的计数器会减少,最终,当返回到第一个屏幕时,所有保留的实例都会消失。
如果我查看堆分析报告,它说作为对CoordinatorLayout
in xml的引用的变量 coordinatorLayout已经泄漏。如果我删除变量及其所有用法并再次运行应用程序,我会看到同样的问题,但现在另一个变量是对 xml 中另一个视图的引用。我试图删除 LeakCanary 报告为泄漏的所有视图及其使用情况。当它说 aTextView
只是用来设置文本onViewCreated
而不在其他任何地方使用时,它正在泄漏,我开始怀疑我的代码中存在问题。
我分析了片段中的生命周期方法调用,并注意到当我导航到前一个片段的新屏幕时,所有方法直到和包括onDestroyView
被调用但没有被调用onDestroy
。当我单击返回时onDestroy
,会为位于后堆栈顶部的片段调用返回,并且保留实例计数器减少。
我怀疑导航组件在返回堆栈中时保留了片段的实例,而 LeakCanary 将其视为泄漏。
android memory-leaks kotlin leakcanary android-architecture-navigation
我知道这可能是一个愚蠢的问题,但我是开发android的新手,我目前在我的应用程序中遇到了OutOfMemoryError,我试图使用MAT调试,但是仍然很难找到漏洞活动,然后我找到了LeakCanary,这看起来更简单,更容易使用,但是我找不到任何有关使用Leak Canary的初学者一步一步指南,即使在Google上也是如此.我已经通过build.gradle中的依赖项安装了LeakCanary,这是我到目前为止所得到的:
ExampleApplication.java
public class ExampleApplication extends Application {
public static RefWatcher getRefWatcher(Context context) {
ExampleApplication application = (ExampleApplication) context.getApplicationContext();
return application.refWatcher;
}
private RefWatcher refWatcher;
@Override
public void onCreate() {
super.onCreate();
refWatcher = LeakCanary.install(this);
}
final class KeyedWeakReference extends WeakReference<Object> {
public final String key;
public final String name;
KeyedWeakReference(Object referent, String key, String name,
ReferenceQueue<Object> referenceQueue) {
super(checkNotNull(referent, "referent"), checkNotNull(referenceQueue, "referenceQueue"));
this.key = checkNotNull(key, "key");
this.name = checkNotNull(name, "name");
}
}
public void watch(Object watchedReference, String referenceName) { …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用LeakCanary来检测我的应用程序中的内存泄漏,但它没有比消息"倾倒内存,应用程序将冻结.Brrr."更进一步.我已经等了大约20分钟左右,但没有变化.在这些设备上的行为相同:1.华硕fonepad 8(Android 5.0股票)2.索尼Xperia SP(Android 5.1.1 CM 12.1自定义)3.HTC Desire C(Android 4.4 CM 11自定义)
我在教学中做了一切建议:
public class ExampleApplication extends Application {
@Override public void onCreate() {
super.onCreate();
LeakCanary.install(this);
}
}
Run Code Online (Sandbox Code Playgroud) 我决定现在是时候学习如何使用Leak Canary来检测我的应用程序中的泄漏,并且像往常一样,我尝试在我的项目中实现它以真正理解如何使用该工具.实现它很容易,困难的部分是阅读工具向我扔回来的东西.我有一个滚动视图似乎在内存管理器中累积内存,因为我向上和向下滚动(即使它没有加载任何新数据)所以我认为这是一个很好的候选对象来跟踪泄漏,这是结果:
它看起来像v7.widget.RecyclerView泄漏适配器,而不是我的应用程序.但那不可能是对的......对吗?
这是适配器的代码和使用它的类:https: //gist.github.com/feresr/a53c7b68145d6414c40ec70b3b842f1e
我开始对这个问题表示赏心悦目,因为它在两年后完全不同的应用程序上重新出现了
build.gradle已根据github insturctions配置.LeakCanary类似乎未包含在内.
dependencies {
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'
}
Run Code Online (Sandbox Code Playgroud)
analyzer和watcher包中只有一个单个类文件.
我正在使用LeakCanary库来监控我的应用程序中的内存泄漏.我收到了这个内存泄漏,不知道如何追踪导致它的原因.
05-09 09:32:14.731 28497-31220/? D/LeakCanary? In com.etiennelawlor.minesweeper:0.0.21:21.
* com.etiennelawlor.minesweeper.fragments.MinesweeperFragment has leaked:
* GC ROOT com.google.android.gms.games.internal.GamesClientImpl$PopupLocationInfoBinderCallbacks.zzahO
* references com.google.android.gms.games.internal.PopupManager$PopupManagerHCMR1.zzajo
* references com.google.android.gms.games.internal.GamesClientImpl.mContext
* references com.etiennelawlor.minesweeper.activities.MinesweeperActivity.mFragments
* references android.app.FragmentManagerImpl.mAdded
* references java.util.ArrayList.array
* references array java.lang.Object[].[0]
* leaks com.etiennelawlor.minesweeper.fragments.MinesweeperFragment instance
* Reference Key: 2f367393-6dfd-4797-8d85-7ac52c431d07
* Device: LGE google Nexus 5 hammerhead
* Android Version: 5.1 API: 22
* Durations: watch=5015ms, gc=141ms, heap dump=1978ms, analysis=23484ms
Run Code Online (Sandbox Code Playgroud)
这是我的回购:https: //github.com/lawloretienne/Minesweeper
这似乎是一个难以捉摸的.我建立了Interface
一个Fragment
和a之间的沟通Activity
.我设置了这个mCoordinator
Interface
变量onAttach()
然后我意识到我没有把它归零 …
我正在使用泄漏金丝雀来跟踪内存泄漏,它说以下泄露:
static hk.o
references ht.a
leaks MainActivity instance
Run Code Online (Sandbox Code Playgroud)
什么是hk.o
和ht.a
?我在MainActivity中没有它们.
在我的应用程序中添加了LeakCanary(1.3):
@Override
public void onCreate() {
super.onCreate();
Fabric.with(this, new Crashlytics());
LeakCanary.install(this);
Run Code Online (Sandbox Code Playgroud)
当我为我的应用程序运行Robolectric测试套件时,我在LeakCanary中得到一个NullPointerException.
Caused by: java.lang.NullPointerException
at com.squareup.leakcanary.LeakCanary.isInServiceProcess(LeakCanary.java:165)
at com.squareup.leakcanary.LeakCanary.isInAnalyzerProcess(LeakCanary.java:141)
at com.squareup.leakcanary.LeakCanary.install(LeakCanary.java:52)
at com.squareup.leakcanary.LeakCanary.install(LeakCanary.java:43)
at com.package.application.MyApplication.onCreate(MyApplication.java:50)
at org.robolectric.internal.ParallelUniverse.setUpApplicationState(ParallelUniverse.java:131)
at org.robolectric.RobolectricTestRunner.setUpApplicationState(RobolectricTestRunner.java:431)
at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:224)
Run Code Online (Sandbox Code Playgroud)
我补充说,我使用Crashlytics指出它(以及其他方法)接收相同的应用程序但不抛出任何异常.
不确定这应该在这里还是在LeakCanary的GitHub问题上.有其他人遇到过这个问题吗?
我在Android(Java)中遇到了一个名为LeakCanary的内存泄漏检测库,但无法理解他们泄漏内存的示例.任何人都可以解释他们的示例中显示的代码是如何以及为什么是内存泄漏.
class Cat {
}
class Box {
Cat hiddenCat;
}
class Docker {
static Box container;
}
// ...
Box box = new Box();
Cat schrodingerCat = new Cat();
box.hiddenCat = schrodingerCat;
Docker.container = box;
Run Code Online (Sandbox Code Playgroud)
然后他们观察schrodingerCat
泄漏的变量,如下所示给出泄漏(我不知道如何与上面的代码相关).
* GC ROOT static Docker.container
* references Box.hiddenCat
* leaks Cat instance
Run Code Online (Sandbox Code Playgroud)
任何有关泄漏的解释以及检测与其相关的帮助都将非常有帮助.另外一些适合初学者的好文章也不错.
谢谢!
当使用最新的谷歌地图API中的MapView时,我收到了内存泄漏,因为MapView正在保持我的活动.
我使用了泄漏金丝雀并且有这种痕迹
D/LeakCanary:*GC ROOT com.google.android.gms.location.internal.ta
D/LeakCanary:*引用com.google.android.gms.location.internal.sa
D/LeakCanary:*引用com.google.maps.api.android.lib6.dvc
D/LeakCanary:*引用com.google.maps.api.android.lib6.d.aj.b
D/LeakCanary:*引用com.google.maps.api.android.lib6.gmm6.cpa
D/LeakCanary:*引用com.google.maps.api.android.lib6.gmm6.cymParent
D/LeakCanary:*引用android.widget.FrameLayout.mParent
D/LeakCanary:*引用com.google.android.gms.maps.MapView.mContext
D/LeakCanary:*泄漏com.myapp.activities.main.AttractionDetailActivity实例
谁看过这个吗?
leakcanary ×10
android ×9
memory-leaks ×9
android-architecture-navigation ×1
google-maps ×1
java ×1
kotlin ×1
memory ×1
robolectric ×1
square ×1