Android 自动化触发GC

2023-11-06

问题

最近有个小需求,能通过自动化对app进行GC回收

对于app的处理无外乎主动调用System.gc()或者使用adb命令直接进行GC回收

解决方法

方法一

在代码里的某个方法调用System.gc(),如我申明一个receiver,然后通过接受外不广播,去调用System.gc()完成gc回收的触发,如

public class GCReceiver extends BroadcastReceiver {
    private static final String TAG = "GCReceiver";
    private static final String ACTION_GC = "com.tomes.ACTION_GC";

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        Log.i(TAG, "onReceive: " + action);
        if (ACTION_GC.equals(action)) {
            System.gc();
        }
    }
}
        <receiver
            android:name="com.tomes.GCReceiver">

            <intent-filter>
                <action android:name="com.tomes.ACTION_GC" />
            </intent-filter>
        </receiver>

需要触发的时候,只需要执行adb命令

adb shell am broadcast -a com.tomes.ACTION_GC -f 0x01000000 --es configs 0xCF0400

方法二

有没有不要额外给app编码的方法去触发gc回收呢?有的

直接上答案,adb shell进入手机的shell环境

kill -10 应用pid

触发结果如下:

2022-03-31 14:42:43.750 13997-14011/com.tomes.gctest I/.tomes.gctest: SIGUSR1 forcing GC (no HPROF) and profile save
2022-03-31 14:42:43.782 13997-14011/com.tomes.gctest I/.tomes.gctest: Explicit concurrent copying GC freed 44(32KB) AllocSpace objects, 0(0B) LOS objects, 79% free, 1577KB/7721KB, paused 92us total 31.781ms

有些小伙伴在执行kill -10 时可能会提示

sh: kill: 13997: Permission denied

这时,你需要权限,root手机可以切换到root用户,非root手机的,在app是debug模式时

则可以执行run-as命令去拿到权限

run-as 包名

kill -10 GC的原理探究

查看as如何强制触发gc的

源码如下(由于源码很清晰,所以不再做额外的解释):

