Articles of 内存

记忆和活动:: OutOfMemory

建立 : 我有这个应用程序,它在线性路径中有4个活动,非常简单的导航:A – > B – > C – > D. 所有活动共享相同的背景图像,并且都有一些常规按钮,textview或edittext。 所有这些都在单独的视图xml文件中定义。 背景是渐变,有点沉重。 大约3兆作为未压缩的位图。 该应用程序尚未执行任何操作,其中唯一的逻辑是用于启动活动并在按钮单击时关闭它们 我试图使用MAT来查找内存泄漏但找不到任何内容。 我的应用程序中保留的最大大小为656(ko?),应用程序的总保留大小为1520(ko?),我找不到任何可复制的对象。 顺便说一下,dumpsys分配了27300(ko?) 问题 : 当我向上导航时,我看到相当于背景大小的内存使用量增加。 当我导航DOWN,使用后退按钮或完成命令关闭活动时,应用程序的内存使用量不会减少。 如果我从A转到D然后再回到B并旋转屏幕,app力将以OutOfMemory Exception关闭。 问题: 更新:我想真正的问题是为什么我有一个巨大的内存泄漏(一次5兆),冻结时应用程序大小为27megs,我在MAT中看不到它? 为什么Android会在同一背景下多次解压缩,每次活动一次? 似乎效率低下。 是否有可能通过使用主题来克服这个问题,或者我会看到相同的“按活动分配1个背景”的怪异? 为何活动在关闭时无法收回? 为什么MAT和dumpsys呈现不同的数字? 线索 在同一时间我有:dumpsys meminfo: Applications Memory Usage (kB): Uptime: 74006853 Realtime: 110962243 ** MEMINFO in pid 22683 [com.kayenko.sosadresse] ** native dalvik other total […]

分配variables时Android内存不足

所以我明白了: ’01-01 20:37:34.859: E/dalvikvm-heap(19921): Out of memory on a 6471856-byte allocation.’ 尝试将一堆variables分配给内存时。 我正在分配24个这样的variables: mElements.add(new ShopElement(getResources(),R.drawable.shop_starter, b1X , b1Y,true,1,”red”,true,5,checkLocked(0))); 其中一个: bNumbers = new Bitmap[] {Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h0) , 65,65, true), Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h1) , 65,65, true), Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h2) , 65,65, true), Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h3) , 65,65, true), Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h4) ,65,65,true), Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h5) , 65,65, true), Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h6) , 65,65, […]

有没有办法在没有加载到内存的情况下在Android上裁剪大图像?

我不想在屏幕上显示位图。 只是尝试从SD卡中创建原始图像的最大方形图像,然后上传到服务器。 有没有办法裁剪图像而不将图像加载到内存中? 或者以图块的forms加载图像然后保存到文件?

在内部存储器中创建文件夹以保存文件并在以后检索它们

我想在我的应用程序的内存中创建一个文件夹来存储音频文件,然后检查是否存在进行某些操作。 如何制作这个folde,在哪个路径,以及如何再次检索这些文件?

Android内存测试

