Groovy 腳本造成OOM的真相


groovy.lang.GroovyShell
在內部,它使用groovy.lang.GroovyClassLoader,這是在運行時編譯和加載類的核心。
 
 
groovy.lang.GroovyClassLoader
通過使用GroovyClassLoader代替GroovyShell,您將能夠加載類,而不是腳本實例
 
GroovyClassLoader保留對其創建的所有類的引用,因此很容易造成內存泄漏。特別是,如果您兩次執行相同的腳本(如果它是一個字符串),那么您將獲得兩個不同的類!
 
原因: GroovyClassLoader不能跟蹤源文本
如果要具有相同的實例,則源必須是文件 // 類名相同
 
def gcl = new GroovyClassLoader()
def clazz1 = gcl.parseClass(file)
def clazz2 = gcl.parseClass(new File(file.absolutePath))
assert clazz1.name == 'Foo'
assert clazz2.name == 'Foo'
assert clazz1 == clazz2

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM