Nashorn JSON.parse() - java.lang.OutOfMemoryError: Java heap space - JDK8u60

Nashorn JSON.parse() - java.lang.OutOfMemoryError: Java heap space - JDK8u60

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

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

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

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

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

我们等了将近 4 个月才修复原始错误,现在新路径又引入了另一个错误(这真的很令人沮丧,我不确定这些错误是如何从回归中逃脱的)。有什么解决方法吗?是否可以用其他众所周知的 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$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