Articles of 内存管理

Android:Bitmaps,SoftReferences和OOM?

我在垂直LinearLayout中有一系列视图。 滚动到时,每个视图都会生成并绘制一个位图。 出于性能原因,我宁愿每次调用onDraw()时都不生成Bitmap,但出于内存原因,我无法保留对Bitmaps的硬引用。 我可以就我应该采取的策略提出建议。 我已经尝试过明显的路径:生成Bitmap,然后用SoftReference包装它。 这失败有两个原因。 收集的参考文献比我预期的更加热切。 我还是得到了OOM! 这是令人震惊的,因为没有Bitmap特别大,所以单个视图不应该导致OOM,让我假设OOM发生,因为违规的SoftReference没有被释放的机会。 此外,当我的应用程序的分配堆大小为6mb时(根据DDMS视图),OOM会发生,我希望它在抛出OOM之前增长到16mb。 任何建议?

通用图像加载器UIL nostra内存不足错误

我正在使用UIL加载远程图像并填充FragmentStatePagerAdapter中的Fragments。 我已阅读自述文件和常见错误,但我无法解决这个错误。 这是配置: ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext()) .threadPoolSize(1) .build(); ImageLoader.getInstance().init(config); 这是我显示我的图像的地方: public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ImageLoader imgLoader = ImageLoader.getInstance(); DisplayImageOptions options = new DisplayImageOptions.Builder() .showStubImage(R.drawable.loading) .cacheOnDisc() .resetViewBeforeLoading() .bitmapConfig(Bitmap.Config.RGB_565) .imageScaleType(ImageScaleType.IN_SAMPLE_INT) .build(); imgLoader.displayImage(this.contentImage, this.imgView, options); return layout; } 这是我在适配器中销毁我的片段的地方: public void destroyItem(ViewGroup container, int position, Object object) { if (position >= […]

onDestroy()或finish()实际上是否会杀死活动?

其实我知道我在询问Android的简单和基本概念。 但我对这些finish()和onDestroy()方法有点困惑。 这是否会破坏活动并释放与这些活动相关的资源? 我尝试了一个只包含一个活动的简单应用程序。 我认为这个概念就像应用程序运行时,活动将开始。 当我们点击后退按钮时,它将完成。 我在每个生命周期方法中给出了一些toast消息,以了解内存使用情况。 当我点击后退按钮时,它执行onPause() , onStop()和onDestroy() 。 我以为这个活动结束了。 但是当我再次重新启动应用程序时,它的内存比以前多了。 每当我从eclipse运行应用程序或从主屏幕重新启动应用程序时,都会发生这种情况。 为什么会这样? 我怎么能真正破坏应用程序/活动以释放内存? 我包括我的代码。 我只在课堂上给出一个吐司留言。 然后内存使用量也在增加。 每次运行应用程序时,分配的大小都会增加,如:3302744,3442384,3474552 public class myActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Toast.makeText(getBaseContext(),” allocated size = ” + Debug.getNativeHeapAllocatedSize(), 1).show(); } } 表现: 为什么每次都会增加内存?

无法在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将其映射到内存中。 虚拟地址空间的总大小将是相同的,但如果限制不是它的大小,而是分配了多少页面而没有文件支持 – 这可能有效。 作为最后的手段,我可​​以放弃在(虚拟)内存中存储所有数据的想法,并手动读取和锁定我当前需要的数据部分,并丢弃最近未使用的数据部分。 但是通过这种方式我实际上复制了内存管理器的工作,因为分页机制就是这样做的。 提前致谢。

Android内存管理:屏幕密度,请求的图像大小和可用堆

