Articles of memory leaks

Chrome自定义标签中检测到内存泄漏

我正在尝试实施Chrome自定义标签并通过LeakCanary检测内存泄漏。 除非我们添加另一个Activity层,否则演示应用程序似乎没有泄漏(即MainActivity启动Activity2 ,它绑定/取消绑定到自定义选项卡服务并启动url – MainActivity在演示应用程序中执行的所有操作 )。 MainActivity看起来像这样: public class MainActivity extends Activity implements OnClickListener { private Button mLaunchButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LeakCanary.install(getApplication()); setContentView(R.layout.main); mLaunchButton = (Button) findViewById(R.id.launch_button); mLaunchButton.setOnClickListener(this); } @Override public void onClick(View v) { int viewId = v.getId(); if (viewId == R.id.launch_button) { Intent intent = new Intent(getApplicationContext(), Activity2.class); startActivity(intent); […]

Android中的ServiceConnectionLeaked

我试图在Android中使用服务进行一些基本的数据库操作,但由于某种原因我得到一个Activity泄漏了ServiceConnection错误。 我将在底部发布完整的Logcat读数。 我必须在多个活动中使用相同的服务,所以我创建了一个Superclass来处理所有服务任务。 它看起来像这样: private MyInterface child; public void onCreate(Bundle savedInstanceState, MyInterface child){ super.onCreate(savedInstanceState); doBindService(); } public void onResume(){ super.onResume(); doBindService(); } protected void onPause(){ super.onPause(); doUnbindService(); } private boolean bound; private boolean binding; ServiceConnection Connection = new ServiceConnection(){ //called when the service is connected @Override public void onServiceConnected(ComponentName name, IBinder service) { Log.d(LOGTAG, “Bound […]

Android:AlertDialog导致内存泄漏

我的应用程序显示了一个带有ListView的AlertDialog 。 一切都工作得很好然后我决定测试这个内存泄漏。 运行应用程序一段时间后,我打开了MAT并生成了Leak Suspects报告。 MAT发现了几个类似的泄漏: 由“”加载的“com.android.internal.app.AlertController $ RecycleListView”的一个实例占用… 我花了很多时间寻找这次泄漏的原因。 代码审查没有帮助我,我开始谷歌搜索。 这就是我发现的: 问题5054:AlertDialog似乎通过MessageQueue中的Message导致内存泄漏 我决定检查这个bug是否重现。 为此我创建了一个由两个活动组成的小程序。 MainActivity是一个enrty点。 它只包含一个运行LeakedActivity的按钮。 后者只在其onCreate()方法中显示AlertDialog 。 这是代码: public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); findViewById(R.id.button).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { startActivity( new Intent(MainActivity.this, LeakedActivity.class)); } }); } } public class LeakedActivity extends […]

通知服务中的android内存泄漏

