Java 获取应用程序进程的当前堆使用情况

Java 获取应用程序进程的当前堆使用情况,java,android,memory,Java,Android,Memory,我想知道我的Android应用程序目前使用了多少内存来防止OutOfMemoryExceptions。我知道,通过调用Runtime.maxMemory(),您可以找到一个应用程序可以使用的最大内存-在一些设备上这是相当低的(24MB),所以内存将是我的游戏的一个问题 当我在启动游戏引擎之前调用onCreate()方法中的Runtime.totalMemory()时,我得到了~23MB的内存,而在启动游戏引擎之后调用这个,在将一堆(小)位图加载到内存中之后,我得到了~25MB的堆使用量。有可能2

我想知道我的Android应用程序目前使用了多少内存来防止
OutOfMemoryExceptions
。我知道,通过调用
Runtime.maxMemory(),您可以找到一个应用程序可以使用的最大内存-在一些设备上这是相当低的(24MB),所以内存将是我的游戏的一个问题

当我在启动游戏引擎之前调用onCreate()方法中的
Runtime.totalMemory()
时,我得到了~23MB的内存,而在启动游戏引擎之后调用这个,在将一堆(小)位图加载到内存中之后,我得到了~25MB的堆使用量。有可能2MB的差异正是我的游戏引擎的使用情况(它仍然是早期版本),但我不是100%确定


然而,这种内存使用已经超过了一些低内存android设备的maxMemory限制。我非常确定应用程序运行时中不是由我的应用程序主动创建的部分(例如,共享库)不计入maxMemory限制;但很明显,它们确实算作总内存统计

那么,在达到maxMemory限制之前,我怎样才能确定我的应用程序使用了多少内存以及还有多少内存呢?

Runtime.freemory()
也没有帮助。

“…为了防止OutOfMemoryException”-
OutOfMemoryError
只与应用程序使用的内存量有松散的联系。更常见的问题是堆是碎片化的,虽然您可能有很多堆空间可用,但没有足够大的空间来满足特定的请求。“我知道,通过调用Runtime.maxMemory(),您可以找到一个应用程序可以使用的最大内存”——我不知道这个值与Android有任何关联。确定堆限制的官方方法是在
ActivityManager
上调用
getMemoryClass()
“然而,这种内存使用量已经超过了一些低内存android设备的maxMemory限制”——我猜这些值包括与其他android应用程序进程共享的内存,如Dalvik运行时引擎、Android框架类库等。同样,我不知道任何
运行时
值对于Android应用程序开发人员都一定有用。@commonware:
maxMemory()
几乎总是与
getMemoryClass()
相同。在讨论每个应用程序的最大内存时,我已经在几个Stackoverflow线程上看到了这一点。我在一些示例中看到了Google在哪里使用它,这也很有帮助。话虽如此,我不知道有什么好方法可以找到剩余的堆空间,而且由于内存分配可能会因为碎片而失败,我怀疑这是否会有多大帮助。我们使用
getMemoryClass()
/
maxMemory()
来帮助调整缓存大小,然后依靠弱引用和软引用来确保缓存可以在需要时被刷新,以帮助尝试完成分配请求。“当内存出现问题时,堆不是自动整理碎片吗?”--不。在Android 5.0+设备上,ART有一个移动垃圾收集器,但它只在应用程序处于后台时运行。在此之前,Dalvik没有移动收集器,因此堆总是碎片化的。“否则,要构建一个具有高质量位图和低磁盘使用率的良好性能的应用程序将非常困难”——正确。然而,有无数具有集成缩放和缓存功能的图像加载库可以提供帮助(毕加索、通用图像加载器等)。“…为了防止OutOfMemoryException”-
OutOfMemoryError
仅与应用程序使用的内存量有松散的联系。更常见的问题是堆是碎片化的,虽然您可能有很多堆空间可用,但没有足够大的空间来满足特定的请求。“我知道,通过调用Runtime.maxMemory(),您可以找到一个应用程序可以使用的最大内存”——我不知道这个值与Android有任何关联。确定堆限制的官方方法是在
ActivityManager
上调用
getMemoryClass()
“然而,这种内存使用量已经超过了一些低内存android设备的maxMemory限制”——我猜这些值包括与其他android应用程序进程共享的内存,如Dalvik运行时引擎、Android框架类库等。同样,我不知道任何
运行时
值对于Android应用程序开发人员都一定有用。@commonware:
maxMemory()
几乎总是与
getMemoryClass()
相同。在讨论每个应用程序的最大内存时,我已经在几个Stackoverflow线程上看到了这一点。我在一些示例中看到了Google在哪里使用它,这也很有帮助。话虽如此,我不知道有什么好方法可以找到剩余的堆空间,而且由于内存分配可能会因为碎片而失败,我怀疑这是否会有多大帮助。我们使用
getMemoryClass()
/
maxMemory()
来帮助调整缓存大小,然后依靠弱引用和软引用来确保缓存可以在需要时被刷新,以帮助尝试完成分配请求。“当内存出现问题时,堆不是自动整理碎片吗?”--不。在Android 5.0+设备上,ART有一个移动垃圾收集器,但它只在应用程序处于后台时运行。在此之前,Dalvik没有移动收集器,因此堆总是碎片化的。“否则,要构建一个具有高质量位图和低磁盘使用率的良好性能的应用程序将非常困难”——正确。然而,有无数具有集成缩放和缓存功能的图像加载库可以提供帮助(毕加索、通用图像加载器等)。“…为了防止OutOfMemoryException”-
OutOfMemoryError
仅与应用程序使用的内存量有松散的联系。更常见的问题是堆是碎片化的,虽然您可能有很多堆sp