Java 每次部署都会增加加载的类的数量

Java 每次部署都会增加加载的类的数量,java,out-of-memory,websphere-7,Java,Out Of Memory,Websphere 7,我在部署在WebSphere7中的应用程序中遇到outOfmemory问题 我正在使用yourKit尝试了解发生了什么,我可以看到的一件有趣的事情是,当我第一次启动我的应用程序时,它加载了大约20k个类,每次我进行另一次部署(不重新启动websphere),这个数字都会增加2k,堆大小也随之增加 我猜这是根本问题,但我不知道如何解释为什么会发生这种情况 我试着在一个部署之前和一个部署之后列出所有类,但效果不太好,因为我无法列出所有20k类(只有10k个不知道为什么)。当我比较这两个列表时,我发现

我在部署在WebSphere7中的应用程序中遇到outOfmemory问题

我正在使用yourKit尝试了解发生了什么,我可以看到的一件有趣的事情是,当我第一次启动我的应用程序时,它加载了大约20k个类,每次我进行另一次部署(不重新启动websphere),这个数字都会增加2k,堆大小也随之增加

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

我试着在一个部署之前和一个部署之后列出所有类,但效果不太好,因为我无法列出所有20k类(只有10k个不知道为什么)。当我比较这两个列表时,我发现大约600个新类确实来自我的应用程序或我的应用程序的依赖项

我发现我的大多数应用程序类都是枚举和DAO类的实现

我的应用程序是一个使用Struts和Spring框架的JavaEE6应用程序


有什么想法吗?

当JVM的堆空间或permGen空间已满时,可能会导致OutOfMemoryError

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


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

这是典型的类加载器泄漏。这可能是由您的应用程序或运行时(即WebSphere或JRE)中的错误引起的。请注意,在WAS7中有很多,尤其是在较旧的补丁包中

您可能希望查阅以下文档,以进一步了解该问题:


类加载器泄漏很有趣@damo websphere 7非常有趣:)请注意,您的问题描述中存在不一致之处,因为您正在谈论Java EE 6应用程序,但websphere 7是Java EE 5应用程序服务器。PermGen是一个适用于Sun/Oracle JVM的概念。在IBMJVM上,情况略有不同。类对象只是堆上的对象,不属于不同的一代。代码被加载到一个单独的内存区域,其大小不受限制。