2012-11-16 60 views
1

我們的Jython環境存在問題,這意味着在對PythonInterpreter對象進行一定數量的eval調用之後,我們會遇到「超出內存溢出」錯誤。使用Jython的內存溢出

有沒有人有這方面的經驗,以及如何解決它?

我們目前正在Jython 2.5.2上運行。

下面是用於反覆調用解釋器的代碼的摘錄。

public Map<String, String> invoke(Map<String, String> parameters) { 

    //logger.info("Executing script for parameters: " + parameters); 

    this.interpreter.set("inputDict", parameters); 
    PyDictionary dict = (PyDictionary)this.interpreter.eval(ScriptComposer.mainMethodName + "(inputDict)"); 

    //logger.info("Done executing script for parameters: " + parameters); 

    return dict; 

} 

回答

1

嗯,我想我已經找到了問題,所以只是爲了幫助其他人遇到這個問題,我會發布一些提示。

對於2.5.2之前的Jython版本,確實存在一個關於類生成和類引用保持的錯誤,這意味着在調用eval/exec之後,會遇到上述問題。

但是,當使用Jython 2.5.2及更高版本時本身沒有任何問題,但是當同時在不同線程上使用多個PythonInterpreter對象時,永久生成對象(類和靜態成員)所需的內存會增加,所以你必須啓動虛擬機:

-XX:PermSize=$START_JVM_PERMSIZE -XX:MaxPermSize=$MAX_JVM_PERMSIZE 

因此增加了爲永久生成對象分配的開始和最大內存。

希望這可以幫助他人更快解決這個問題。