首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >一个应用程序可以使用的最大RAM是多少?

一个应用程序可以使用的最大RAM是多少?
EN

Stack Overflow用户
提问于 2013-09-08 00:40:08
回答 5查看 85.3K关注 0票数 155

我对这个关于安卓操作系统的内存管理的问题很好奇,所以我希望在这个问题上有一个相当详细的答案。

我想知道的是:

  • 安卓应用程序(即非系统应用程序)可以使用的最大内存量(以 an为单位)是多少?
  • 安卓versions
  • Are设备的manufacturer有什么不同?

最重要的是:

考虑

  • What /当涉及到系统确定应用程序在运行时可以使用多少内存时,它取决于(假设每个应用程序的最大内存不是一个静态数字)?

到目前为止(到2013年为止)我听到的是:

  • 早期的安卓设备每个应用的上限是16MB
  • 后来这个上限增加到了24MB或32MB

让我非常好奇的是:

这两个限制都非常低。

我最近刚刚下载了Android Task Manager来检查我的设备内存。我所注意到的是,有一些应用程序使用了大约40-50兆字节的RAM,这显然超过了前面提到的最大RAM使用量,比如说32MB。那么Android如何确定一个应用程序可以使用多少RAM呢?应用程序怎么可能超过这个限制呢?

此外,我注意到我的一些应用程序崩溃了(被系统杀死了?)当使用大约30-40兆字节时,使用OutOfMemoryException。另一方面,我的手机上运行的应用程序使用100MB的和更多的,一段时间后(可能是由于内存泄漏),这些应用程序不会崩溃或被杀死。因此,当涉及到确定可以节省多少内存时,它显然还取决于应用程序本身的。这怎麽可能?(我使用内存为768MB的HTC One S进行测试)

免责声明:我与Android任务管理器应用程序没有任何关联。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-09-08 00:55:48

安卓应用程序(不是系统应用程序)可以使用的最大内存量(以is为单位/占内存总量的百分比)是多少?

这一点因设备而异。getMemoryClass() on ActivityManager将为您提供运行代码的设备的值。

安卓版本之间有什么不同吗?

是的,多年来操作系统需求不断增加,设备必须进行调整以与之匹配。

设备的制造商有什么不同?

是的,就制造商制造设备而言,其大小因设备而异。

在确定应用程序可以使用多少内存时,需要考虑哪些“辅助因素”?

我不知道“副作用”是什么意思。

早期的设备每个应用程序的上限为16MB;后来的设备将其提高到24MB或32MB

这就对了。屏幕分辨率是一个重要的决定因素,因为更大的分辨率意味着更大的位图,因此平板电脑和高分辨率手机往往会有更高的值。例如,您将看到具有48MB堆的设备,如果有更高的值,我不会感到惊讶。

应用程序怎么可能超过这个限制呢?

你假设应用程序的作者知道他在做什么。考虑到memory usage of an app is difficult for a core Android engineer to determine,我不会假设有问题的应用程序一定会提供特别准确的结果。

也就是说,本机代码(NDK)不受堆限制。而且,从Android3.0开始,应用程序可以请求“大堆”,通常在数百MB的范围内,但对于大多数应用程序来说,这被认为是糟糕的形式。

此外,我注意到我的一些应用程序在使用大约30-40兆字节的OutOfMemoryException时崩溃。

请记住,Android垃圾收集器不是紧凑型垃圾收集器。真正的例外应该是CouldNotFindSufficientlyLargeBlockOfMemoryException,但这可能被认为太冗长了。OutOfMemoryException意味着你的不能分配你请求的块,而不是你已经完全耗尽了你的堆。

票数 119
EN

Stack Overflow用户

发布于 2018-11-20 22:39:43

现在是2018年年底,所以情况发生了变化。

首先:运行你的应用程序并在Android Studio中打开Android Profiler选项卡。你会看到它消耗了多少内存,你会感到惊讶,但它可以分配大量的RAM。

此外,官方文档中的here is a great article提供了有关如何使用内存分析器的详细说明,这可以让您深入了解内存管理。

但在大多数情况下,你常规的Android Profiler就足够了。

通常,一个应用程序一开始会分配50Mb的内存,但当你开始在内存中加载一些照片时,它会立即跳到90Mb。当你用预加载照片(每张3.5Mb)的ViewPager打开Activity时,你可以在几秒钟内轻松获得190Mb。

但这并不意味着你在内存管理方面有问题。