猜猜看,另一个Android-Bitmap-OOM问题! 背景 虽然压力测试我们的应用程序,但已经注意到,在持续的大量使用(类似于猴子跑步者)之后,可以最大限度地提高应用程序的进程内存分配,并在随后的堆栈跟踪中记录OutOfMemoryexception。 当选择ViewPager下的页面时,应用程序会下载图像(一次大约3个)。 当应用程序的长度和呼吸被执行时,可以下载280多个图像。 该应用程序使用Picasso by Square进行图像下载抽象。 值得注意的是,在我们的应用程序代码中,我们没有直接操作Bitmaps …我们相信,非常有才华的Square Inc.员工正在做得比我们更好。 这是一张照片 下图显示了dalvikvm-heap日志消息下记录的堆分配。 红点表示用户将一组新文章带入应用程序,以加强未完成的工作量并对应用程序施加压力…… DALVIKVM堆分配http://img.androidcookie.com/android/FgsiN.jpg 图1: Nexus One堆分配; OOM发生在80MB + 到目前为止的调查 针对Nexus S,Nexus 4,Wildfire,HTC Incredible以及众多其他测试设备,轶事测试表明,内存管理足以让DVM GC“跟上”应用程序完成的繁重工作。 然而,在诸如Galaxy S II,III,IV和HTC One的高端设备上,OOM是普遍的。 事实上,如果有足够的工作要做,我会想象我们所有的设备最终都会出现故障。 这个问题 屏幕密度(我们请求的图像大小基于ImageView的大小),进程内存分配和给定大小的图像数量之间显然存在关系,这将导致应用程序超出其堆限制。 我即将开始量化这种关系,但希望SO社区能够关注这个问题,并且(a)同意或不同意这种关系是值得的,以及(b)提供文献,说明如何最好地建立这种关系。 重要的是要注意,如果我们破坏图像质量,我们的OOM都会消失,但唉,UX很差,这就是为什么我们想要最有效地使用可用堆来切割。 附注:这是负责将这些图像加载到已经布局的视图中的部分代码; picassoInstance.load(entry.getKey()) .resize(imageView.getMeasuredWidth(), imageView.getMeasuredHeight()) .centerCrop() .into(imageView); 上面提到的“图像质量的潇洒”只是将imageView.getMeasured…除以“4”之类的数字。

Android OS如何计算应用程序的内存使用量?

我的意思是设置>应用程序>运行时显示的应用程序的内存使用情况 为什么这个数字与DDMS上应用程序的堆大小有很大不同? 例如,在图片OS中说我的应用程序使用151 MB(包括Google PLay服务),但DDMS表示只使用了40MB的内存。 第二个问题是:Google Analytics Service使用了27MB,这仅适用于我的应用或所有使用Google Analytics服务的应用? 如果只是我的应用程序,这是一个昂贵的成本!

如何在移动设备上获取可靠的内存信息?

我目前正在开发一款在iOS和Android上运行的应用。 应用程序的核心是用C ++编写的,并随着时间的推移分配越来越多的内存。 我想要的是同时能够尽可能多地使用内存并确保应用程序的稳定性。 当然,要做到这一点,我需要知道我仍然可以使用多少内存。 这样,如果我看到一段时间后我需要的东西比它可用的多,我可以停止分配而不是被操作系统杀死或崩溃。 问题是,在阅读并尝试不同的解决方案之后,我的感觉是你动态获得的信息不够可靠。 例如,在iOS上: [NSProcessInfo processInfo].physicalMemory 这是我读过的典型例子/答案之一似乎不可靠。 您似乎无法动态获取足够的信息以确保您仍有足够的内存,因为如果操作系统使用太多内存并且之前发送警告,操作系统将在某些时候终止您的应用程序。 但它也可以杀死其他应用程序,所以当我收到第一个时停止似乎不是一个最佳的解决方案。 看了很多post后,我对这个话题感到有点困惑。 有没有办法动态可靠地了解iOS / Android上我的应用程序剩余多少内存? 或者这些操作系统的内存管理太难以预测了? 谢谢您的帮助 !

Eclipse Memory Analyzer主饼图中的剩余是什么?

我刚开始学习Android的内存管理。 在我正在处理的应用程序上进行内存转储并使用Eclipse Memory Analyzer进行分析后,我发现37MB(在50M保留的内存中)被“剩余”占用。 这个50M的数字与我的logcat保留的内存相匹配,所以我猜这个Remainder会占用一些内存: GC_CONCURRENT freed 12839K, 21% free 50038K/62908K, paused 7ms+15ms, total 144ms 有人知道这个剩余物通常是由什么构成的吗? 这可能是我有一些内存泄漏的迹象吗?

在Android中监控我的应用程序所占用的内存

我试图优化我的应用程序消耗的内存量。 当我的应用程序加载(按住主页键然后选择任务管理器)我可以看到应用程序占用17MB但该值不刷新。 如何实时跟踪该值? DDMS可以选择吗? 具体来说,我已经搜索了很多,没有find。 提前致谢

如何使用NDK查找我的Android应用程序编写的C ++的内存使用情况

我正在使用NDK将用C ++编写的游戏移植到Android。 我需要知道它在运行时消耗了多少内存。 我正在寻找以编程方式查找用C ++编写的Android应用程序的内存使用情况。