【发布时间】:2012-09-04 18:17:47
【问题描述】:
有时,需要绕过应用程序的堆内存限制并使用超出允许范围的内存。
我想到了一个解决方案,其中包括一种缓存机制,它将字节存储在本机内存中(不是在堆内存中,而是在非托管内存中)。
当然,我会考虑系统的最大可用大小。
所以,对direct buffers有所了解,我用它在本机内存中存储了一个字节数组:
final ByteBuffer nativeBytes=ByteBuffer.allocateDirect(bytes.length);
nativeBytes.put(bytes);
但是,在 Android 上,用于此的内存似乎是在堆中使用的,而不是在本机内存中。
发生了什么事?从本机内存存储和加载数据是否有简单的替代方法?
【问题讨论】:
-
没有“原生内存”这样的东西;内存不了解本机与字节码。这让你的问题很不清楚。
-
有托管内存和非托管内存。托管内存的限制约为 48MB,当你通过它时,你会得到 OOM 异常。非托管内存大约是设备 RAM 的大小,但您必须注意释放它。使用 NDK 或 OpenGL 时可以使用这样的东西。
-
我不会说这很容易(因此可能值得作为评论但不是答案),但从你的描述听起来你可以创建一个带有本地方法的类,这些本地方法执行 malloc ()和免费()。如果你对 DalvikVM 如何管理内存的描述是正确的,这应该允许你绕过 DVM 检查(假设 Android 没有采取积极的措施来禁止它)。那么要解决的问题就是如何从 Java 访问该内存。
-
我假设 java 必须提供一个 inputStream 或一个新的字节数组,其中包含存储在本机内存中的数据。无论如何,我该如何实施这样的事情?是否已经有第三方库可以做到这一点?
-
“但是,似乎在 Android 上,用于此的内存是在堆中使用的,而不是在本机内存中”——你是如何确定的?
标签: android heap-memory bytebuffer unmanaged-memory