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だとデストラクタは呼ばれていない。

# jython memory.py      
start func
hello
endfunc

CPythonでRAII(Resource Acquisition Is Initialization)ができるからといって、安易にそれを前提としたモジュールを作ってしまうと移植性がなくなってしまったりするうえ、気づきにくいバグを生みそうで怖い。