【问题标题】:How can I reduce the memory used for perm gen in web-app如何减少 web-app 中用于 perm gen 的内存
【发布时间】:2012-06-10 08:26:08
【问题描述】:

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

  • 休眠
  • log4j
  • jdom
  • 上传jar
  • mysql 驱动
  • ...

lib 总数为 30 个 jar 文件。我的主机说:“为您的程序分配了很多内存(用于 Perm gen 和堆)。请减少消耗的内存量”。

如何减少程序的内存需求?

如何减少 perm gen 内存?

请帮帮我。

【问题讨论】:

  • 一件事 - 你的主机不清楚是你的堆还是你的 perm-gen(或两者)是问题所在。在您按照 John Watts 的建议完成内存分析器之前,不要假设 perm-gen 肯定有问题。
  • 只是好奇。 “很多”是多少内存?
  • 我不知道主机,但在本地主机中已更改堆大小(10mb 到 29mb)和 perm gen(10mb 到 20mb)和类(2000 到 4500)。我使用了 java VisualVM 分析器。

标签: java jsp tomcat servlets permgen


【解决方案1】:

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

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

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

【讨论】:

  • 我修复了内存泄漏,优化了 SQL 查询,上传大小为 512kb。您的意思是“您可以加载更少的类”。我该怎么做才能加载更少的课程?删除我的课程! .如何附加内存分析器?
  • 该注释后面的句子是加载更少类的方法。我编辑了答案以使其更清楚。 “如何附加分析器?”是一个单独的问题,每个分析器的答案都不同。我建议先选择一个分析器。如果您不知道该选择哪一个,我会尝试任何一个免费的或有免费演示的。 YourKit 有 15 天的试用期。
  • 谢谢。我目前使用 jVisualVM(Java\jdk1.6.0_21\bin) 。我下载了你的工具包。
猜你喜欢
  • 2013-05-15
  • 1970-01-01
  • 2021-04-21
  • 2016-09-10
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
  • 2017-09-28
相关资源
最近更新 更多