Articles of 内存管理

为什么Android在加载图像时会分配比所需更多的内存

伙计们,我不认为这是重复的,也不是其中一个我如何避免OOM问题。 这是对知识的真正追求,所以推迟那些投票请… 想象一下,我有一个500×500像素的JPEG 。 我将其加载为ARGB_8888 ,这是“ bad as it gets ”。 我希望Android能够分配500x500x4 bytes = a little under 1MB但是,看看堆转储 ,你会发现Android的分配明显更多,通常是5-10倍的因素。 您经常在这里看到有关OOMS的问题,其中堆栈跟踪显示一个heap request of say 15MB的heap request of say 15MB并且它总是比仅仅保存图像的字节要大得多。 OP通常捕获一些downvotes然后用股票答案和关于使用更少内存(感谢Romain!)和缩放的评论轰炸。 我认为这里不仅仅有眼睛。 谁知道为什么会这样? 如果没有明显的答案,如果有帮助,我会组建一个SSCCE 。 PS。 我认为JPEG与PNG等是无关紧要的,因为我们讨论的是后备位图的内存使用量,这只是x乘以BPP的x倍 – 或者我是否很慢?

从一个活动调用finish()会释放我的记忆空间吗?

我的活动在我的应用程序中使用了大量内存。 因此,每当用户从该活动切换到其他活动时,我都会尝试调用finish()来停止该活动。 我的问题是,从该活动调用finish()会释放内存空间还是只是完成该活动而不清除该特定活动使用的内存? 任何帮助深表感谢..

在android中,对于内存的位图具有可绘制的优势

此问题与以下问题中的答案相关联: 删除位图时出错[Android] 在内存解除分配方面,在Android中使用Drawable over Bitmap是否有任何优势? 我正在看Romain Guy项目Shelves,他使用SoftReference来处理图像缓存,但是当SoftReference自动回收Bitmap的内存时,我无法搜索解除分配这些Drawables的代码。 据我所知,必须在Bitmap上显式调用.recycle()才能对其进行解除分配。

Java – 内联代码会有好处吗?

