2016-01-06 7 views
0

Это приложение, в котором я работаю, имеет функцию загрузки отчетов (XLSX), DynamicReports 4.0 - это API, который мы используем для этого. Сбой приложения со следующей ошибкой:Почему мое приложение работает нормально локально и не работает на сервере с помощью java.lang.OutOfMemoryError: nativeGetNewTLA для того же объема данных?

weblogic.kernel.Default failed to schedule a request due to 
java.lang.OutOfMemoryError: nativeGetNewTLA 
at weblogic.work.SelfTuningWorkManagerImpl.getWorkAdapter(SelfTuningWorkManagerImpl.java:252) 
    at weblogic.work.SelfTuningWorkManagerImpl.schedule(SelfTuningWorkManagerImpl.java:148) 
    at weblogic.timers.internal.TimerManagerFactoryImpl$WorkManagerExecutor.execute(TimerManagerFactoryImpl.java:133) 
    at weblogic.timers.internal.TimerManagerImpl.execute(TimerManagerImpl.java:621) 
    at weblogic.timers.internal.TimerThread$Thread.run(TimerThread.java:277) 

при попытке загрузить отчеты.

Точная точка, где он падает, когда он пытается построить отчет (он содержит три листа внутри него). Это происходит только с большим объемом данных (более 4 МБ), для меньшего объема он просто отлично работает.

Мы используем следующий сервер/JVM

Server - Weblogic 10.3.6 
JVM- Jrockit 1.6 

Это странно, что это приложение отлично работает в среде разработки (Windows XP, 64 бит, 3Гб ОЗУ) с арг памяти по умолчанию (даже для отчета с^МБ данных), где, когда он падает на сервере, который является Windows 2008 R2 с 4 ГБ RAM. Используемая JVM такая же, как и разработка env. Мы пробовали настройку памяти, установив следующие аргументы:

-XXtlaSize:min=16k,preferred=32k -XXlargeObjectLimit:32k

-XX:PermSize=48m

-XX:MaxPermSize=128m

Пробовал увеличение и уменьшение размера TLA только на провал.

Почему это хорошо работает при разработке и сбое в работе сервера? как определить основную причину и решение?

Примечание: Мы не можем использовать профилировщики на сервере, однако мы попробовали JrockitMission Control, который доступен с пакетом weblogic, и это не помогло.

+0

Поддерживается ли эта версия JRockit? Я предлагаю вам обратиться к поддержке Oracle или перейти на более новую версию. –

+0

спасибо за ваш отзыв Питер Лоури, нет, он не поддерживается, и это последняя и последняя версия Jrockit. Невозможно выполнить обновление. –

ответ

0

Не зная слишком много о вашей программе или ваших системах (dev и prod), это всего лишь гипотеза, но в случае ее неправильности вы все равно можете найти полезную информацию здесь, которая может вам помочь.

Так у вас есть две системы:

  • DEV: Windows XP, 64 бит, 3GB RAM)

  • Prod: что Windows 2008 R2 с 4GB Ram

Ошибка, которую вы испытываете: OutOfMemoryError: nativeGetNewTLA

Even th вы пробовали настраивать настройки TLA, это не помогло.

Я думаю, что ваша проблема не в самой теме. TLA находится на куче. Невозможность выделить TLA для нового потока просто означает, что ваше приложение закончилось из памяти кучи. Поэтому мы должны сосредоточиться на использовании памяти кучи. Поскольку вы указали только физическое ОЗУ и операционную систему, я предполагаю, что вы используете настройки памяти по умолчанию. В этом случае ваша установка DEV лучше, чем ваша PROD. Зачем? Потому что ваш DEV env - 64 бит. Если вы проверяете JRockit documentation on default values, вы увидите, что:

Windows on a 64 bit platform - 75% of total physical memory up to 2 GB

Windows on a 32 bit platform - 75% of total physical memory up to 1 GB

Вероятно, ваше приложение будет на самом деле нужно heapsize над 1Gb, и он не получает его на сервере.Чтобы исправить это, вам нужно вручную выделить больше максимальной памяти для кучи, используя:

-Xmx:2g 
+0

Спасибо, Gergely Bacso, вот точные mem args, которые используются в настоящее время. -Xms512m -Xmx1024m -XXtlaSize: мин = 16k, 32k = предпочтительным -XXlargeObjectLimit: 32k –

+0

Когда я изменить арг к -Xms 1024M -Xmx 1536m, я получить этот java.lang.OutOfMemoryError: allocLargeObjectOrArray - размер объекта: 10440, Num элементы: 10424 \t на java.text.RuleBasedBreakIterator.readFile (RuleBasedBreakIterator.java:469) \t на java.text.RuleBasedBreakIterator.readTables (RuleBasedBreakIterator.java:362) \t на java.text.RuleBasedBreakIterator. (RuleBasedBreakIterator.java:308) \t в java.text.BreakIterator.createBreakInstance (BreakIterator.java:584) \t в java.text.BreakIterator.getBreakInstance (BreakIterator.java:541) –

+0

Изменить XMX на 2Gb, чтобы соответствовать Вашему локальная конфигурация. Вы по-прежнему испытываете такую ​​же проблему, просто заканчивая память в другой точке, так что вы получаете немного другую ошибку. –