这可能是一个愚蠢的问题,但我似乎无法在互联网上find很多具体的信息。 假设我有2个活动:MainActivity和Secondactivity。 mainactivity有一个按钮可以进入第二个活动。 第二个活动有一个返回主活动的按钮(下面非常简单的代码)。 我试图了解android内存管理,这就是我正在做这个测试的原因。 我的问题: 当我经常在活动之间来回走动时,在查看Android工作室中的内存图时,我可以看到一个蓝色的图形,它永远不会回到它在应用程序启动时分配的内存。 我有内存泄漏吗? (可能不是因为这是基本代码)。 但那为什么它一开始就不会回到它原来分配的内存? 主要活动只有这种方法: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btnTest = (Button) findViewById(R.id.btnTest); btnTest.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i(null, “test”); finish(); startActivity(new Intent(MainActivity.this, SecondActivity.class)); } }); } 虽然SecondAcitivity只是回到第一个并创建了一些按钮 public class SecondActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { […]

Android资源:从资源加载的位图如何以内存方式处理?

从这样的资源加载位图时: iv.setImageResource(R.drawable.image); 如果位图通过Scaletype降低质量,它是否仍然保存整个原始位图? (我猜是的,因为人们可以动态改变Scaletype,你会希望拥有完整的质量。) 如果您将相同的资源ID加载到多个ImageView中,是否只有一个位图存储在内存中? 扫描视图层次结构并在onDestroy中手动回收这些位图(通过从ImageView中提取BitmapDrawable)或者我可以确定这是由系统及时完成的​​,这是一个好习惯吗?

Android内存泄漏:InputMethodManager,Bitmap

这有点奇怪,我能够摆脱我自己的内存泄漏,但在这种情况下我无法做同样的事情。 下图显示堆包含从当前活动(mDecor指向当前活动)链接的位图(如2.5 MB)。 我试图在整个应用程序中删除InputMethodManager实例,没有任何效果 我已经尝试设置键盘的默认状态(如果位图是某种用于系统键盘的可绘制的sprint),仍然没有效果 android:windowSoftInputMode=”stateHidden” 什么都没有帮助, 我能做些什么吗? 请注意,解决方案不是Android API版本特定的(我已经在API 8和14/15/16上进行了测试,并且所有这些都有相同的问题) 可能是一个错误,有人可以确认一下吗? http://code.google.com/p/android/issues/detail?id=34731 主要活动在销毁后不会被垃圾收集,因为它是间接由InputMethodManager引用的 InputMethodManager保存对tabhost的引用 – Memory Leak – OOM Error

Android Eclipse DDMS>堆>原因GC灰显

我无法在Eclipse中的DDMS Perspective下的Heap选项卡中单击Cause GC按钮,因为它是灰色的。 我在OS X上使用ADT v22(Eclipse / Android / ADT包)。我使用的设备是S3。 遵循的步骤:1。从Eclipse部署的应用程序2.在DDMS中选择的进程3.单击堆更新按钮4.打开堆选项卡但原因GC显示为灰色。 我猜这是因为没有数据填充堆选项卡(没有客户端选择,列表中没有对象)。 有谁知道什么可能是错的?

无法在JNI中分配足够的内存

我有一个Android本机共享库(.so),用于Android应用程序。 该库最初是为windows / desktop编写的,然后移植到移动平台。 它包含一个“算法”代码,适用于大型数据集。 在库中我不使用标准堆( malloc和朋友),而是通过带有标志MAP_PRIVATE | MAP_ANONYMOUS mmap分配内存页面MAP_PRIVATE | MAP_ANONYMOUS MAP_PRIVATE | MAP_ANONYMOUS然后适当地分区。 现在,问题是在某些时候mmap失败,错误代码= 12,这是内存不足 。 当分配的总内存大小达到大约650MB时,会发生这种情况。 我知道这个值非常大,远远高于典型的Android应用程序所需要的。 但在我的具体情况下,这是合法的恕我直言,因为这确实是这个库/应用程序所做的,并且这是由用户实现和批准的。 具体来说,我尝试在三星平板电脑SM-T800上运行它,该平板电脑具有3GB RAM,32位armeabi-v7a架构和超过7GB的免费存储空间(闪存)。 所以在技术上应该没有问题。 这也不是虚拟内存碎片的问题:当我要求分配多达16MB的额外内存块时, mmap失败。 因此,系统可能会对可以为进程分配多少内存页面施加一些人为限制。 所以,我的问题是,是否以及如何消除此限制。 从我在在线文档中发现的,没有提到这个限制,但我很确定它存在。 我还在一些论坛中读到,从Android 5.0开始,一些应用程序无法分配尽可能多的内存,就像在旧系统中一样。 如果无法删除此限制,是否有助于处理文件映射? 目前我以压缩方式将数据存储在源文件中,然后我读取它并在内存中构建复杂的数据结构。 相反,我可以将整个数据结构存储在一个文件中(意味着,文件会更大),然后通过mmap将其映射到内存中。 虚拟地址空间的总大小将是相同的,但如果限制不是它的大小,而是分配了多少页面而没有文件支持 – 这可能有效。 作为最后的手段,我可​​以放弃在(虚拟)内存中存储所有数据的想法,并手动读取和锁定我当前需要的数据部分,并丢弃最近未使用的数据部分。 但是通过这种方式我实际上复制了内存管理器的工作,因为分页机制就是这样做的。 提前致谢。

如何在旋转图像时避免使用OutOfMemory?

public static boolean rotateBitmapByExifAndSave(File targetFile){ if (targetFile==null || !targetFile.exists() || !targetFile.canRead() || !targetFile.canWrite()) return false; boolean isSucceed = false; // detect if photo is need to be rotated try { final Matrix matrix = new Matrix(); ExifInterface exifReader = new ExifInterface(targetFile.getAbsolutePath()); int orientation = exifReader.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1); boolean isRotationNeeded = true; switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_90: […]