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 = […]

以不同的过程打开相机

我的一个应用程序在一些Kitkat Samsung设备中存在严重的活动娱乐问题。 拍摄照片时问题更频繁出现,并且在具有一半RAM的蹩脚的Jellybean Samsung没有观察到。 尽管没有OutOfMemoryException ,但日志显示内存不足的情况。 我认为在Kitkat有一个更积极的活动关闭政策(或者默认的相机应用程序漏洞)。 当我的应用程序的内存很高时,我想知道操作系统是否会关闭我的活动,或者当所有应用程序使用的总内存很高时,它会关闭它们。 如果操作系统具有每个进程阈值,则可能在不同的进程中打开相机可能会有所帮助。 我知道可以使用清单中的process属性在自己的进程中启动服务。 假设Activities不存在等效属性,如果我在自己的进程中启动了代理服务,然后从该服务启动了一个活动,那么活动是否也会在此过程中运行?

Bitmap分配如何在Oreo上运行,以及如何调查它们的内存?

背景 在过去几年中,为了检查Android上的堆内存量以及使用量,您可以使用以下内容: @JvmStatic fun getHeapMemStats(context: Context): String { val runtime = Runtime.getRuntime() val maxMemInBytes = runtime.maxMemory() val availableMemInBytes = runtime.maxMemory() – (runtime.totalMemory() – runtime.freeMemory()) val usedMemInBytes = maxMemInBytes – availableMemInBytes val usedMemInPercentage = usedMemInBytes * 100 / maxMemInBytes return “used: ” + Formatter.formatShortFileSize(context, usedMemInBytes) + ” / ” + Formatter.formatShortFileSize(context, maxMemInBytes) + ” (” + […]

Android垃圾收集器释放内存

我正在开发一个处理大量分配的应用程序(大约400万个双打和100万个类)。 我正在查看垃圾收集器日志,我看到不同设备上释放的内存总量不同。 例如,我有一个Moto X(2014),最终释放超过312 MB。 我还有一个Droid Bionic在相同的数据上运行相同的代码,平均释放616 MB。 两个设备最终的堆大小约为50 MB。 为什么Bionic上的GC释放的内存比Moto X多? 他们应该生成相同数量的垃圾。 垃圾收集器幕后发生了什么? Moto X在Android 5.1上,Bionic在4.1.2上。 编辑:我有四个释放大约300 MB RAM的设备:Moto X(2014),Nexus 7 2013,Nexus 7 2012和Razr i。 所有这四个都使用ART。 Bionic正在运行Dalvik运行时。 这是为什么减少了解放的原因? 我注意到GC_FOR_ALLOC在ART中没有发生,但在Dalvik上一直被调用。

模拟器中的OutOfMemoryException

我真的不知道如何处理这种情况。 突然之间,我在一个特定的Activity上得到一个OutOfMemoryException,并且每次在我正在开发的游戏中遵循相同的路径时它都是相同的。 我在游戏中使用了很多Drawables。 我在某处读到你应该经常执行Bitmap.recycle()来释放内存。 但我几乎从不直接使用Bitmaps和我使用的Drawabels,我需要它们在屏幕上。 我使用Facebook和Parse SDK可能没有帮助。 现在我正在手机和模拟器上进行开发。 在模拟器中,堆大小不能超过30 MB。 我应该增加这个数字还是应该单独留下并尝试保持我的应用程序的内存消耗? 直到最近,我才假设,一旦我完成了一个Activity并进入另一个,所有内容都将被垃圾收集,我开始新的示例代码: private void startGamesActivity() { Intent intent = new Intent(this, SS3GamesActivity.class); startActivity(intent); finish(); } 这不是真的吗? 让我再详细说明一下。 我有一个活动,有两个可能的Facebook播放器ListViews。 OutOfMemoryException发生在我点击其中一个开始一个新的活动时,它应该比之前的活动消耗更少的内存! 这就是为什么我不明白为什么甚至会发生OutOfMemoryException! 在两个ListView收集垃圾后,应该有足够的内存! 所以我现在做的是分析我的堆消耗。 我还下载了Eclipse Memory Analyzer。 正在使用的最大内存块是1字节数组(byte [],boolean []),其数量为702,总大小为20,096 MB,其中最大值为6,240 MB,平均值为29,314 MB。 这让我觉得很多! 它甚至没有在整个应用程序中增加很多。 但是在仿真器中看到堆大小不会超过30MB,因为它有很大的潜力。 使用Eclipse Memory Analyzer,它也给了我两个可能的内存泄漏罪魁祸首。 问题可疑1由“”加载的“android.graphics.Bitmap”的一个实例占用6.543.416(28,00%)个字节。 存储器在由“”加载的“byte []”的一个实例中累积。 问题可疑2由“”加载的类“android.content.res.Resources”占用5.212.968(22,31%)个字节。 内存被累积在由“”加载的“java.lang.Object []”的一个实例中。 结果并没有像我想象的那么直接。 我认为从类名判断可能的嫌疑人是我的LruCache。 […]

Android捏缩放大图像,内存高效而不丢细节

我的应用程序必须显示许多高分辨率图像(约1900 * 2200像素),支持捏缩放。 为避免内存不足错误,我计划使用解码图像以显示全屏 options.inSampleSize = scale (scale was calculated as Power of 2 as Document) (我使用的视图是ImageView TouchImageView扩展) 所以我可以快速加载图像并在屏幕(图像)之间平滑滑动。 但是,当我捏​​缩放时,我的应用程序因缩放图像而丢失细节。 如果我加载完整的图像,我无法加载快速或平滑滑动,捏缩放后拖动。 然后我尝试仅在用户开始捏缩放时加载完整图像,但由于图像非常大,我仍然无法平滑地拖动图像。 Android画廊甚至可以完美地实现8Mpx图像。 任何人都可以帮助我。 提前致谢

Android:图像缓存策略和内存缓存大小

我正在实现一个图像缓存系统来缓存下载的图像。 我的策略基于两级缓存:内存级别和磁盘级别。 我的课程类似于droidfu项目中使用的课程 我下载的图像被放入一个hashmap中,Bitmap对象被包装在一个SoftRererence对象中。 此外,每个图像都永久保存到磁盘。 如果在Hashmap<String,SoftReference>找不到请求的图像Hashmap<String,SoftReference>它将在磁盘上搜索,重新加载,然后推回到hashmap中。 否则,图像将从网络下载。 由于我将图像存储到物理设备momery中,因此我添加了一个检查以保留设备空间并保持在占用空间的1M以下: private void checkCacheUsage() { long size = 0; final File[] fileList = new File(mCacheDirPath).listFiles(); Arrays.sort(fileList, new Comparator() { public int compare(File f1, File f2) { return Long.valueOf(f2.lastModified()).compareTo( f1.lastModified()); } }); for (File file : fileList) { size += file.length(); if (size > MAX_DISK_CACHE_SIZE) { file.delete(); Log.d(ImageCache.class.getSimpleName(), “checkCacheUsage: […]

每个android进程获得多少内存?

我们可以依靠我们的Android应用程序获取一定数量的内存,还是在手机型号或操作系统版本之间有所不同? 例如,我有一个内存缓存,我已将其限制设置为5 MB。 如果在一台设备上,我的应用程序只能获得8 MB内存,而在另一台设备上,24 MB,我想调整内存缓存的上限以利用更多或更少的内存。 有没有办法解决这个问题,金额是否有所不同?

NanoHttpd服务器无法在android上传输大型video

NanoHttpd服务器代码可以在这里find。 我正在使用NanoHttpd服务器来传输大型video(大约150mb)的服务中启动一个新线程,但它只是在显示加载对话框时暂停。 我尝试增加和减少缓冲区读取无济于事。 似乎服务器无法在Android设备上正常运行。 通过桌面应用程序启动服务器时,相同的代码工作正常。 我的流量超过150mb。 从手机运行服务器时,我只尝试了20mb文件,它们也很好。 但是我需要更多的流。

如何强制Android调试内存压力?

我试图解决我的Android应用程序遇到的一些问题,当我在显式“前台”模式(Service.startForeground)中运行时,我认为这与内存压力有关。 为了调试这个我需要在我的应用程序上施加内存压力,我可以通过各种方式执行此操作,例如启动各种其他应用程序,例如具有大量网页的Firefox。 然而,这不太理想,因为它仍然相当耗时且不精确。 所以我的问题是,有没有办法使用调试器强制内存压力(例如在Eclipse下)或者专门用于此目的的特殊应用程序? 我宁愿不绕道自己写一个,显然在我自己的应用程序中分配内存是行不通的。 更新:更改标题以反映我需要设备上的实际内存压力,而不是模拟。