我正在开发一个使用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内存的使用。