为什么我的应用程序在本地运行良好,而在相同数据量的情况下,在服务器上使用java.lang.OutOfMemoryErr



我正在使用的这个应用程序具有下载报告的功能(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

奇怪的是,这个应用程序在具有默认内存参数(即使是具有^MB数据的报告)的开发环境(Windows XP,64位,3GB Ram)中运行良好,因为它在服务器中崩溃,即具有4GB Ram的Windows 2008 R2。所使用的JVM与开发环境相同。我们尝试通过设置以下参数来调整内存:

-XXtla大小:最小值=16k,首选值=32k-XXlargeObjectLimit:32k

-XX: PermSize=48m

-XX: 最大PermSize=128米

尝试增加和减少TLA大小,但都失败了。

为什么它在开发中运行良好,而在服务器中却失败了?如何找出根本原因和解决方案?

注意:我们不能在服务器上使用profiler,但我们尝试了与weblogic软件包一起提供的JrockitMission Control,但没有太大帮助。

在不了解太多程序或系统(开发和生产)的情况下,这只是一个假设,但如果它是错误的,您可能仍然可以在这里找到有用的信息来帮助您

所以你有两个系统:

  • DEV:Windows XP,64位,3GB内存)

  • PROD:这是windows 2008 R2与4GB内存

您遇到的错误是:OutOfMemoryError: nativeGetNewTLA

即使您尝试调整TLA设置,也无济于事。

我认为您的问题不在于线程本地区本身TLA已堆积。无法将TLA分配给新线程只意味着你的应用程序耗尽了堆内存。因此,我们应该关注堆内存的使用情况。由于您只指定了物理RAM和操作系统,我认为您使用的是默认内存设置。在这种情况下,你的DEV设置比你的PROD更好。为什么?因为你的DEV环境是64位的。如果你查看JRockit文档中的默认值,你会发现:

64位平台上的Windows-占总物理内存的75%以上至2 GB

32位平台上的Windows-物理总量的75%内存高达1 GB

很可能您的应用程序实际上需要超过1Gb的堆大小,而服务器上没有。要解决这个问题,您需要使用以下命令手动分配更多可用于堆的最大内存:

 -Xmx:2g

相关内容

最新更新