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

  

posted @ 2020-07-02 17:19  JXY_Super  阅读(1278)  评论(0编辑  收藏  举报