//bionic/libc/kernel/uapi/asm-x86/asm/signal.h
//定义信号量
#define SIGUSR1 10
//art/runtime/signal_catcher.cc
void* SignalCatcher::Run(void* arg) {
  SignalCatcher* signal_catcher = reinterpret_cast<SignalCatcher*>(arg);
  CHECK(signal_catcher != nullptr);

  Runtime* runtime = Runtime::Current();
  CHECK(runtime->AttachCurrentThread("Signal Catcher", true, runtime->GetSystemThreadGroup(),
                                     !runtime->IsAotCompiler()));

  Thread* self = Thread::Current();
  DCHECK_NE(self->GetState(), ThreadState::kRunnable);
  {
    MutexLock mu(self, signal_catcher->lock_);
    signal_catcher->thread_ = self;
    signal_catcher->cond_.Broadcast(self);
  }

  // Set up mask with signals we want to handle.
  SignalSet signals;
  signals.Add(SIGQUIT);
  signals.Add(SIGUSR1);

  while (true) {
    int signal_number = signal_catcher->WaitForSignal(self, signals);
    if (signal_catcher->ShouldHalt()) {
      runtime->DetachCurrentThread();
      return nullptr;
    }

    switch (signal_number) {
    case SIGQUIT:
      signal_catcher->HandleSigQuit();
      break;
    //处理接收到的信号量10
    case SIGUSR1:
    //强制GC回收
      signal_catcher->HandleSigUsr1();
      break;
    default:
      LOG(ERROR) << "Unexpected signal %d" << signal_number;
      break;
    }
  }
}
//art/runtime/signal_catcher.cc
void SignalCatcher::HandleSigUsr1() {
  //这里我们能看到系统里打印出来的日志,作为佐证
  LOG(INFO) << "SIGUSR1 forcing GC (no HPROF) and profile save";
  Runtime::Current()->GetHeap()->CollectGarbage(/* clear_soft_references= */ false);
  ProfileSaver::ForceProcessProfiles();
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 自动化触发GC 的相关文章

  • 检查片段是否存在并重用它

    每次用户单击列表视图中的项目时 我都会使用以下代码创建一个片段 但通过这种方式 片段是在每次用户点击时创建的 我想要的是重用旧片段 如果存在 并仅重新加载其内容 不创建新片段 MagazineViewFragment fragment ne
  • Android GooglePlayServicesUtil.getErrorDialog() 不显示对话框

    我正在尝试检查是否可用Google Play 服务 APK在使用它之前 我有一个 软件包已过期的设备 日志显示 Google Play 服务已过时 需要 3225100 但找到 3136134 下面的代码将处理这种情况并显示一个对话框 提示
  • 使用 Firebase 数据填充 Android spinner

    我在填充时遇到一些问题propertyAddress从我的properties桌子到我的旋转器MaintenanceActivity 问题本身不在于代码 而在于可以使用 Firebase 控制台修改的数据库规则 目前 我的规则是这样的 ru
  • MissingDimensionStrategy 无处不在 - 有没有更好的方法?

    我有一个图书馆项目 让我们称之为lib1有定制的flavorDimensions指定的 更准确地说有buld尺寸与实际口味full and production 该库被另一个库项目使用 lib2 没有自定义flavorDimensions指
  • 更改 Android 应用程序的所有字体[重复]

    这个问题在这里已经有答案了 如何更改 Android 应用程序的整个字体 以前我看到这个帖子 https gist github com artem zinnatullin 7749076在 github 上 该解决方案仅适用于低于 api
  • 即使具有用户权限,也无法在外部存储上保存文件 [Android]

    我正在 Android 上开发一个用于图像处理的应用程序 但我一直在编写图像保存代码 这是我使用的方法 private void saveImageToExternalStorage Bitmap finalBitmap String ro
  • Android view.animate() 第一次执行后工作方式不同且错误

    我已经实现了一个横幅 每当用户失去连接时就会弹出 重新连接后 另一个横幅会显示几秒钟然后消失 布局是一个RelativeLayout 其中一个灰色的TextView 表示警告 一个绿色的TextView 表示重新连接消息 如果我只是更改 V
  • NanoHTTPD 如何将上传的文件保存到SD卡文件夹

    如何将上传的文件保存到SD卡文件夹 目前它存储到 data data cache文件夹 文件名如 NanoHTTPD 一些随机数 我无法将其复制到 SD 卡中的任何文件夹位置 我想将文件保存到 SD 卡中前面提到的文件夹位置 其名称与从我的
  • 使用 OpenWeatherMap API 密钥

    我得到异常 http api openweathermap org data 2 5 weather q 悉尼 http api openweathermap org data 2 5 weather q Sydney 有人可以帮助如何使用
  • Android 的@hide 注解到底有什么作用?

    Android中很多内部API都被标记出来了 hide What exactly这是吗 另一个答案 https stackoverflow com questions 17035271 what does hide mean in the
  • Android:调用超类的原因?

    我正在查看 Android 开发人员网站上的记事本教程 我有一个关于调用活动超类的重写函数的问题 例如 public class Notepadv3 extends ListActivity Override public boolean
  • 在 Android 模拟器上运行 Google 地图 v2

    我尝试在我的 Android 应用程序中实现 Google 地图 v2 但不幸的是 我收到的不是地图 而是以下消息 是否可以在 Android 模拟器 平台 4 2 上运行这些地图 目前 引用 Google Android Map API
  • RecyclerView onClick notificationItemRemoved 不会触发 onBindView

    I use notifyItemRemoved 方法我想更改其他剩余项目 但该方法没有触发onBindView 方法 除了使用notifyDataSetChanged 我想要附带的动画notifyItemRemoved method 如果您
  • AndroidPlot:从 1 到 11 的域标签

    我已经在我的应用程序中实现了 AndroidPlot 除了 X 轴标签 从 0 到 10 之外 它工作得很好 我想显示 1 到 11 此外 Y 轴上的标签不会出现 我正在使用的代码 import java text DecimalForma
  • 将 Spritekit 游戏转换为 Android?

    是否有任何新选项可以将 spritekit 游戏转换为 Android 游戏 似乎唯一的选择是用 Java 重新编码所有内容或使用 Cocos2D LibGDX 等 很不幸的是 不行 而且带有 Apportable 服务的跨平台 Sprit
  • 如何使用Android Studio录制Android屏幕?

    我已经在 Mac 上的 Applications 文件夹中安装了 Android Studio 我认为 sdk 位于包内容中 但现在我想使用 AShot jar 录制屏幕以获取应用程序的演示视频 我必须放弃SDK的路径 当我给出我认为正确的
  • 片段已添加 IllegalStateException

    我在容器 Activity 上使用此方法来显示 BFrag public void showBFrag Start a new FragmentTransaction FragmentTransaction fragmentTransact
  • 如何在Android手机上而不是模拟器上运行或调试?

    Android 模拟器速度太慢 无法测试运行的应用程序 有没有办法使用 IDE 而不是模拟器在真实手机上调试 运行应用程序 通常 您可以在手机上打开 USB 调试 然后通过 USB 将其连接到 PC 然后 手机将以与模拟器相同的方式出现在
  • 如何从 Android 应用程序调用 REST API? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我是 android 新手 也是编程新手 如何从 Android 应用程序调用 REST api GET POST 请求 请给我推荐一
  • 更改 ActionMode 溢出图标

    有没有办法更改 ActionMode Overflow 图标而不更改 正常 ActionBar 的图标 我仍然需要弄清楚如何仅更改 ActionMode Actionbar 内部的溢出图标 因为我更改了默认操作栏中的溢出图标 该图标在 Ac

随机推荐

  • Android Studio中的SDK Manager使用

    前言 网上的开源项目中使用的Build Tools的版本可能和自己本地的版本不一致 如果本地没有对应的版本 可能会出现编译报错的问题 关于项目的BuildTools的版本设置在build gradle中 便已报错如下图 解决BuildToo
  • php接入企业微信

    企业微信 现在来讲应该是一个很常见了的功能了 下面 我就以tp6来给大讲下接入企业微信的小demo吧 首先 在common php的公共方法里面写入下面两段代码 function sendRequest url 用curl请求获取acces
  • java图片验证码在服务器上返回乱码问题

    本机上没有问题 部署在阿里云服务器上都几个月了都没有问题 上传过一次代码后突然验证码就显示为看不懂的符号了 然而代码对此并没有影响的 打印生成的验证码 String word vcu produceNumAndChar length LOG
  • ES集群节点宕机导致shard unassigned解决方案

    ES集群概况 1台master节点 4台data节点 9个shards 问题 一台data节点宕机 导致5个分片处于unassigned状态 集群状态变为red 无法自动rerouting 解决步骤 1 查看所有节点的日志信息 通过日志 我
  • 开源数据目录管理工具_Java开发中用到的数据库迁移工具(flyway)

    什么是数据库版本管理 任何web软件和应用程序都需要强大的数据库管理工具 因此开发者选择一款合适的数据库管理工具尤为重要 本文列出了几款好用的数据库管理工具 有些并非开源或免费 以供开发者们参考选择 做过开发的小伙伴们都知道 实现一个需求时
  • ***没有规则可以创建“XXX”需要的目标“XXX”问题的解决方案

    在第4季 上学期 专题2 U Boot新手入门中 1 在Linux中解压uboot tq2440 tar gz 2 tar xvzf uboot tq2440 tar gz 3 进入 uboot tq2440 4 make TQ2440 c
  • 软件加密系统Themida常见问题集锦—Themida是否支持命令行保护?

    Themida是先进的Windows软件保护系统 它被用于满足软件开发人员对于所开发应用程序安全保护的需求 使其远离被先进的逆向工程和软件破解的危险 通过下载Themida 我们集中在软件保护器所具有的主要弱点 从而提供了解决这些问题的完整
  • jdbc oracle多数据源,JdbcTemplate 配置多数据源

    有时候需要对接第三方厂商的数据库或者视图 我们不想让多数据源入侵我们现有的项目 那么可以试下JdbcTemplate 这里以Oracle视图为例 先确定下对方Oracle版本 然后引入对应版本的pom org springframework
  • SNKr:创造新的潮圈文化 将区块链与时尚潮流结合

    直播内容整理 关于SNKr SNKr以 Real Recognize Real 为核心愿景 是一个由区块链赋能的潮流文化生态社区项目 由SWELL公司发起 SNKr致力于连接潮流文化中的 真 玩家与 真 产品 通过loT和区块链技术帮助品牌
  • AcWing110. 防晒

    输入样例 3 2 3 10 2 5 1 5 6 2 4 1 输出样例 2 解析 按照右区间排序 优先满足小的 include
  • python读取图片的几种方式

    opencv的像素值在 0 1 0 1 show的时候转换到 0 255 import cv2 img cv2 imread imgfile cv2 imshow img win name img cv2 waitKey 0 无限期等待输入
  • 不要自称为程序员

    如果有我可以添加到每个工程教育的一门课程 它不涉及编译器或门或时间复杂度 这将是您工业101的现实 因为我们不教他们和许多不必要的痛苦和折磨这个结果 这后立志要为你作为一个年轻的工程师的职业生涯中的自我介绍 填写在您的教育差距 就如何在 现
  • TMPGEnc 4.0 XPress(小日本4)优化安装教程

    小日本4 TMPGEnc 4 0 XPress 是小日本2 54的升级版本 与小日本2 54之间本来还有一个3 0 版本 不过3 0 没有产生太大影响即升级到4 0 版本 尽管是小日本2 54的升级版本 但3 0 以后此软件便属于全新开发
  • VirtualBox安装OpenWRT虚拟机,及Kernel panic - not syncing: Attempted to kill init故障排除

    编译或下载镜像文件 openwrt x86 generic Generic combined ext4 img gz 解压 gunzip d openwrt x86 generic Generic combined ext4 img gz
  • c++构建正态分布的随机数

    最近编程的时候遇到一个问题 需要用c 来产生一个满足正态分布的的随机数 用c 产生一个均匀分布的随机数很容易 但是满足正态分布还是有点懵逼的 然后就在网上搜一些资料 发现有三种方法可以产生正态分布的随机数 但是看别人从理论上的推导 感觉还是
  • node——使用Nginx + Node.js部署你的网站

    Nginx是一个高性能的HTTP和反向代理服务器 反向代理就是通常所说的web服务器加速 它是一种通过在繁忙的web服务器和internet之间增加一个高速的web缓冲服务器来降低实际的web服务器的负载 Nginx由俄罗斯程序员利用C语言
  • python的动态加载的一个注意地方

    先描述一下我的问题背景 然后给出错误发现 最终给出解决办法 1 我有很多python文件 并且这些文件内容会按照一定周期被更新但是文件名字不变 并且每个文件内都有一个一样的class的名字 需要我去动态调用 我的调用方法是使用的python
  • Spring-03 Aop简介,实现原理,基于ProxyFactoryBean实现Aop,基于AspectJ开发的实现

    Spring 03 1 SpringAop简介 AOP的全称是Aspect Oriented Programming 即面向切面编程 也称面向方面编程 它是面向对象编程 OOP 的一种补充 目前已成为一种比较成熟的编程方式 aop 解决的问
  • C语言——白盒测试

    深入理解白盒测试的基本方法 运用基本路径测试法设计测试用例 1 掌握白盒测试技术中基本路径测试法的基本步骤 2 训练针对具体程序运用基本路径测试法设计测试用例的能力 测试代码 DEVcpp 源代码 点击此处可下载 include
  • Android 自动化触发GC

    问题 最近有个小需求 能通过自动化对app进行GC回收 对于app的处理无外乎主动调用System gc 或者使用adb命令直接进行GC回收 解决方法 方法一 在代码里的某个方法调用System gc 如我申明一个receiver 然后通过