我已经阅读了很多关于 java 内存管理、垃圾收集等的内容,并且我正在尝试为我的有限内存(小型 ec2 实例上的 1.7g)找到最佳设置我想知道两者之间是否存在直接关联我的代码大小和 permgen 设置。根据太阳:
永久代是特殊的,因为它保存了虚拟机所需的数据来描述在 Java 语言级别上没有等价物的对象。例如,描述类和方法的对象存储在永久代中。
对我来说,这意味着它实际上是在存储我的类 def'ns 等......这是否意味着我的编译代码大小和我应该设置的 permgen 之间存在直接关联?我的整个应用程序大约 40mb,我注意到我们正在使用 256mb permgen。我在想也许我们正在使用可以更好地分配给动态代码(如对象实例等)的内存......
Sun 说permgen 是用于存储在 Java 语言中没有等价物的对象:
是的,永久代包含描述对象和方法等的“内部”JVM 数据结构。256 MB 可能相当大,但这取决于应用程序。
在像我这样运行的大型 ColdFusion 应用程序中,为即时编译的 ColdFusion 代码创建了大量类,并且我运行的永久生成设置为 192 MB。我想我以前也成功地以 128 MB 运行过它,所以这绝对是你可以尝试的东西。
如果您在调整这些 GC 参数之前和之后测量负载下的性能,您将能够了解您的更改对应用程序性能的影响。
此外,我链接的文档提供了很多关于 JVM 如何管理它的内存的信息——阅读起来非常好。
您的 Tomcat 是否配置为自动重新部署应用程序文件夹中的应用程序?你使用那个功能吗?
如果您使用该功能,PermGen 空间中使用的内存量可能会增加。这可能是由于(编写糟糕的)应用程序以某种方式保持对已加载类的引用。每次重新部署时,PermGen 空间中使用的内存量都会增加,直到溢出。
如果您不使用该功能并且始终在 Tomcat 服务器上运行相同的应用程序,那么我将尝试使用 PermGen 空间的默认设置运行 Tomcat。如果应用程序加载并运行了一段时间,那么它应该没问题。如果应用程序的 PermGen 空间用完了,那么只需逐步增加它,直到 PermGen 空间足够大。
为什么首先将其配置为 256m(如您的其他问题所示)?
顺便说一句,是的,加载的类的数量和 PermGen 区域中所需的空间量之间存在相关性。所以,是的,加载的代码越多,你需要的 PermGen 空间就越多。