一、远程触发GC原理
我们都知道 GC 是java虚拟机释放内存的机制。
一般的在当前进程触发GC有两种方式:
主动触发。调用System.gc()
被动触发。预分配的内存不足 or OOM之前
有没有办法跨进程 做GC操作呢?
答案是肯定的。因为Android Moniter中就给我们提供了 Initiate GC 功能,可以对Debug版进程 远程触发GC动作:
这个功能是Android Studio中自带的, 到底是如何实现的呢?
通过阅读android源码, 发现了Android 框架中为每个进程都预留了 远程触发GC的接口:
// URL: http://androidxref.com/4.4.4_r1/xref/dalvik/vm/SignalCatcher.cpp#signalCatcherThreadStart
static void* signalCatcherThreadStart(void* arg)
{
// ... (略)
sigemptyset(&mask);
sigaddset(&mask, SIGUSR1);
// ... (略)
while (true) {
// ...
cc = sigwait(&mask, &rcvd);
// ...
if (gDvm.haltSignalCatcher)
break;
// ...
switch (rcvd) {
// ...
case SIGUSR1:
handleSigUsr1();
break;
// ...
}
}
return NULL;
}
而 handleSigUsr1() 函数是干啥子的呢?
// http://androidxref.com/4.4.4_r1/xref/dalvik/vm/SignalCatcher.cpp#handleSigUsr1
static void handleSigUsr1()
{
ALOGI("SIGUSR1 forcing GC (no HPROF)");
dvmCollectGarbage(); /*GC函数*/
}
看到这里已经能确定, 可以通过发送信号 SIGUSR

本文探讨了如何远程触发 Android 进程的 GC 操作,通过 Android Studio 的 Android Monitor 功能展示了其实现原理,涉及信号 SIGUSR1 和源码分析。通过实验验证了发送 SIGUSR1(信号 10)给进程 PID 可以强制执行 GC,并观察到 Android 对软引用的特殊回收策略——每次 GC 回收一半软引用对象。
最低0.47元/天 解锁文章
12万+

被折叠的 条评论
为什么被折叠?



