2015-09-25 1 views
3

Nashron Примечания к выпуску утверждают, что они исправили ошибки парсера JSON, но я все еще могу создать (другую) ошибку в новом патче 8u60. На этот раз это OutOfMemoryError.Nashorn JSON.parse() - java.lang.OutOfMemoryError: Java heap space - JDK8u60

Обратитесь к прилагаемому JSON [1] (обычно это относится к категории & Подкатегория). Когда я пытаюсь вызвать JSON.parse(), он терпит неудачу.

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

  1. Я попытался увеличить размер кучи, не помогло, вместо того, чтобы ООМ Exception быстро, задерживается немного.
  2. Когда я заменяю весь целочисленный ключ на Alpahnumberic, весь процесс обработки синтаксиса очень быстрый. [2]

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

Это почти 4 месяца мы ждали, чтобы получить оригинальную ошибка исправлена, теперь снова новый путь введен другая ошибку (это действительно расстраивает, я не уверен, как эти ошибки выходят из регрессии). Есть ли доступ к обходу? Можно ли переопределить парсер JSON по умолчанию с другими известными анализаторами JSON (например, GSON или Jackson).

Здесь трассировка следа отказа от 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) 
+0

Hi, Вы пытались установить пространство пермгенов больше? Вскоре, с API AOP, классы создаются во время выполнения и должны быть самыми большими, как установлено JAVA_OPTS = "- Xms256m -Xmx1024m -XX: PermSize = 512m -XX: MaxPermSize = 1024m" –

+0

Не помогло. Если я увеличиваю размер MAX Heap, ошибка просто задержится. Кроме того, я разбираю собственно JSON-объект, нет экземпляра «массив». Но исключение stacktrace указывает на addArrayElement. –

+0

Извините, пространство PermGen больше не существует un JDK 8. http://java-latte.blogspot.in/2014/03/metaspace-in-java-8.html –

ответ

2

Проблема в том, что Nashorn переключается на разреженное представление массива слишком поздно. Я подал ошибку: https://bugs.openjdk.java.net/browse/JDK-8137281

+0

Большое спасибо Hannes. Я думаю, что проблема не ограничивается только JSON.parse(). Я могу воспроизвести тот же OutOfMemoryError, когда итеративно генерирую целочисленное свойство с шаблоном («\ d +») на объекте script (как указано в проблемном JSON) –

 Смежные вопросы

  • Нет связанных вопросов^_^