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

Java 8 Nashorn JSON.parse()-java.lang.OutOfMemoryError:java堆空间-JDK8u60,java-8,nashorn,Java 8,Nashorn,Nashron发行说明声称他们修复了JSON解析器错误,但我仍然能够在新补丁8u60上产生一个(不同的)错误。这次是OutOfMemoryError 请参阅所附的JSON[1](它通常是一个类别和子类别关系)。当我尝试调用JSON.parse()时,它失败了 [1] 我试图增加堆的大小,但没有帮助,而是 OOM异常很快,有点延迟 当我用Alpahnumberic替换所有整数键时,整个 解析时间非常快。[2] [2] 我们等了将近4个月才修复了原来的bug,现在新的路径又引入了另一个bug(这真是

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

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

[1]

  • 我试图增加堆的大小,但没有帮助,而是 OOM异常很快,有点延迟
  • 当我用Alpahnumberic替换所有整数键时,整个 解析时间非常快。[2]
  • [2]

    我们等了将近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切换到稀疏数组表示太晚了。我为此提交了一个错误:

    嗨,你是否尝试过将永久发电机空间设置得更大?很快,使用AOP API,类在运行时创建,并且需要最大,因为JAVA_OPTS=“-Xms256m-Xmx1024m-XX:PermSize=512m-XX:MaxPermSize=1024m”没有帮助。如果我增加最大堆大小,错误就会延迟。另外,我正在解析正确的JSON“对象”,没有调用“数组”实例。但是,异常stacktrace指向addArrayElement。很抱歉,PermGen空间在JDK 8中不再存在。非常感谢你,汉内斯。我认为问题不仅限于JSON.parse()本身。当我使用脚本对象上的模式(“\d+”)迭代生成整数值属性时,我能够重现相同的OutOfMemoryError(如有问题的JSON中所示)