我无法理解这里发生了什么 - 我一直在创建一个小项目,只是为了了解图像的旋转。但这与此无关。
所以 - 我以前一直这样做,知道堆是如何工作的,但是知道我无法得到它。
在这个小型Eclipse项目中,我将一个图像放在drawable-mdpi文件夹中。图像是
1300 * 1950
如此简单 - 此图像将占用大约以下数量的ram(堆)
10 MB (1300 * 1950 * 4)
红色,格力,蓝色和Alpha。多数民众赞成!
但是发生了什么。好吧看下面的logcat!三星Galaxy S3的63 MB堆几乎耗尽了。
02-17 08:50:05.144: I/dalvikvm-heap(21097): Grow heap (frag case) to 22.494MB for 10140016-byte allocation
02-17 08:50:05.164: D/dalvikvm(21097): GC_CONCURRENT freed 1K, 5% free 22152K/23175K, paused 12ms+2ms, total 22ms
02-17 08:50:05.329: D/dalvikvm(21097): GC_FOR_ALLOC freed 0K, 5% free 22152K/23175K, paused 11ms, total 11ms
02-17 08:50:05.429: I/dalvikvm-heap(21097): Grow heap (frag case) to 61.174MB for 40560016-byte allocation
02-17 08:50:05.449: D/dalvikvm(21097): GC_CONCURRENT freed 0K, 2% free 61761K/62791K, paused 11ms+3ms, total 22ms
02-17 08:50:06.109: D/libEGL(21097): loaded /system/lib/egl/libEGL_mali.so
02-17 08:50:06.119: D/libEGL(21097): loaded /system/lib/egl/libGLESv1_CM_mali.so
02-17 08:50:06.124: D/libEGL(21097): loaded /system/lib/egl/libGLESv2_mali.so
02-17 08:50:06.179: D/(21097): Device driver API match
02-17 08:50:06.179: D/(21097): Device driver API version: 10
02-17 08:50:06.179: D/(21097): User space API version: 10
02-17 08:50:06.179: D/(21097): mali: REVISION=Linux-r2p4-02rel0 BUILD_DATE=Fri Sep 28 10:42:56 KST 2012
02-17 08:50:06.254: D/OpenGLRenderer(21097): Enabling debug mode 0
首先它正确分配 - 你可以看到10 MB(根据我的计算)和远远超过它的堆 - 即20 MB。到现在为止还挺好。然后继续分配内存远远超过这个级别。就像有另一个40 MB的图像(之前的4倍)所以分配的堆最终以61 MB为单位,几乎与内存相切。
我在这里想念的是什么,还是一个错误?我检查了所有可绘制的文件夹,我知道我运行这个应用程序,而不是另一个。我重新创建了项目以确定,甚至更改了图像名称。重新启动计算机和设备
这是源代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView imgview = (ImageView) findViewById(R.id.image);
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.image1);
}
xml-file
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
更多信息:设备已植根