事情是这样的,我的同事让我帮他看这个代码为什么不分配内存,我看了两天没啥结果,水平不够就来问了

binding.button.setOnClickListener {
    repeat(1000) {
        list.add(Bitmap.createBitmap(10240, 1024 / 4, Bitmap.Config.ARGB_8888))
    }
}

通过 Android studio 的 profiler 查看内存根本没动静,dump 出来看到都 bitmap 的 Native size 都已经 9 个 G 了(亲测),每个 java bitmao 也都有 NativePtr,还不是相同的,但是这应该是 bug 或者是虚拟内存空间的?搞不懂,然后看了两天代码,基础有点差,*后只看到确实分配了内存

sk_sp<Bitmap> Bitmap::allocateHeapBitmap(size_t size, const SkImageInfo& info, size_t rowBytes) {
    // 应该是这里吧??
    void* addr = calloc(size, 1);
    if (!addr) {
        return nullptr;
    }
    return sk_sp<Bitmap>(new Bitmap(addr, size, info, rowBytes));
}

昨天也是搞到几点才睡觉,救?

8 条回复    2021-08-04 15:50:15 +08:00
Cabana
    1

Cabana   6 小时 51 分钟前 via iPhone

你看的是不是 java 内存占用呀?
maokabc
    3

maokabc   6 小时 29 分钟前 via Android

java 层 bitmap 就是个壳,实际是那个 nativePtr 对应的 native 对象,java 对象没被回收 native 层对应的内存也不会被释放。jni 常见的方式,用 long 存储 native 指针。
limerence12138
    4

limerence12138   5 小时 55 分钟前

@maokabc 看的 profiler 显示的内存,就是那个 memory 里显示的总的,包括 native,java 堆,stack 啥的
@Cabana 这我知道,现在问题是没被回收,分配的内存去哪儿了,分配了 1000 次这么大的都没问题?
janus77
    5

janus77   1 小时 58 分钟前 via iPhone

新版本特意改成这样的,为了防止 oom,现在手机内存可大了,用这么多正常
r00tt
    6

r00tt   1 小时 57 分钟前

因为你把 bitmap 加入到 list 里面去了,自然不会回收
limerence12138
    7

limerence12138   27 分钟前

@janus77 能到 10 几个 G,你觉得可能吗,超过物理限制了都。。
@r00tt 我无语了,你看清楚啊,我故意不让它回收,现在是在问内存分配的问题
janus77
    8

janus77   几秒前

@limerence12138 #7 当然可以,native 内存理论上可以达到你手机的物理上限,现在主流手机都是 8G 了 旗舰 12G 9G 很正常啊