2016-07-29 74 views
2

Java有daemon線程來監視內存使用情況並執行gc任務。從jstack我看到爲什麼python沒有垃圾收集器線程?

"main" #1 prio=5 os_prio=0 tid=0x00007f34b000e000 nid=0x808 waiting on condition [0x00007f34b6f02000] 
    java.lang.Thread.State: TIMED_WAITING (sleeping) 
    at java.lang.Thread.sleep(Native Method) 
.... 
"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007f34b0023000 nid=0x809 runnable 
"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00007f34b0024800 nid=0x80a runnable 
"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x00007f34b0026800 nid=0x80b runnable 

但是Python的說,我寫了一個

#!/usr/bin/env python 
import gc 
import time 
gc.enable() 
while True: 
    print "This prints once a minute." 
    time.sleep(60) 

只見蟒蛇進程只有一個線程,

$ cat /proc/1627/status 
Name: python 
... 
Threads: 1 

的問題是,爲什麼蟒蛇沒有像Java這樣的gc線程?然後哪個線程完成gc任務?

+3

CPython的工作主要是由同步參考(與應用程序邏輯並行運行GC活動) - 計數,並在單線程中運行(除非程序員顯式創建更多線程)。但這是一個很大的話題,不適合這個網站的問答格式。 –

+0

@TimPeters。如果只有一個線程(主線程)阻塞等待「sleep(60)」,那麼該線程不能執行其他任務,如gc。這是困擾我的東西。我只需要知道哪個線程gc。 – waltersu

+1

如果所有的線程都在睡覺,爲什麼你需要做gc?幾乎沒有什麼可收集的。 –

回答

2

如果你用-XX:+UseSerialGC選項啓動java,你將看不到任何GC線程。 對於單線程GC算法,應用程序線程可用於執行GC活動。需要

專用線程

  • 並行GC(你需要比單個線程更多)
  • 併發GC