理论教育 垃圾回收方法探析:自动与手动

垃圾回收方法探析:自动与手动

时间:2023-06-19 理论教育 版权反馈
【摘要】:通过本章前面内容的学习,了解了垃圾回收的原理和过程。其实,垃圾回收主要有两种方式,一种是虚拟机线程自动进行的,一种是手动进行的。虚拟机在初始化时就创建这个线程,例如下面的代码:在上述代码中调用了函数dvmInitAfterZygote,此函数中会调用函数dvmSignalCatcherStartup来创建垃圾回收线程。函数dvmCollectGarbage的具体实现代码如下:函数dvmCollectGarbage主要通过锁来锁住多线程访问的堆空间相关对象,然后直接就调用函数dvmCollectGarbageInternal来进行垃圾回收过程,也就是调用dvmHeapSweep UnmarkedObjects函数实现垃圾回收。

垃圾回收方法探析:自动与手动

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

在上述代码中调用了函数dvmInitAfterZygote,此函数中会调用函数dvmSignalCatcherStartup来创建垃圾回收线程。函数dvmInitAfterZygote的具体实现代码如下。

函数dvmSignalCatcherStartup()的实现代码如下:

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

函数dvmCollectGarbage主要通过锁来锁住多线程访问的堆空间相关对象,然后直接就调用函数dvmCollectGarbageInternal来进行垃圾回收过程,也就是调用dvmHeapSweep UnmarkedObjects函数实现垃圾回收。

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

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

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