根据参考文档:
GroovyClassLoader 保留了它创建的所有类的引用,因此很容易造成内存泄漏。特别是,如果您执行两次相同的脚本,如果它是一个字符串,那么您将获得两个不同的类!
我使用文件作为解析源,但关闭了缓存:
GroovyCodeSource src = new GroovyCodeSource( file )
src.cachable = false
Class clazz = groovyClassLoader.parseClass src
Class clazz1 = groovyClassLoader.parseClass src
log.info "$clazz <=> $clazz1 equal: ${clazz == clazz1}"
日志输出总是
class MyClass <=> class MyClass 等于:false
如果我注释该行src.cachable = false
,则类实例变得相等,但即使基础文件已更改,它们也不会重新编译。
因此问题是:我怎样才能正确地重新编译类而不造成内存泄漏?