Android培训班(82)Dalvik虚拟机的垃圾回收4

本文详细介绍了Dalvik虚拟机中垃圾回收的两种方式进行,一种是虚拟机线程自动执行,另一种是手动调用运行库的GC函数触发。自动回收通过创建一个内部线程定时执行,而手动回收适用于需要内存时调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过上面的学习,了解了垃圾回收的原理和过程。那么Dalvik虚拟机是什么时候进行垃圾回收呢?要回答这个问题,那么得继续分析代码,继续进入下面的学习。其实,垃圾回收主要有两种方式,一种是虚拟机线程自动进行的,一种是手动进行的。现在先来学习自动进行的方式,所谓自动方式,就是虚拟机创建一个线程,这个线程定时进行。虚拟机在初始化时,就进行创建这个线程,如下的代码:

if(gDvm.zygote){

if(!dvmInitZygote())

gotofail;

} else{

if(!dvmInitAfterZygote())

gotofail;

}


在上面这段代码里调用函数dvmInitAfterZygote,在这个函数里就会调用函数dvmSignalCatcherStartup来创建垃圾回收线程,这个函数的代码如下:

booldvmSignalCatcherStartup(void)

{

gDvm.haltSignalCatcher= false;


if(!dvmCreateInternalThread(&gDvm.signalCatcherHandle,

"SignalCatcher", signalCatcherThreadStart,NULL))

returnfalse;


returntrue;

}


通过上面的这段代码,就可以看到线程运行函数是signalCatcherThreadStart,在这个函数里就会调用函数dvmCollectGarbage来进行垃圾回收。代码如下:

voiddvmCollectGarbage(bool collectSoftReferences)

{

dvmLockHeap();


LOGVV("ExplicitGC\n");

dvmCollectGarbageInternal(collectSoftReferences);


dvmUnlockHeap();

}


在这个函数主要通过锁来锁住多线程访问的堆空间相关对象,然后直接就调用函数dvmCollectGarbageInternal来进行垃圾回收过程了,也就调用上面标记删除算法的函数。


另一种方式通过调用运行库的GC来回收,如下:

/*

* public void gc()

*

* Initiate a gc.

*/

staticvoidDalvik_java_lang_Runtime_gc(constu4* args,JValue*pResult)

{

UNUSED_PARAMETER(args);


dvmCollectGarbage(false);

RETURN_VOID();

}


在这里也是调用函数dvmCollectGarbage来进行垃圾回收。手动的方式适合当需要内存,但线程又没有调用时进行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值