gpt4 book ai didi

java - 构建大型 js 对象(字符串)时出现 Nashorn OutOfMemoryError

转载 作者:行者123 更新时间:2023-12-01 10:13:39 24 4
gpt4 key购买 nike

我在 1.8u60 上使用 Nashorn 创建模型对象以传回 View 层 (thymeleaf)。模型对象的一部分是一个包含 HTML 的有点大的字符串(不足以在纯 java 中引起任何问题)。当尝试使用 ScriptObjectMirror 方法将对象转换回 Java 时,我遇到了以下异常。更改最大堆大小似乎没有任何效果(从 900mb 更改为 1800mb,同样的错误)。我在网上找不到太多相关信息,但是 Nashorn 对对象大小有什么限制吗?我现在要尝试最新的 1.8 JDK。

java.lang.OutOfMemoryError: Java heap space
at jdk.nashorn.internal.runtime.ConsString.flatten(ConsString.java:105)
at jdk.nashorn.internal.runtime.ConsString.flattened(ConsString.java:98)
at jdk.nashorn.internal.runtime.ConsString.toString(ConsString.java:69)
at jdk.nashorn.api.scripting.ScriptObjectMirror.wrap(ScriptObjectMirror.java:704)
at jdk.nashorn.api.scripting.ScriptObjectMirror.wrapLikeMe(ScriptObjectMirror.java:721)
at jdk.nashorn.api.scripting.ScriptObjectMirror.wrapLikeMe(ScriptObjectMirror.java:730)
at jdk.nashorn.api.scripting.ScriptObjectMirror.access$300(ScriptObjectMirror.java:64)
at jdk.nashorn.api.scripting.ScriptObjectMirror$13.call(ScriptObjectMirror.java:371)
at jdk.nashorn.api.scripting.ScriptObjectMirror$13.call(ScriptObjectMirror.java:364)
at jdk.nashorn.api.scripting.ScriptObjectMirror.inGlobal(ScriptObjectMirror.java:859)
at jdk.nashorn.api.scripting.ScriptObjectMirror.entrySet(ScriptObjectMirror.java:364)

...

谢谢,阿德里安

最佳答案

该行内容为

        final char[] chars = new char[length];

看来确实没有足够的内存来容纳最终的字符串。 Nashorn 使用 ConsString 作为一种通过延迟连接直到使用结果来摊销连接成本的方法(大多数 JS 引擎都使用此优化,否则例如在循环中连接大量字符串将需要 O(n^2) 时间)。

这意味着字符串上的许多 + 运算符的结果可能是立即“扁平化”的 ConsString 对象树。线性化串联时间的权衡是需要保留这些 ConsString,这将需要字符串所需内存的两倍以上(超过两倍是因为 ConsString 对象自身的开销)。

解决此问题的一种方法是定期调用 str.toString()。它看起来是一个空操作,但在内部它强制扁平化串联树。尝试在某个时候将其引入到您的代码中,看看是否有帮助。

关于java - 构建大型 js 对象(字符串)时出现 Nashorn OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36025376/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com