Articles of 内存泄漏

android.database.CursorWindowAllocationException:即使关闭游标后,游标窗口分配2048 kb失败

有关CursorWindowAllocatoinException的SO有很多问题: SQLite Android数据库游标窗口分配2048 kb失败 无法分配CursorWindow 分配游标时内存不足 Android SQLite CursorWindowAllocationException崩溃 所有这些都表明光标必须在使用后关闭。 但这并没有解决我的问题。 这是我的代码: String query = “select serial from tbl1 union select serial from tbl2 union select serial from tbl3”; SQLiteDatabase db = null; Cursor cur = null; try { SettingsDatabaseHelper dal = new SettingsDatabaseHelper( c); db = dal.getReadableDatabase(); cur = db.rawQuery(query, null); int numRows = […]

Android FinalizerReference使用7mb的RAM

我知道有关于这个的2-3个主题, FinalizerReference存在问题,但它仍然没有得到很好的解释。 我有一个关于这个课程的问题,以及它的工作原理。 无论我在我的应用程序中做什么, FinalizerReference总是为自己保留5-10个RAM ,我的问题是: 这是一种我不必担心的正常行为吗? 据我所知,Java对象被释放,但是“指针”保留在内存中,并且用下一个GC清理它们(以及用GC清理的普通对象,没有引用它)。 对我来说,这有点不对,因为如果我有大约64 MB的RAM用于我的应用程序而10mb被浪费 – 一定有问题。 我检查了一切,删除了我所有的泄漏,目前我的应用程序只停留在18~mb RAM(7 RAM – 图形,2 RAM – 对象)。 其余的 – FinalizerReference ; / 这是AppHeap的截图: 这是一个来自它的实例的屏幕: 这是我的记忆监控器(它保持这种forms30分钟): 此外,在“实例”面板中,有50个条目,包括我使用的代码和库中的~5个。 其余的来自Android – InputManagers,Parcels,Proxies等。 编辑 这发生在Galaxy S5上。 在Android模拟器上,我从FinalizerReference得到~2MB

Android中的“未知”(“其他”)内存泄漏?

Android Studio Memory Profiler报告Others类别的分配。 根据https://developer.android.com/studio/profile/memory-profiler.html :其他:您的应用程序使用的内存,系统不确定如何分类。 如果我们深入挖掘,可以使用https://developer.android.com/reference/android/os/Debug.MemoryInfo.html#getMemoryStat(java.lang.String)在运行时检索类似的内存占用信息。 看起来Android Studio Memory Profiler中的Others对应于Debug.MemoryInfo类中的summary.private-other 。 该参数报告为: public int getSummaryPrivateOther() { return getTotalPrivateClean() + getTotalPrivateDirty() – getSummaryJavaHeap() – getSummaryNativeHeap() – getSummaryCode() – getSummaryStack() – getSummaryGraphics(); } 哪种内存分配最终会出现在该类别中? 它显然不是Java,Native,Code,Stack和Graphics。 如果我的应用程序(具有非常大的代码库,所以我无法确定某个导致它的特定代码)消耗了大量的Other内存,是否有某种源/模式导致这种消费? 编辑1我能够部分回答第一部分我自己的问题: 哪种内存分配最终会出现在该类别中? 它显然不是Java,Native,Code,Stack和Graphics。 也可以使用adb shell dumpsys meminfo 检索RAM信息,通常如下所示: 在实验上,我可以看到Unknown很可能被包含在Private Other 。 这提出了下一个问题:什么是Unknown ? 根据https://developer.android.com/studio/command-line/dumpsys.html#meminfo : 系统无法将任何RAM页面分类为其他更具体的项目之一。 目前,这主要包含本机分配,由于地址空间布局随机化(ASLR),在收集此数据时,工具无法识别该分配。 就像Dalvik堆一样,Pss Total for […]

来自Google I / O的Android内存泄漏示例

我刚看了谷歌iovideo“android的内存管理”。 幻灯片可在http://dubroy.com/memory_management_for_android_apps.pdf上find 。 内存泄漏示例在幻灯片36上。 我不明白为什么这会在方向改变后导致泄漏。 我确实知道泄漏是一个内部类,并且引用了外部类。 另外,我确实理解静态variables“leak”引用了“Leaky”对象……就是整个活动。 我认为这是特殊的,因为static关键字。 静态variables有一定的内存,可能不是gc’ed(至少只要应用程序运行)?!? 那么,oriantation变化会发生什么? 将创建一个新的活动实例,并调用onCreate活动。 leak == null为false。 泄漏仍指向“旧”活动。 那是泄密。 老活动不能接受,对吧? 为什么内存使用会随着每个oriantation的变化而增加? 在我(错误的)理解中,我假设只有第一个活动不能被gc’ed。 由于oriantation更改而创建的其他活动可以是gc’ed,因为它们没有被静态variables“leak”引用。 但是……显然……我完全错了!

如果Android的回调被重置,为什么Android会因静态Drawable泄漏内存?

我只是关注如何避免内存泄漏的文章: android开发者博客以下是使用的代码片段: private static Drawable sBackground; @Override protected void onCreate(Bundle state) { super.onCreate(state); TextView label = new TextView(this); label.setText(“Leaks are bad”); if (sBackground == null) { sBackground = getDrawable(R.drawable.large_bitmap); } label.setBackgroundDrawable(sBackground); setContentView(label); } 据说drawable有一个对textview的回调引用(和间接对activity的引用); 这将在旋转时保留 – 因此内存泄漏。 我的查询是不会在旋转时重置drawable的回调 – 它将获得新的textview(将保存新的上下文)…因此允许以前的textview / context实例进行GC。 编辑 :我得到的答案是如何“解决”问题 – 我不是在寻找! 请重新阅读查询。 我正在添加更多细节。 启动活动时,引用是: Drawable1 – > TextView1 – > […]

活动泄露窗口com.android.internal.policy.impl.PhoneWindow$DecorView@46368a28最初添加在这里

这个问题让我抓狂。 我想念一些关于如何在一个活动中创建的新线程中处理长操作以及如何在长时间操作完成后修改视图组件(如文本等)的基本但非常重要的知识。 让我首先向您展示我的代码中发生此问题的部分: mProgressDialog = ProgressDialog.show(mContext, “Tripplanner”, “please wait…”, true, false); connectAndGetRoute(); private void connectAndGetRoute(){ new Thread(){ @Override public void run() { try { if(!connectTo9292ov()) return;// conncetto9292ov() connects to a website, parses the reasult into an arraylist. The arraylist contains route. } catch(UnknownHostException e){ Toast.makeText(mContext, “failed to connect to server”, Toast.LENGTH_LONG).show(); }catch (ClientProtocolException e) { […]

Android上下文在AsyncTask中泄漏

如果我正确地解释了这篇文章 ,将活动上下文传递给AsyncTasks是一个潜在的泄漏,因为在任务仍在运行时活动可能会被销毁。 你如何在AsyncTasks中解决这个问题,这些问题不是内部的,需要访问资源或更新UI? 另外,如果需要引用进度对话框来解除它们,如何避免泄露上下文?

Kotlin:安全的lambdas(没有内存泄漏)?

在阅读了关于内存泄漏的这篇文章之后,我想知道在Kotlin Android项目中使用lambdas是否安全。 确实,lambda语法让我更容易编程,但内存泄漏怎么样? 作为问题的一个例子,我从我的一个项目中获取了一段代码,在那里我构建了一个AlertDialog。 此代码位于项目的MainActivity类中。 fun deleteItemOnConfirmation(id: Long) : Unit { val item = explorerAdapter.getItemAt(id.toInt()) val stringId = if (item.isDirectory) R.string.about_to_delete_folder else R.string.about_to_delete_file val dialog = AlertDialog.Builder(this). setMessage(String.format(getString(stringId), item.name)).setPositiveButton( R.string.ok, {dialog: DialogInterface, id: Int -> val success = if (item.isDirectory) ExplorerFileManager.deleteFolderRecursively(item.name) else ExplorerFileManager.deleteFile(item.name) if (success) { explorerAdapter.deleteItem(item) explorerRecyclerView.invalidate() } else Toast.makeText(this@MainActivity, R.string.file_deletion_error, Toast.LENGTH_SHORT).show() }).setNegativeButton( R.string.cancel, […]

运行模拟器时,SQLiteConnection数据库会泄漏

我正在运行模拟器并收到有关内存泄漏的以下错误。 有趣的是,泄漏的数据库似乎是谷歌gms而不是用户数据库。 有谁知道如何修理它? 谢谢! 09-27 15:55:07.252 2058-2068/com.google.android.gms W/SQLiteConnectionPool: A SQLiteConnection object for database ‘/data/user/0/com.google.android.gms/databases/metrics.db’ was leaked! Please fix your application to end transactions in progress properly and to close the database when it is no longer needed. 09-27 15:55:07.255 2058-2068/com.google.android.gms W/SQLiteConnectionPool: A SQLiteConnection object for database ‘/data/user/0/com.google.android.gms/databases/help_responses.db’ was leaked! Please fix your application to end […]

使用WeakReferences有什么好处?

我的应用程序中有一些内存泄漏。 它们都是围绕一个特定的视图集群发起的,我花了很多时间进行调整,并尝试尽可能减少大量的上下文传递。 这让我相信群集中使用的位图是个问题。 所以我想将WeakReferences用于对视图使用的位图的所有引用。 我从来没有使用过WeakReference,也不确定这是不是一个好的应用程序。 任何机构都可以提供有用的指示或提示吗?