如何减少web-app中用于perm gen的内存

时间:2012-06-10 08:26:09

标签: java jsp tomcat servlets permgen

我使用tomcat7。我的网络应用包含:

  • 休眠
  • 的log4j
  • JDOM
  • 上传jar
  • mysql驱动程序
  • ...

lib的总数是30个jar文件。我的主机说:“大量的内存被分配给你的程序(对于Perm gen和堆)。请减少消耗的内存量”。

如何降低程序的内存要求?

如何减少烫发生成记忆?

请帮帮我。

1 个答案:

答案 0 :(得分:0)

您应该首先附加一个内存分析器,看看正在使用什么类型的内存以及原因。 The answers to this question列出了一堆你可以尝试的分析器。

堆是您为在Java中存储对象而分配的所有内存。每次使用“new”时,都会在堆上进行分配,并且在最后一次引用它之后的某个时间内,内存将被垃圾收集。以下是一些减少堆使用的典型事项:从内存中的解析API切换到流式解析API,可能是使用StAX或SAX而不是JDOM。只要不再需要对象,就可以通过清理finally块来修复内存泄漏或只是超过必要的对象保留。优化SQL查询,使它们只向应用程序返回完全必要的数据,可能是通过添加最大行约束或更严格的where子句。限制上传的大小并将它们传输到磁盘上的临时文件,而不是将它们保存在内存中。

Perm gen是“永久性的一代”。通常,永远不会释放perm gen中的内存,直到JVM退出。它主要用于存储加载的类。所以你可以做的任何事情来加载更少的类有帮助。以下是一些加载较少类的方法:尽量不要使用相同jar的多个版本。尝试在尽可能广泛的上下文中加载jar,更喜欢Tomcat的lib目录或WEB-INF / lib上的共享lib目录。最大限度地减少webapp的重新加载,因为每次在Tomcat中重新加载webapp时,它都不会卸载所有类的旧版本,而只是加载新版本。