我一直在调试我的应用程序并检查内存分配,并且遇到了,我认为,这是一个奇怪的事情。通常会问一个问题如何最好地管理内存等等,我的问题是简单应用程序中最低的默认内存边界是什么?所以我去为8级(2.2)API创建了一个简单的hello world项目,其中只写了Hello World。
然后我在Heap选项卡中查看了DDMS。分配的是2.318 MB,510 Kb Free(使用82%)。所以我想为什么在简单的Hello World测试中使用82%的允许(?)堆。深入挖掘我做了堆转储并在eclipse中通过MAT运行。作为第一个例子,我看了一下dominator_tree(按大小排序的所有对象)这里是我发现的:
TrustManagerImpl(176.616保留堆) - 9.83% - 我认为这对安全很重要
com.ibm.icu4jni.util.Resources $ DefaultTimeZones(165.432保留堆) - 9.21% - 为什么?我看了一下它的内容,它是一个单独的String数组,有561个成员,每个都是关于时区的信息?我真的不需要那个吗?它需要10%的堆。
android.text.Html $ HtmlParser(126.592保留堆) - 7.05% - 我猜这是我的TextView的HTML Parser,它有Hello World。为什么呢?我不解析HTML,为什么Parser就在那里呢?实际上,HTMLSchema占据了对象的99.9%。
我可以看到的更多,但意义不大(这可能是错误的)。有人对我上面提到的3个实例有什么想法吗?我的意思是,我想念一下这里的东西吗?我不认为内存使用量应该如此之高。这个问题表明每个应用程序是否具有此基线如何扩展?可能不太好?它是否应该修复,从而在Android中实现更好的内存管理?我在HTC Desire 2.2上运行了这个。
Alex
答案 0 :(得分:2)
分配为2.318 MB,510 Kb Free(使用82%)。所以我想为什么在简单的Hello World测试中使用82%的允许(?)堆。
请记住,可用堆的容量范围为16MB到32MB(或更高),具体取决于设备。
我真的不需要那个吗?
过去两年来,优化时区处理一直在不断发展,以换取CPU的RAM。在应用程序运行时,预加载此信息可消除不必要的暂停。此外,这最多只占堆的0.1%。
我没有解析HTML,为什么Parser就在那里呢?
据推测,由于同样的原因,现在预先加载时区 - 在执行期间交换一点RAM以节省CPU时间。这也低于你的堆的0.1%。
我认为内存使用量不应该很高。
欢迎您的意见。我认为你浪费了几个小时的生活本来可以更好地花在优化你的代码上。一个位图可能会使用比您觉得如此恶劣的任何一种构造都要多得多的RAM。