我做了一些研究,但我主要看到c ++的答案。 我最接近的就是这个 。 我也看过这个页面,但它并没有真正解释任何事情。 如果我使用第二段代码有什么好处吗? 会有明显的性能差异吗? 记忆呢? 如果重复完成怎么办? 现在我有这个function。 我确信这样做的好处是代码可读性: private static Bitmap resize(Bitmap image, int maxWidth) { float widthReducePercentage = ((float) maxWidth / image.getWidth()); int scaledHeight = Math.round(image.getHeight() * widthReducePercentage); return Bitmap.createScaledBitmap(image, maxWidth, scaledHeight, true); } 现在,我有第二段代码: private static Bitmap resize(Bitmap image, int maxWidth) { return Bitmap.createScaledBitmap(image, maxWidth, Math.round(image.getHeight() * (float) maxWidth / […]

为什么在运行应用程序时始终在Android Logcat中显示GC_CONCURRENT FREED和GC_CONCURRENT ALLOCATE?

我想知道为什么每次运行任何应用程序时都会显示以下消息。 12-11 17:18:37.141: D/dalvikvm(3155): GC_CONCURRENT freed 485K, 9% free 6696K/7303K, paused 9ms+335ms paused 9ms+335ms由于这个暂停,我应该播放的音频丢失,因为根据我的代码,它每40ms接收一次音频数据所以这里它暂停了9ms+335ms ,这是数据丢失的10 times 我知道它执行某种垃圾收集,但我的问题是为什么它经常出现在logcat中。 谢谢你的帮助!!!!!!

Android上本机堆的最大大小?

如果我理解正确,一个android进程有两个堆 – 一个由VM管理,一个是本机。 VM堆的大小不能超过16mb(至少,某些手机上的此值可能会更高)。 但是本机堆的最大大小呢? 16 MB限制似乎不是硬限制,因为应用程序可以通过NDK分配超过16mb,但是当使用大量内存时,操作系统将开始杀死其他进程以及可能的前台进程。 操作系统何时开始以这种方式运行? 当本地堆+ VM堆大小超过16mb? Debug.getNativeHeapSize()给出了本机堆的大小,但是有一个函数可以检查组合的本机+ VM堆大小吗? 很想知道知道这是如何工作的人!

缓存目录不存在

context.getApplicationContext().getCacheDir()返回null ? 据我所知,内部缓存目录应始终存在。 谢谢!

Java临时迭代器正在减慢我的Android游戏速度

出于性能原因,这个问题涉及Java中的内存管理:因为我正在开发这个程序作为Android游戏和内存GC扼杀了我的表现。 所以到目前为止我已经完成了大量的工作,事实certificate我在优化游戏的内存使用方面做得很好,但我有一个问题:迭代器! 这是我在做的事情: 开始游戏关卡。 启动分配跟踪器(这样我们就会忽略在级别运行时将保留的所有分配;我有许多对象只能在级别的开头创建一次并且它们不是问题)。 在关卡中做一些事情并获得分配。 我的分配充满了这个: 466 24 java.util.AbstractList $ SimpleListIterator 12 java.util.AbstractList迭代器 465 24 java.util.AbstractList $ SimpleListIterator 12 java.util.AbstractList迭代器 464 24 java.util.AbstractList $ SimpleListIterator 12 java.util.AbstractList迭代器 463 24 java.util.AbstractList $ SimpleListIterator 12 java.util.AbstractList迭代器 461 24 java.util.AbstractList $ SimpleListIterator 12 java.util.AbstractList迭代器 456 24 java.util.ArrayList $ ArrayListIterator 12 java.util.ArrayList迭代器 454 24 java.util.ArrayList $ ArrayListIterator 12 […]

Android:关于位图,内存使用和扩展的问题

为了便于阅读,我首先发布了我的解决方案所引用的代码示例,然后我在数字列表中列出了我的解决方案的解释。 我一直在努力解决这个问题。 我做了很多阅读,在这里问了问题,并进行了实验; 但还没有find一个像样的解决方案。 我需要从输入流中读取各种大小的图像,并以我的内存约束允许的高质量显示它们。 以下是我考虑的选项,对我来说似乎都不是很好。 任何帮助或输入将不胜感激。 public class NativeTest extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); double nativeUsage = Debug.getNativeHeapAllocatedSize(); Log.i(“memory”, nativeUsage+””); } } double getAvailableMemory() { //current heap size double heapSize = Runtime.getRuntime().totalMemory(); //amount available in heap double heapRemaining = Runtime.getRuntime().freeMemory(); double nativeUsage = Debug.getNativeHeapAllocatedSize(); double memoryAvailable = Runtime.getRuntime().maxMemory() – […]

为什么重新启动活动时堆内存会增加?

这个问题与Android中的内存有关。 我的方法: 我有两个活动,A和B.从A,我这样启动B: Intent i = new Intent(A.this, B.class); startActivity(i); 在按钮上单击B,我这样做: B.this.finish(); 在B中,我重写onDestroy方法并将所有引用设置为null。 我没有在A的onResume方法中分配新的内存。 我没有泄露上下文。 我没有使用多个线程。 我没有使用服务。 B中的所有variables都是私有类variables,并且所有variables在B的onDestroy中都设置为null。 此外,B中的ImageViews在onDestroy of B中将其背景设置为null。 我确信B会被摧毁。 结果: 当我在活动A中时,堆内存为7.44 MB。 然后,当我启动B并在B上调用完成(从而返回到A)时,堆增加了0.16 MB。 再次重复此过程,堆每次增加0.08 MB。 我没有查看堆限制,我正在查看分配的堆。 我在B的onDestroy方法的末尾调用System.gc()。 附加信息: – 我使用MAT来分析内存分配并试图find这个漏洞。 奇怪的是,活动B似乎有5个实例。 碰巧的是,我重复了startActivity / finish过程5次。 底部条目是活动,其他条目是活动中的监听器: 这是统治者树的截图。 我找不到任何exception或怀疑的东西。 – 我已经观看了关于内存使用(和泄漏)的谷歌IOvideo。 题: 无论我做什么,是否有可能始终分配这个0.08 MB的堆(并且不能由GC收集)? 如果没有,任何可能导致这种情况的想法? 更新: 我试图在没有在B中设置内容视图的情况下启动活动B.这意味着B是一个完全空的活动。 结果是当我多次重新启动活动时堆内存没有增加。 但请注意,这不是解决方案。 我必须能够设置内容视图。 scorpiodawg:我尝试在模拟器上运行我的应用程序,堆仍在增长。 不错的尝试。 ntc:我把“this”的所有出现都改为“getApplicationContext()”。 […]