我在使用 Java 中的 Groovy TemplateEngines 时遇到一些问题,但没有在 OOM 中运行。当创建很多不同的模板时,在我看来,在堆上创建了很多脚本 - 这些脚本永远不会是垃圾 集。
我使用 java 8。当使用 -Xmx32M 运行此代码时,可能会进行大约 3000 次迭代。之后会抛出 OOM 错误。
这是我的代码:
import groovy.text.SimpleTemplateEngine;
import groovy.text.Template;
import groovy.text.TemplateEngine;
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main(String[] args) throws Exception {
String groovy = "XX-${i}";
for (int i = 0; i < (1000000000); i++) {
TemplateEngine e = new SimpleTemplateEngine();
Template t = e.createTemplate(groovy);
Map<String, Object> binding = new HashMap<>();
binding.put("i", i);
String res = t.make(binding).toString();
if (i % 100 == 0) {
System.out.println("->" + res);
}
}
}
}
我还尝试了不同的变体和 ClassLoaded - 但本质上结果总是相同的。由于我找不到任何当前问题,我想我错过了一些东西。
谁能帮我解答一下吗?
蒂诺
最佳答案
这是你的问题https://bugs.openjdk.java.net/browse/JDK-8037342 .
每次解析器运行时,它都会根据正在完成的解析次数创建一个新的唯一类。例如,过了一会儿,类名称看起来像
groovy.runtime.metaclass.SimpleTemplateScript4237MetaClass groovy.runtime.metaclass.SimpleTemplateScript4238MetaClass
一段时间后,类加载器的 parallelLockMap
将填满堆,并且没有任何内容可以进行 GC。这有点像 OOM PermGen
错误。
关于java - Groovy 模板引擎和内存不足。可能存在内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37992822/