- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
此问题可能与Android或Linux有关。如果你不熟悉Android,我先简单介绍一下init和bootanimation。 Android init 与 Linux init 相同。它是用户空间中的第一个进程。 pid 为 1。init 进程将执行一些在 init.rc 中定义的系统初始化。初始化之一是开机动画。它由名为 bootanimation 的进程播放。 Bootanimation 是一个 native 进程。它使用 OpenGL ES 播放动画。开机动画通常由一个包含数十或数百个静态图像的 zip 文件来描述。以一定的速度播放它们成为动画。
现在奇怪的问题来了。是关于init进程的内存占用。在干净的android 8.1.0系统中,init占用内存超过40M+。我们可以通过 adb shell 命令 'dumpsys meminfo init' 找到分配细节。
Pss
Total
------
Native Heap 1076
Dalvik Heap 0
Stack 16
Other dev 363
Other mmap 333
EGL mtrack 10040
GL mtrack 29170
Unknown 32
TOTAL 41030
我们可以看到与图形相关的 EGL/GL 占用了大部分内存。通常,init 是一个后端进程。它与图形无关。那为什么图形相关的内存占用最多。我唯一能弄清楚的与图形相关的是启动动画。如上所述,它由 init 进程启动/派生。所以我做了一些测试。如果我禁用开机动画,init的内存占用确实减少了很多,大约20M。我还做了其他测试。我试图修改 bootanimation 的源代码以加载和渲染单个图像而不是数百个图像。 init的内存占用也减少了很多。也就是说init的内存占用与bootanimation加载的图片数量有关。进一步测试发现,通过init fork bootanimation进程后,init的内存占用会减少很多。似乎内存从init转移到了它的子进程bootanimation。
那么我的最后一个问题是:作为子进程,为什么bootanimation会影响其父进程的内存占用?当bootanimation进程退出时,占用的资源不应该全部释放吗?
补充说明:虽然在我看来,当一个进程退出时,应该释放所有资源。而且谷歌写的android源码应该是老练的,没有bug。我仍然怀疑bootanimation中的资源泄漏。 Bootanimation 使用 skia 库中的 SkBitmap 来加载图像并使用 OpenGL ES 1.0 纹理来渲染它们。我确认如果我没有确认错误,SkBitmap 和 OpenGL 纹理将被正确销毁。大家可能对相关的android源码感兴趣。
bootanimation中播放动画的核心代码: http://androidxref.com/8.1.0_r33/xref/frameworks/base/cmds/bootanimation/BootAnimation.cpp#862图片加载代码: http://androidxref.com/8.1.0_r33/xref/frameworks/base/cmds/bootanimation/BootAnimation.cpp#190init中启动bootanimation的代码: http://androidxref.com/8.1.0_r33/xref/system/core/init/service.cpp#688
感谢您的所有回答、建议和评论。
最佳答案
经过一系列新的测试和代码阅读,我发现了一些新东西。我将添加一些新评论。这个问题与init无关。该问题与 dumpsys meminfo 的实现有关。 dumpsys meminfo 显示的进程内存由两部分组成。一部分由该过程直接分配。比如 Dalvik Heap 和 Native Heap。而另一部分不是由该进程直接分配的,而是由系统分配的,只是由该进程引起的。上面显示的EGL/GL mtrack部分属于这个部分。跟踪这部分内存是由不同的硬件平台实现的。 Is 由显示驱动程序计数。我用的是MTK平台。它将跟踪那些执行实际 GL 操作的进程的 GL 内存。我相信这些统计数据是准确的。但是有系统消耗的总GL内存,也就是我们在不带额外参数的情况下执行dumpsys meminfo时可以看到的总GL mtrack值。它可能不等于所有已核算流程的已统计 GL 值的总和。然后它计算总 GL 内存和 GL 内存总和的差异到 init 进程。因为 init 是所有其他进程的祖先进程。所以init的GL mtrack的值看起来很大,它不是init分配的,实际上也不是init造成的。
现在我们可以解释上面那个很奇怪的问题了,知道它和process init没有关系。但是我的问题仍然没有解决。也就是说,为什么事件bootanimation被终止,它分配的GL内存没有被释放?这是否意味着资源泄漏?或者我可以将其视为 mtk 显示驱动程序的错误吗?
关于android - android bootanimation子进程影响其父进程init内存占用的怪问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52814874/
我是 Linux 的新手,并且继承了保持我们的单一 Linux 服务器运行的职责。这是我们的SVN服务器,所以比较重要。 原来在我之前维护它的人有一个 cron 任务,当有太多 svnserve 进程
Node 虽然自身存在多个线程,但是运行在 v8 上的 JavaScript 是单线程的。Node 的 child_process 模块用于创建子进程,我们可以通过子进程充分利用 CPU。范例:
Jenkins 有这么多进程处于事件状态是否正常? 我检查了我的设置,我只配置了 2 个“执行者”... htop http://d.pr/i/RZzG+ 最佳答案 您不仅要限制 Master 中的执
我正在尝试在 scala 中运行这样的 bash 命令: cat "example file.txt" | grep abc Scala 有一个特殊的流程管道语法,所以这是我的第一个方法: val f
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我需要一些帮助来理解并发编程的基础知识。事实上,我读得越多,就越感到困惑。因此,我理解进程是顺序执行的程序的一个实例,并且它可以由一个或多个线程组成。在单核CPU中,一次只能执行一个线程,而在多核CP
我的问题是在上一次集成测试后服务器进程没有关闭。 在integration.rs中,我有: lazy_static! { static ref SERVER: Arc> = {
我正在使用 Scala scala.sys.process图书馆。 我知道我可以用 ! 捕获退出代码和输出 !!但是如果我想同时捕获两者呢? 我看过这个答案 https://stackoverflow
我正在开发一个C++类(MyClass.cpp),将其编译为动态共享库(MyClass.so)。 同一台Linux计算机上运行的两个不同应用程序将使用此共享库。 它们是两个不同的应用程序。它不是多线程
我在我的 C 程序中使用 recvfrom() 从多个客户端接收 UDP 数据包,这些客户端可以使用自定义用户名登录。一旦他们登录,我希望他们的用户名与唯一的客户端进程配对,这样服务器就可以通过数据包
如何更改程序,以便函数 function_delayed_1 和 function_delayed_2 仅同时执行一次: int main(int argc, char *argv[]) {
考虑这两个程序: //in #define MAX 50 int main(int argc, char* argv[]) { int *count; int fd=shm
请告诉我如何一次打开三个终端,这样我的项目就可以轻松执行,而不必打开三个终端三次然后运行三个exe文件。请问我们如何通过脚本来做到这一点,即打开三个终端并执行三个 exe 文件。 最佳答案 在后台运行
我编写了一个监控服务来跟踪一组进程,并在服务行为异常、内存使用率高、超出 CPU 运行时间等时发出通知。 这在我的本地计算机上运行良好,但我需要它指向远程机器并获取这些机器上的进程信息。 我的方法,在
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 8年前关闭。 Improve this qu
我有一个允许用户上传文件的应用程序。上传完成后,必须在服务器上完成许多处理步骤(解压、存储、验证等...),因此稍后会在一切完成后通过电子邮件通知用户。 我见过很多示例,其中 System.Compo
这个问题对很多人来说可能听起来很愚蠢,但我想对这个话题有一个清晰的理解。例如:当我们在 linux(ubuntu, x86) 上构建一个 C 程序时,它会在成功编译和链接过程后生成 a.out。 a.
ps -eaf | grep java 命令在这里不是识别进程是否是 java 进程的解决方案,因为执行此命令后我的许多 java 进程未在输出中列出。 最佳答案 简答(希望有人写一个更全面的): 获
我有几个与内核态和用户态的 Windows 进程相关的问题。 如果我有一个 hello world 应用程序和一个暴露新系统调用 foo() 的 hello world 驱动程序,我很好奇在内核模式下
我找不到很多关于 Windows 中不受信任的完整性级别的信息,对此有一些疑问: 是否有不受信任的完整性级别进程可以创建命名对象的地方? (互斥锁、事件等) 不受信任的完整性级别进程是否应该能够打开一
我是一名优秀的程序员,十分优秀!