草庐IT

Android LowMemoryKiller 未能杀死 Webviews

coder 2023-12-22 原文

很长一段时间以来,我一直在尝试在玩重型游戏时调试设备上的主要延迟/卡顿爆发。在对我的 logcat 进行了大量分析后,我觉得我已经确定了导致无法忍受的延迟峰值的原因。每当发生滞后峰值时,logcat 中始终显示以下错误:

E/lowmemorykiller: 
Error opening /dev/memcg/apps/uid_99032/pid_5430/memory.soft_limit_in_bytes; errno=2

它反复显示,好像它一直在一遍又一遍地试图杀死它。 UID 和 PID 有时会有所不同。据推测,主线程每次试图杀死它但没有这样做时都会挂起很短的时间。为什么会这样?

以下错误也反复显示,混合出现在上述错误中。它可能与问题有关:
E/ANDR-PERF-RESOURCEQS: Failed to apply optimization [4,0]

有时它会是 [2,0] 而不是 [4,0] 。这些消息在我的 logcat 中确实过度显示。

检查我的 Activity 进程后,提到的 UID 和 PID 总是匹配 Android System Webview 的一个实例。我通过转到“设置”中的“开发人员选项”中的“运行进程”找到了这些进程的源应用程序。在那里,正在运行的进程被列为 com.google.android.webview:sandboxed_process0 ,并且对于每个可能具有正在运行的 webview 的应用程序,它都有多个实例。通过检查该进程的信息,会提到启动它的包。因此,它们源自我手机上的各种应用程序,有时甚至是我自己玩的游戏。因此,这似乎是内核的 lowmemorykiller (LMK) 模块的问题,比我安装的任何特定应用程序更有可能。

任何人都知道导致这种情况的原因,错误的真正含义,如何修复或解决它,为什么 LMK 无法杀死 webview,或者实际发生了什么?我至少正在寻找一种方法来控制 LMK 要么忽略试图杀死 webviews,以防止它在失败时挂起主线程,要么强制它成功杀死它们。

出于某种原因,我没有在 Kernel Adiutor 中修改 LMK 参数的部分。我的手机试图(大概)杀死这些 webviews,即使仍有大量可用 RAM 可用,但 Kernel Adiutor 中的 min_free 参数远不及我当时剩余的可用 RAM 量,所以有些事情是继续。

我曾一度怀疑这可能是由于我的手机上安装的应用程序数量过多(800-900)造成的。从那以后,我将其降低到约 600 个应用程序,但问题仍然存在。我不认为有太多的应用程序是问题了,尽管它绝对有可能。

我在我的 OnePlus 3T 上运行 official ResurrectionRemix 8.1 ROM,使用 ROM 的默认内核和固件。这个问题出现在非官方的 RR LuisROM 上,即使在我完全擦除/清理闪存到我目前使用的官方 RR 版本之后,这个问题仍然存在。我在 XDA 上向他们和其他人寻求帮助,但没有人愿意提供帮助。如果您认为有必要,我可以提供我的完整 logcat,但是这里直接提到了唯一相关的消息。

编辑:这是一个 latest logcat ,错误及以上。我不认为可以从它们中推断出任何有用/新的东西,但请随意看一看。