我能给出的最好的建议是遵循指南和最佳实践,使用顶尖的库来加载图像(Glide,Picasso),你就可以了。

但是,如果你需要定制一些东西,并且你真的需要知道你可以手动分配多少内存,你可以获得总的空闲内存,并从中计算出预定的部分(以%为单位)。在我的例子中,我需要在内存中缓存解密的照片,这样我就不需要每次用户在列表中滑动时都解密它们。

为此,您可以使用ready to use LruCache class。它是一个缓存类,可以自动跟踪你的对象分配了多少内存(或实例的数量),并根据它们的使用历史删除最旧的内存以保存最近的内存。Here is是一个关于如何使用它的很好的教程。

在我的例子中,我创建了两个缓存实例:用于拇指和附件。通过单例访问使它们成为静态的,因此它们在整个应用程序中都是可用的。

缓存类:

public class BitmapLruCache extends LruCache<Uri, byte[]> {

    private static final float CACHE_PART_FOR_THUMBS_PRC = 0.01f; // 1% (Nexus 5X - 5Mb)
    private static final float CACHE_PART_FOR_ATTACHMENTS_PRC = 0.03f;// 3% (Nexus 5X - 16Mb)
    private static BitmapLruCache thumbCacheInstance;
    private static BitmapLruCache attachmentCacheInstance;

public static synchronized BitmapLruCache getDecryptedThumbCacheInstance() {
    if (thumbCacheInstance == null) {

        int cacheSize = getCacheSize(CACHE_PART_FOR_THUMBS_PRC);
    //L.log("creating BitmapLruCache for Thumb with size: " + cacheSize + " bytes");
        thumbCacheInstance = new BitmapLruCache(cacheSize);
        return thumbCacheInstance;
    } else {
        return thumbCacheInstance;
    }
}

public static synchronized BitmapLruCache getDecryptedAttachmentCacheInstance() {
    if (attachmentCacheInstance == null) {

        int cacheSize = getCacheSize(CACHE_PART_FOR_ATTACHMENTS_PRC);
    //            L.log("creating BitmapLruCache for Attachment with size: " + cacheSize + " bytes");
        attachmentCacheInstance = new BitmapLruCache(cacheSize);
        return attachmentCacheInstance;
    } else {
        return attachmentCacheInstance;
    }
}

private BitmapLruCache(int maxSize) {
    super(maxSize);
}

public void addBitmap(Uri uri, byte[] bitmapBytes) {
    if (get(uri) == null && bitmapBytes != null)
        put(uri, bitmapBytes);
}

public byte[] getBitmap(Uri uri) {
    return get(uri);
}


@Override
protected int sizeOf(Uri uri, byte[] bitmapBytes) {
    // The cache size will be measured in bytes rather than number of items.
    return bitmapBytes.length;
}
}

这是我计算可用空闲RAM的方法,以及我可以从中获得多少内存:

private static int getCacheSize(float partOfTotalFreeMemoryToUseAsCache){
    final long maxMemory = Runtime.getRuntime().maxMemory();
    //Use ... of available memory for List Notes thumb cache
    return (int) (maxMemory * partOfTotalFreeMemoryToUseAsCache);
}

下面是我在Adapters中使用它来获取缓存图像的方法:

byte[] decryptedThumbnail = BitmapLruCache.getDecryptedThumbCacheInstance().getBitmap(thumbUri);

以及如何将其设置到后台线程的缓存中(常规AsyncTask):

BitmapLruCache.getDecryptedThumbCacheInstance().addBitmap(thumbUri, thumbBytes); 

我的应用程序以API 19+为目标,所以设备并不旧,在我的例子中,这些可用内存的部分足够缓存(1%和3%)。

有趣的事实:安卓没有任何API或其他黑客来获取分配给你的应用程序的内存量,它是根据各种因素动态计算的。

附注:我使用静态类字段来保存缓存,但根据最新的安卓指南,建议使用ViewModel architecture component

票数 18
EN

Stack Overflow用户

发布于 2015-12-29 16:10:10

根据屏幕大小和安卓版本,每个应用程序的内存限制如下:https://drive.google.com/file/d/0B7Vx1OvzrLa3Y0R0X1BZbUpicGc/view?usp=sharing

来源:安卓兼容性下载http://source.android.com/compatibility/downloads.html;兼容性定义文档(CDD),部分虚拟机兼容性或运行时兼容性

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18675557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档