0

我正在开发的这个应用程序具有下载报告(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)中运行良好(即使对于具有 ^MB 数据的报告),当它在服务器中崩溃时,它是 windows 2008 R2 4GB 内存。使用的 JVM 与开发环境相同。我们尝试通过设置以下参数来调整内存:

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

-XX:PermSize=48m

-XX:MaxPermSize=128m

尝试增加和减少 TLA 大小只是失败了。

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

注意:我们不能在服务器上使用分析器,但是我们尝试了 weblogic 包中提供的 JrockitMission Control,但没有多大帮助。

4

1 回答 1

0

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

所以你有两个系统:

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

  • 产品:这是带有 4GB 内存的 windows 2008 R2

您遇到的错误是:OutOfMemoryError: nativeGetNewTLA

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

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

64 位平台上的 Windows - 总物理内存的 75%,最高 2 GB

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

很可能您的应用程序实际上需要超过 1Gb 的堆大小,并且它不会在服务器上获取它。要解决此问题,您需要使用以下方法手动分配更多可用于堆的最大内存:

 -Xmx:2g
于 2016-01-06T08:28:51.660 回答