我有一个服务,它会创建一个通知,然后定期用某些信息更新它。 电话崩溃并重新启动大约12分钟后,我相信这是由于以下代码中的内存泄漏造成我如何更新通知,有人请检查/建议我是否是这种情况和我我做错了。 的onCreate: mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); createNotification: private void createNotification() { Intent contentIntent = new Intent(this,MainScreen.class); contentIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent appIntent =PendingIntent.getActivity(this,0, contentIntent, 0); contentView = new RemoteViews(getPackageName(), R.layout.notification); contentView.setImageViewResource(R.id.image, R.drawable.icon); contentView.setTextViewText(R.id.text, “”); notification = new Notification(); notification.when=System.currentTimeMillis(); notification.contentView = contentView; notification.contentIntent = appIntent; } updateNotification: private void updateNotification(String text){ contentView.setTextViewText(R.id.text, text); mNotificationManager.notify(0, notification); […]

由于AudioManager,Android Context Memory Leak ListView

我有一个ListView ,我希望在活动结束时从内存中清除它。 但是,它似乎正在泄漏。 当我检查内存转储,并获取ListView的pathToGC ,我得到以下内容, Class Name | Shallow Heap | Retained Heap android.widget.ExpandableListView @ 0x4063e560 | 768 | 39,904 |- list, mList com.hitpost.TeamChooser @ 0x405f92e8 | 176 | 1,648 | ‘- mOuterContext android.app.ContextImpl @ 0x40657368 | 160 | 304 | ‘- mContext android.media.AudioManager @ 0x40662600 | 40 | 168 | ‘- this$0 android.media.AudioManager$1 @ […]

事件监听器中的内存泄漏

我已经阅读了文章http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html 。 在本文中,建议使用带有WeakReference的静态内部类。 许多内部类用于事件侦听器。 那些内部类也会导致内存泄漏吗? 那些内在阶级应该是静态的吗?

为什么build议不要使用UI保留片段?

我用ui读取保留片段,并在视图上引用可能导致内存泄漏。 比我创buildtesting应用程序与片段,我存储一些参考视图和设置setRetaineInstance(true),但几个屏幕旋转不会导致任何泄漏。 MAT说我只有一个父活动的例子。 我做错了什么? 在哪些情况下用ui保留片段会导致泄漏? RetainInstanceActivity.java public class RetainInstanceActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction() .add(android.R.id.content, RetainFragment.newInstance()) .commit(); } }} RetainFragment.java public class RetainFragment extends Fragment { private View mLogin; private View mPassword; private View ImageView; public static RetainFragment newInstance() { final RetainFragment fragment = […]

内存泄漏的实际例子

我一直在努力识别内存泄漏。 我想我的项目循环进度视图中有几个内存泄漏。 我的猜测之一是我有内部类FadeRunnable内存泄漏。 但说实话,我不知道如何确定这是否是问题的根源。 那么,当我做通常的情况下,切换方向,我看到增加的内存使用情况如下所示。 如果我注释掉FadeRunnable类的用法,步骤会更小( 但仍然存在,所以我想这不是唯一的泄漏 ) 一旦我分析堆转储,我看到一些东西。 但实际上我不知道这些价值是什么意思。 我做的事情是 多次改变方向 打开堆转储并按“保留大小” 现在当我点击“CircularProgressView”时,我在右边看到了8行,我想这意味着有8个“CircularProgressView”实例泄漏,并且在内存中孤立地存在。 它是否正确? 如果是这样,我怎么能find转储信息( 我猜在下面的窗格中的某个地方 )保存/保存此对象的位置。 我很想有一个一步一步的解释如何找出是否和哪个对象泄漏一些内存。 所有怀疑视图的代码都可以在这个类中find。 https://github.com/momentummodules/CircularProgressView/blob/master/circularprogressview/src/main/java/momentum/circularprogressview/CircularProgressView.java 但也可以随时查看完整的项目,以获得更深入的洞察力,如果你想玩它。 提前致谢! UPDATE 上面的代码链接显示了mem-leaking内部类的固定代码。 下面的代码片段显示了永远不会这样使用的原始的泄漏代码 /** * Mem-leaking code, for fixed code see repository link * https://github.com/momentummodules/CircularProgressView/blob/master/circularprogressview/src/main/java/momentum/circularprogressview/CircularProgressView.java */ public class CircularProgressView extends View { … private Thread fadeThread = null; … … class FadeRunnable […]

回收位图不释放内存

我有一个TabHost活动与其他3个活动。 因此,这些都是活着的(或处于“暂停”状态)。 第一个活动有四个不同的图像(每个〜250kb),他们正在检索大量的内存(大约80MB。只是指出,我加载屏幕所需的最小尺寸,如果有帮助,我使用layout_weight )我想尽量减less所需的内存量。 我已经尝试删除OnPause状态的图像,并在OnResume再次设置它们,但我没有运气,这是我正在尝试做的一个例子: imageView.Drawable.Callback = null; ((BitmapDrawable)imageView.Drawable).Bitmap.Recycle(); imageView.Drawable.Dispose(); imageView.SetImageDrawable(null); imageView.SetImageBitmap(null); GC.Collect(); 我不知道是否删除OnPause上的Bitmap是最好的策略,但它应该工作。 我不明白为什么ImageView没有被GC收集(因为没有外部引用) 编辑这是我如何加载图像。 即使将图像放在xml文件中也不起作用。 此外,我不在乎这个代码,我只是想处置位图。 void SetBackgroundImages(int imageId, int resId, float width, float height) { var imageView = FindViewById<ImageView>(imageId); using (var bitmap = DecodeSampledBitmapFromResource(Resources, resId, width, height)) imageView.SetImageBitmap(bitmap); } public static Bitmap DecodeSampledBitmapFromResource(Resources res, int resId, float reqWidth, float reqHeight) { var […]

FragmentStatePagerAdapter内存泄漏(与viewpager嵌套的片段)

我在我的适配器中有一个“内存泄漏”(引号将在后面解释)。 我目前使用嵌套的片段来承载一个viewpager。 我的设置如下: 1.活动(主pipe片段A的空活动) 2.片段A – 使用Fragmentstatepageradapter托pipeviewpager的片段。 每个viewpager页面主持片段B. 3.片段B – 包含imageview的片段。 除非发生configuration更改,否则一切都很好。 监控堆,每发生一次旋转,似乎就会增长100 kb。 手动GCing不释放内存。 我试过的东西: 1.用空片段replace片段B – 同样的问题发生,所以它不是造成问题的imageview。 2.删除片段A和B并旋转活动。 没有发生内存泄漏,所以它不是活动。 3.在任何方向改变之前和旋转约50次之后使用MAT来堆起来。 MAT显示了1个主要的嫌疑犯,这是我的适配器类。 它显示了7MB的观察者留下的堆(非常小的浅堆)如此: array java.util.ArrayList @ 0x42079938 24 7,000,832 .\mObservers android.database.DataSetObservable @ 0x42053508 16 7,000,848 ..\mObservable com.example.main.Adapter@ 0x4205a048 40 7,001,416 为什么我在片段中使用viewpager: 1.通过设置setretaininstance(true),我想保持与viewpager相关的适配器和其他variables的状态。 2.更改configuration后,我不重新创build适配器,而是使用旧的适配器连接到viewpager。 3.如果我不重复使用旧的适配器,而是在更改configuration后创build新的适配器,则内存泄漏消失。 4.closures活动并返回上一个活动后,内存泄漏也消失。 有任何想法吗? 将不胜感激任何帮助。 谢谢,JC