部署取消部署时Weblogic内存泄漏

时间:2012-07-27 06:35:40

标签: java java-ee memory-leaks weblogic

使用-Xmx1024m -Xms1024m运行32位JRockit R 28.2.4-14的Weblogic 10.3.5在我们的Java EE EAR文件的5-8 Undeploy-Redeploy周期之后总是会超出本机内存。

根据错误消息和VisualVM中显示的内容,Java Heap不是太满,而是系统内存不足。

java.lang.OutOfMemoryError: class allocation, 865324184 loaded, 464M footprint,
in check_alloc (src/jvm/model/classload/classalloc.c:215).

Attempting to allocate 1G bytes

There is insufficient native memory for the Java
Runtime Environment to continue.

Possible reasons:
  The system is out of physical RAM or swap space
  In 32 bit mode, the process size limit was hit
Possible solutions:
  Reduce memory load on the system
  Increase physical memory or swap space
  Check if swap backing store is full
  Use 64 bit Java on a 64 bit OS
  Decrease Java heap size (-Xmx/-Xms)
  Decrease number of Java threads
  Decrease Java thread stack sizes (-Xss)
  Disable compressed references (-XXcompressedRefs=false)

        at sun.misc.Unsafe.defineClass(Native Method)
        at sun.reflect.ClassDefiner.defineClass(ClassDefiner.java:45)
        at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:381)
        at sun.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:377)
        at sun.reflect.MethodAccessorGenerator.generateSerializationConstructor(MethodAccessorGenerator.java:95)
        at sun.reflect.ReflectionFactory.newConstructorForSerialization(ReflectionFactory.java:313)
        at java.io.ObjectStreamClass.getSerializableConstructor(ObjectStreamClass.java:1322)

我理解建议的可能解决方案,但是如果应用程序仅部署一次就一切正常,那么在取消部署时似乎没有正确释放类。取消部署后的堆转储显示我们的许多类都留在内存中。它们不应该被垃圾收集吗?

GC Root的路径显示了一个线程<JNI Local> java.lang.Thread @ 0x129ac778 JDWP Transport Listener: dt_socket Native Stack, Thread。服务器上没有流量,我不知道为什么它会保持活动状态。

3 个答案:

答案 0 :(得分:2)

这种内存泄漏很可能是在perm-gen空间中引起的(这就是它在Hotspot JVM上调用的方式)。 JRockit没有专用的Perm-Gen空间,但为此使用“常规”堆空间。 看看以下网站,我发现这些网站对于了解这里发生的事情非常有帮助:

What is a PermGen leak

Busting PermGen Myths

答案 1 :(得分:0)

我发现Eclipse MAT对调试PermGen泄漏很有帮助:

我的方法通常是这样的:

  • 取消部署后进行堆转储
  • 找到你们中的一个应用程序类(并不重要,哪些都应该泄漏)。或者显示重复的类。
  • 显示GC根目录的路径

为什么修复看起来取决于原因。

答案 2 :(得分:0)

很可能某些类持有类加载器,导致完整的应用程序在重新部署时泄漏。您可以阅读this article about classloaders