JythonとCPython
PythonにはJVMで動作するJythonとネイティブのCpythonが存在していて、
それぞれ異なるGCのメカニズムを採用している。
CPythonは、基本的に参照カウント方式で循環参照が発生した場合に限り
マーク&スイープらしい。
Jythonはというと、JVMに乗っかっているのだから世代別ガーベジコレクション(コピーGCとマークアンドスイープ)。
ということで、次のようなコードを動作確認。
class SomethingSpecial(object): def __init__(self): print("hello") def __del__(self): print("goodbye") def func(): print("start func") x = SomethingSpecial() func() print("endfunc")
CPythonだと、スコープからはずれるとデストラクタが呼ばれているのがわかる。
# python memory.py start func hello goodbye endfunc
# jython memory.py start func hello endfunc
CPythonでRAII(Resource Acquisition Is Initialization)ができるからといって、安易にそれを前提としたモジュールを作ってしまうと移植性がなくなってしまったりするうえ、気づきにくいバグを生みそうで怖い。