编辑 2:感谢 this answer ,它提供了一个临时解决方法,我一直在试验并试图找到问题的根源。看起来由于某种原因,没有在 dev/memcg/apps 文件夹中为 Webview 进程创建 UID 和 PID 文件夹。这真的很奇怪。它们可以在 su 终端中手动创建(和删除)(虽然只在像 ES File Explorer Pro 这样的 root 特权文件管理器中创建,而不是删除(它给出了相同的“权限被拒绝”错误),但我注意到logcat 中的以下错误在上述其他错误之前:
Failed to make and chown /acct/uid_99007: Permission denied

这似乎与 dev/memcg/apps 目录具有相同的权限问题。我已经运行 chown 777 dev/memcg -R 以确保所有文件和目录都具有 RWX 权限,所以我看不到错误是如何发生的。什么可以阻止它?

最佳答案

我阅读了整个问题。我认为在玩大型游戏或使用任何需要更高 RAM 内存的应用程序时,其他一些进程会限制它这样做,就像信号量一样。
因为你的错误说它无法打开

/dev/memcg/apps/uid_99032/pid_5430/memory.soft_limit_in_bytes

用于增加使用内存。

有关 memory.soft_limit_in_bytes 的更多信息,请参阅内核文档

https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt

你能给我logcat以便我进一步分析这个问题吗?

关于Android LowMemoryKiller 未能杀死 Webviews,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51994388/

有关Android LowMemoryKiller 未能杀死 Webviews的更多相关文章

  1. ruby - 在 ruby​​ 中杀死一个名为 using open3 的进程 - 2

    我正在使用命令行程序,它的工作原理如下:$ROUTE_TO_FOLDER/app如果“longtext”是使用“app”需要的参数编写的,那么它将用结果填充一个文本文件。如果没有,它将连续用点填充文本文件(为了避免这种情况,我无法处理或修改“app”的代码)。在ruby​​脚本中有这样一行:text="longtextthatwillbeusedbyapp"output=system("ROUTE_TO_FOLDER/app现在,如果文本写得好,就不会有问题,我会得到一个输出文件,如前所述。当文本写得不好时,问题就来了。接下来发生的是我的ruby​​脚本挂起,我不确定如何终止它。我找到

  2. ruby - 为什么退出 Ruby 线程会杀死我的整个程序? - 2

    我有这段代码:puts"Start"loopdoThread.startdoputs"Hellofromthread"exitendtext=getsputs"#{text}"endputs"Done"我希望看到“Start”后跟“Hellofromthread”,然后我可以输入会得到回显的输入。相反,我得到“Start”和“Hellofromthread”,然后程序退出。来自关于exit的文档:Terminatesthrandschedulesanotherthreadtoberun.Ifthisthreadisalreadymarkedtobekilled,exitreturnst

  3. ruby-on-rails - 未能安装旧的 mysql2 gem - 2

    我正在使用MacHighSierra。我在RVM中使用Ruby2.2.1。我需要将mysql2与这个RubyonRails应用程序一起使用。我确实安装了mysql5.7。我确实安装了xcode和命令行工具。我只是想让这个公司的应用程序在我的本地机器上运行。我知道我已经非常接近了,但是当我执行bundleinstall时出现最后一个错误,当我到达mysql2gem时收到以下错误:Fetchingmysql20.3.18Installingmysql20.3.18withnativeextensionsGem::Ext::BuildError:ERROR:Failedtobuildgemn

  4. ruby-on-rails - 工头不会杀死进程 - 2

    对于启动应用程序,我使用Foreman。工头从Procfile开始流程web:bundleexecrailsserverthin-p$PORTworker:bundleexecrakeenvironmentresque:workQUEUE=send_mailapi:bundleexecrailsserverthin-p$PORT如果我在运行foreman的控制台中按control+C,则foreman结束但运行的进程未被终止。是否有可能在工头被杀死时杀死工头运行的进程。 最佳答案 下面的示例假设使用的端口是4567,然后执行:lso

  5. ruby-on-rails - 杀死工头产生的进程 - 2

    我有以下Procfile:web:bundleexecunicorn-p$PORT-c./config/unicorn.rbredis:bundleexecredis-server/usr/local/etc/redis.confworker:bundleexecsidekiq运行$foremanstart启动Unicorn、Redis和Sidekiq,但我应该如何停止它们?杀死工头会使这三个人都离开。我可以使用ps看到这个:$psaux|grepredis|grep-vgrepme615600.00.025067841740s000S+9:36am0:01.28redis-serve

  6. ruby-on-rails - 设计 skip_confirmation!未能避免发送确认指令 - 2

    我的应用程序设置为如果用户使用Oauth或Openid登录,他们不必确认他们的电子邮件地址。但是,Devise仍在发送电子邮件确认。当我调用User.skip_confirmation时!我得到一个未定义的方法错误。我的模型:classUserfalsedefself.find_for_facebook_oauth(access_token,signed_in_resource=nil)data=access_token.extra.raw_infoifuser=User.where(:email=>data.email).firstuserelse#User.skip_confirm

  7. ruby-on-rails - 编译器未能生成可执行文件。 (运行时错误) - 2

    我最近升级到了OSMountainLion。我正在处理的项目需要gemsys-proctable作为依赖项,但是当我运行bundleinstall时,我得到:Fetchinggemmetadatafromhttps://rubygems.org/............Installingsys-proctable(0.9.2)withnativeextensionsGem::Installer::ExtensionBuildError:ERROR:Failedtobuildgemnativeextension./Users/mgriffel/.rvm/rubies/ruby-1.9.

  8. javascript - 杀死一个无限运行的 JavaScript 函数 - 2

    举个例子varrunInfinite=function(){while(1){//Dostuff;}};setTimeout(runInfinite,0);是否有可能打破这个runInfinite函数形式无限运行?我的意思是,是否可以在不使用标志或返回语句的情况下从另一个函数终止该函数? 最佳答案 答案是否定的。由于JavaScript是单线程的(除非您使用一些我怀疑的不太常见的实现),没有什么可以从外部中断循环(或任何其他代码块)。 关于javascript-杀死一个无限运行的Java

  9. JavaScript - 未能使用 createJavaScriptNode? - 2

    如何解决这个问题?它在过去失败了,它工作正常,但现在不行了。(通常情况下,如果您对着麦克风说话,它会在Canvas中显示绿色条。)varnavigator=window.navigator;navigator.getMedia=(navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia||navigator.msGetUserMedia);navigator.getMedia({video:false,audio:true},function(stream){console.log('

  10. javascript - Grunt require 未能按预期创建多个模块 - 2

    我的结构如下:应用程序脚本图书馆jquery.jsbootstrap.jsmoment.js应用程序.jsvendor.jscommon.jsapp.config.jsmain.js#需要配置请注意,vendor.js只是一个包含libs下所有文件的文件。例如//vendor.jsdefine(['jquery','bootstrap','moment'],function(){});只是列出依赖项:app.js依赖common.js和app.config.jscommon.js依赖vendor.jsapp.config.js依赖moment.js我想做的是运行gruntrequire

随机推荐