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

时间:2015-09-25 16:53:18

标签: java-8 nashorn

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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