Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Dalvik VM Logcat_Android_Dalvik - Fatal编程技术网

Android Dalvik VM Logcat

Android Dalvik VM Logcat,android,dalvik,Android,Dalvik,任何人都可以解释以下Logcat消息: D/dalvikvm(4440): GC_EXTERNAL_ALLOC freed 338K, 47% free 6427K/11911K, external 20418K/22446K, paused 53ms E/dalvikvm-heap(4440): 2519424-byte external allocation too large for this process. D/dalvikvm(4440): GC_FOR_MALLOC freed &

任何人都可以解释以下Logcat消息:

D/dalvikvm(4440): GC_EXTERNAL_ALLOC freed 338K, 47% free 6427K/11911K, external 20418K/22446K, paused 53ms
E/dalvikvm-heap(4440): 2519424-byte external allocation too large for this process.
D/dalvikvm(4440): GC_FOR_MALLOC freed <1K, 47% free 6427K/11911K, external 20398K/22446K, paused 40ms
E/GraphicsJNI(4440): VM won't let us allocate 2519424 bytes
D/dalvikvm(4440):GC_外部_ALLOC释放338K,47%释放6427K/11911K,外部20418K/22446K,暂停53ms
E/dalvikvm堆(4440):2519424字节的外部分配对此进程太大。

D/dalvikvm(4440):GC_FOR_MALLOC freed在旧版本的Android中,某些本机框架代码会告诉VM有关本机分配的信息。这种“外部分配”机制是一种引入的丑陋的黑客行为,因此本机分配将导致Dalvik VM执行垃圾收集过程

基本问题是Java语言位图对象使用本机内存进行像素存储。由于托管堆对象很小,而本机堆对象很大,因此可以分配大量位图而不会导致GC。这导致应用程序膨胀,系统速度减慢

因此,引入了“外部分配”。每当在本机堆上分配位图的像素存储时,都会从托管堆中扣除等量的内存。其思想是,如果堆中不再有引用位图,那么托管堆空间将耗尽,GC将启动

(不幸的是,GC实际上无法释放本机存储—您需要运行终结器来完成此操作,并且终结器在GC完成后在单独的过程中运行。有一段时间,本机对象还保留一些其他托管堆对象,因此您必须使用GC+finalize+GC来实际清理所有内容。)

关于外部分配,我最喜欢的部分是API是简单的“增加N”/“减少N”,这意味着无法将本机堆与托管堆对象关联,也无法检查泄漏。由于位图的所有信息都保存在本机对象中,因此您甚至无法猜测需要多少本机存储,因此无法查看hprof转储并计算位图实际使用的内存量

在Android 3.0(“蜂巢”)中,像素存储被移动到托管堆上,外部分配机制被移除

因此,您问题中的日志消息的意思是:一些代码(可能是位图)想要分配2.5MB的本机堆,但这将超过VM的外部分配堆限制。您需要找出是什么消耗了20MB的外部分配存储空间,并释放其中的一部分


获取外部分配信息的唯一方法是查看事件日志。几年前,我编写了一个脚本(--在AOSP dalvik/tools中使用了一段时间)。我不知道它是否仍然有用。我谈论如何在中使用它。

写了一篇很好的博客。您可以参考:这是什么版本的Android?谢谢您的回复。你的帖子真的很有帮助。现在我对托管堆和本机堆有了更好的理解。当位图不再被使用(或不再被引用)时,我通过调用bitmap.recycle()简单地解决了这个问题。