堆分配表现得很奇怪 - Android

时间:2016-02-17 08:09:19

标签: android eclipse memory-management heap-memory

我无法理解这里发生了什么 - 我一直在创建一个小项目,只是为了了解图像的旋转。但这与此无关。

所以 - 我以前一直这样做,知道堆是如何工作的,但是知道我无法得到它。

在这个小型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"
    />

更多信息:设备已植根

0 个答案:

没有答案