android - Android上 native 堆的最大大小?

标签 android memory memory-management android-ndk

如果我理解正确的话,一个 android 进程有两个堆 - 一个由 VM 管理,一个由 native 管理。

VM 堆的大小不能超过 16mb(至少,这个值在某些手机上可以更高)。

但是 native 堆的最大大小呢?

16 mb 的限制似乎不是硬性限制,因为应用程序可以通过 NDK 分配超过 16 mb 的空间,但是当内存量很大时,操作系统会开始杀死其他进程,可能还会杀死前台进程用来。

操作系统何时开始以这种方式运行?当原生堆 + VM 堆大小超过 16mb 时?

Debug.getNativeHeapSize() 给出了原生堆的大小,但是有没有一个函数可以检查组合的原生 + VM 堆大小?

很想听听知道这是如何工作的人的消息!

最佳答案

Android 内存管理中没有“死亡线”。当系统需要杀死进程来回收内存时,它会考虑许多不同的因素,包括进程的重要性(取决于它是否在前台,或为前台应用程序提供服务等因素)以及它有多少内存使用。

如果您的进程处于空闲状态,并且占用的内存比其他任何东西都多,那么它很可能首先被杀死。

确切的算法随着时间的推移发生了一些变化,系统不对特定行为做出任何保证。

关于android - Android上 native 堆的最大大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5880870/

相关文章:

java - kotlin 中的数据绑定(bind) TypeConverter 错误

linux - 在 Linux 内核中的指定地址分配内存块

ruby - 常量与按需实例化的对象——哪个最优?

c - malloc(及其同类)返回的内存块是否初始化为零?

swift - 在 Swift 中,声明变量并赋值是一种好习惯吗?

java - 重用单个对象而不是创建新对象

java - 带有机器名称的特殊 UnknownHostException

添加 mopub sdk 时出现 Android Studio 错误

android - 有没有一些简单的方法可以在 xml 字段声明中包含自定义字体?

c - 为什么 -fno-stack-protector 会颠倒这些字符串的存储顺序?