2013-05-25 19 views
0
我有在部署在WebSphere应用程序内存溢出问题

的7每个部署数量增加加载的类

我使用yourKit,试图解决它发生的事情,一个有趣的事情,我可以看到的是,当我第一次启动我的应用程序时,它会加载大约20k个类,并且每次我进行另一次部署时(不重新启动websphere),此数字将增加2k,并且堆大小随之增加。

我猜这是根本问题,但我不知道如何解释为什么发生这种情况。

我试图列出所有的类之前一个部署和一个又一个,但这没有工作得很好,因为我无法列出所有20k类(只有10k不知道为什么)。当我比较这两个列表时,我发现了大约600个新的类,它们确实来自我的应用程序或来自我的应用程序的依赖关系。

我发现我的大部分应用程序类都是枚举类和DAO类的实现。

我的应用程序是一个使用Struts和Spring框架的Java EE 6应用程序。

有什么想法?

+0

类加载器泄漏的乐趣! http://frankkieviet.blogspot.com/2006/10/classloader-leaks-dreaded-permgen-space.html – DannyMo

+0

@damo websphere 7很有趣:) – WeMakeSoftware

+0

请注意,您的问题描述存在不一致,因为您是谈论Java EE 6应用程序,但WebSphere 7是一个Java EE 5应用程序服务器。 –

回答

1

OutOfMemoryError可能在JVM的堆空间或permGen空间已满时导致。

如果您遇到的问题是由重新部署应用程序引起的,则可能是您正在访问PermGen OOME。当应用程序服务器无法从其内存中完全卸载类的定义(内存泄漏)时,会发生这些情况。

这种情况很普遍(至少从我的经验来看),通常开发人员只是增加应用程序服务器的PermGen大小或者仅仅反弹应用程序服务器来清理PermGen。

+0

PermGen是一个适用于Sun/Oracle JVM的概念。在IBM JVM上,情况略有不同。 Class对象只是堆中的对象,并不属于不同的世代。代码被加载到一个单独的内存区域,其大小不受限制。 –

0

这是一个典型的类加载器泄漏。这可能是由您的应用程序或运行时中的错误(即WebSphere或JRE)造成的。请注意,WAS 7中有很多这种功能,特别是在较早的修订包中。

你可能想咨询以下文件得到一些更深入地了解这个问题:

https://code.google.com/p/arit/wiki/GettingStarted