我正在处理的这个应用程序具有下载报告的功能(XLSX),DynamicReports 4.0是我们正在使用的API。应用程序崩溃时出现以下错误:
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)
当我们尝试下载报告时。
它崩溃的确切点是它试图构建报告时(它里面有三张纸)。这种情况只发生在数据量较大(超过4MB)的情况下,对于较小的音量,它才能正常工作。
我们正在使用以下服务器/ jvm
Server - Weblogic 10.3.6
JVM- Jrockit 1.6
奇怪的是,这个应用程序在开发环境(Windows XP,64位,3GB Ram)中使用默认内存args(即使对于具有^ MB数据的报告)也很好,因为它在服务器中崩溃,这是windows 2008 R2搭配4GB Ram。使用的JVM与开发环境相同。我们尝试通过设置以下args来调整内存:
-XXtlaSize:min = 16k,首选= 32k -XXlargeObjectLimit:32k
-XX:PermSize =48米
-XX:MaxPermSize参数=128米
尝试增加和减少TLA大小只是失败。
为什么它在开发中运行良好并且在服务器中失败?我如何找出根本原因和解决方案?
注意:我们不能在服务器上使用分析器,但是我们尝试使用weblogic包提供的JrockitMission Control并没有多大帮助。
答案 0 :(得分:0)
在不了解您的程序或您的系统(dev和prod)的情况下,这只是一个假设,但如果它是错误的,您可能仍会在这里找到可以帮助您的有用信息。 < / p>
所以你有两个系统:
DEV:Windows XP,64位,3GB Ram)
PROD:这是带有4GB Ram的Windows 2008 R2
您遇到的错误是:OutOfMemoryError: nativeGetNewTLA
即使您尝试调整TLA设置,它也无济于事。
我认为你的问题不是线程局部区域。 TLA在堆上。无法将TLA分配给新线程只是意味着您的应用程序耗尽堆内存。所以我们应该关注堆内存使用情况。由于您只指定了物理RAM和操作系统,因此我假设您使用的是默认内存设置。在这种情况下,您的DEV设置比您的PROD更好。为什么?因为您的DEV env是64位。如果您查看JRockit documentation on default values,您会看到:
64位平台上的Windows - 总物理内存的75% up 到2 GB
32位平台上的Windows - 占物理总量的75% 内存最高1 GB
可能你的应用程序实际上需要超过1Gb的堆,并且它不会在服务器上获取它。要解决此问题,您需要使用以下命令手动为堆分配更多可用内存:
-Xmx:2g