Nashorn JSON.parse() - java.lang.OutOfMemoryError:Java 堆空间 - JDK8u60

2024-06-21

Nashron 发行说明声称他们修复了 JSON 解析器错误,但我仍然能够在新补丁 8u60 上产生(不同的)错误。这次是OutOfMemoryError。

请参阅随附的 JSON [1](通常是类别和子类别关系)。当我尝试调用 JSON.parse() 时,它失败了。

[1] http://jsfiddle.net/manivannandsekaran/rfftavkz/ http://jsfiddle.net/manivannandsekaran/rfftavkz/

  1. 我尝试增加堆大小,但没有帮助,而不是得到 OOM异常很快,它延迟了一点。
  2. 当我用 Alpahnumberic 替换所有整数键时,整个 解析时间非常快。 [2]

[2] https://jsfiddle.net/manivannandsekaran/8yw3ojmu/ https://jsfiddle.net/manivannandsekaran/8yw3ojmu/

我们等了将近 4 个月才修复原来的 bug,现在新的路径又引入了另一个 bug(这真的令人沮丧,我不确定这些 bug 是如何从回归中逃脱的)。有没有可用的解决方法?是否可以使用其他众所周知的 JSON 解析器(例如 GSON 或 Jackson)覆盖默认 JSON 解析器。

这里是 JJS 失败的堆栈跟踪。

jjs> load("catsubcat/test.js")
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at jdk.nashorn.internal.runtime.arrays.IntArrayData.toObjectArray(IntArrayData.java:138)
        at jdk.nashorn.internal.runtime.arrays.IntArrayData.convertToObject(IntArrayData.java:180)
        at jdk.nashorn.internal.runtime.arrays.IntArrayData.convert(IntArrayData.java:192)
        at jdk.nashorn.internal.runtime.arrays.IntArrayData.set(IntArrayData.java:243)
        at jdk.nashorn.internal.runtime.arrays.ArrayFilter.set(ArrayFilter.java:99)
        at jdk.nashorn.internal.runtime.arrays.DeletedRangeArrayFilter.set(DeletedRangeArrayFilter.java:144)
        at jdk.nashorn.internal.parser.JSONParser.addArrayElement(JSONParser.java:246)
        at jdk.nashorn.internal.parser.JSONParser.parseObject(JSONParser.java:210)
        at jdk.nashorn.internal.parser.JSONParser.parseLiteral(JSONParser.java:165)
        at jdk.nashorn.internal.parser.JSONParser.parseObject(JSONParser.java:207)
        at jdk.nashorn.internal.parser.JSONParser.parseLiteral(JSONParser.java:165)
        at jdk.nashorn.internal.parser.JSONParser.parseObject(JSONParser.java:207)
        at jdk.nashorn.internal.parser.JSONParser.parseLiteral(JSONParser.java:165)
        at jdk.nashorn.internal.parser.JSONParser.parse(JSONParser.java:148)
        at jdk.nashorn.internal.runtime.JSONFunctions.parse(JSONFunctions.java:80)
        at jdk.nashorn.internal.objects.NativeJSON.parse(NativeJSON.java:105)
        at java.lang.invoke.LambdaForm$DMH/1880587981.invokeStatic_L3_L(LambdaForm$DMH)
        at java.lang.invoke.LambdaForm$BMH/1095293768.reinvoke(LambdaForm$BMH)
        at java.lang.invoke.LambdaForm$MH/1411892748.exactInvoker(LambdaForm$MH)
        at java.lang.invoke.LambdaForm$MH/22805895.linkToCallSite(LambdaForm$MH)
        at jdk.nashorn.internal.scripts.Script$5$test.:program(file:catsubcat/test.js:1)
        at java.lang.invoke.LambdaForm$DMH/1323165413.invokeStatic_LL_L(LambdaForm$DMH)
        at java.lang.invoke.LambdaForm$MH/653687670.invokeExact_MT(LambdaForm$MH)
        at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:640)
        at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:228)
        at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:393)
        at jdk.nashorn.internal.runtime.Context.evaluateSource(Context.java:1219)
        at jdk.nashorn.internal.runtime.Context.load(Context.java:841)
        at jdk.nashorn.internal.objects.Global.load(Global.java:1536)
        at java.lang.invoke.LambdaForm$DMH/1323165413.invokeStatic_LL_L(LambdaForm$DMH)
        at java.lang.invoke.LambdaForm$BMH/1413378318.reinvoke(LambdaForm$BMH)
        at java.lang.invoke.LambdaForm$reinvoker/40472007.dontInline(LambdaForm$reinvoker)

问题只是 Nashorn 切换到稀疏数组表示太晚了。我为此提交了一个错误:https://bugs.openjdk.java.net/browse/JDK-8137281 https://bugs.openjdk.java.net/browse/JDK-8137281

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nashorn JSON.parse() - java.lang.OutOfMemoryError:Java 堆空间 - JDK8u60 的相关文章

随机推荐