android定时调用gc,Android性能:远程触发GC

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

一、远程触发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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值