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