java - Groovy 模板引擎和内存不足。可能存在内存泄漏吗?

标签 java groovy

我在使用 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/

相关文章:

java - 需要帮助从字符串中删除奇怪的字符

java - 无法实例化可遍历解析器类 org.hibernate.validator.internal.engine.resolver.DefaultTraversableResolver

java - 无法执行目标 org.apache.maven.plugins :maven-surefire-plugin:2. 16:SAKAI 中的测试错误

java - 方法 : groovy. sql.Sql.callWithAllRows() 的签名不适用于参数类型

gradle - 尝试遍历数组并将每个值传递给 gradle 任务

java - 如何使用 iText 1.5.4 添加多行页脚?

java - 无论应用程序处于什么状态,都获取设备的位置始终从我的公司应用程序中检测位置

grails - 如何在Grails中定义uploadForm和2个不同的 Action ?

java - 使用 Castor 和 Grails 进行 XML 解码

java - 使用 Groovy 脚本创建 java 类的实例