1

我正在开发一个使用 Android Media Projection 的项目。我在本机代码中看到相当大的内存泄漏(应用程序 jvm 内存使用率相当低且稳定)。我已经能够获得本机内存转储,并且我看到一堆似乎是从 opengl 分配的 4Mb 缓冲区。该应用程序不直接与 opengl 交互(但我相当确定媒体投影是)。如果我们关闭媒体投影并重新启动它(当我们停止时我们确实释放了虚拟显示器),我们会获得更多的这些 4Mb 缓冲区,并很快崩溃。

堆转储有一堆这些:

z 1  sz  4194304  num   16  bt abab7645 9f562deb 9f5616ec 9f561614 91c8caab ae451985 ae450907 ae44ee05 ae4561c1 ae4548a0 aea5191f abdc3041 ac7bc189 ac7aba69 ac7bce52 ac7bdc51

这些地址映射以下库的位置(但我没有这些库的符号 AFAIK)。

/system/lib/libc.so
/system/lib/libOpenglSystemCommon.so
/system/lib/libOpenglSystemCommon.so
/system/lib/libOpenglSystemCommon.so
/system/lib/hw/gralloc.ranchu.so
/system/lib/libui.so
/system/lib/libui.so
/system/lib/libui.so
/system/lib/libui.so
/system/lib/libui.so
/system/lib/libandroid_runtime.so
/system/lib/libbinder.so
/system/lib/libgui.so
/system/lib/libgui.so
/system/lib/libgui.so
/system/lib/libgui.so

编辑:我制作了一个演示问题的示例项目:

https://github.com/johngray1965/MediaProjectorSample

按照自述文件中的说明进行操作。经过几次迭代后,我结束了使用 42Mb(其中大部分是 9 个 4Mb 缓冲区)。那是媒体投影仪停止了。这适用于功能很少的应用程序。在现实世界中,除此之外还有额外的内存需求。这只是针对本机使用,没有考虑到 JVM 内存使用情况。

4

0 回答 0