我用tomcat7。我的网络应用程序包含:
- 休眠
- 日志4j
- jdom
- 上传jar
- mysql驱动
- ...
lib的总数是30个jar文件。我的主持人说:“为您的程序分配了很多内存(用于 Perm gen 和堆)。请减少消耗的内存量”。
如何减少程序的内存需求?
如何减少 perm gen 内存?
请帮我。
您可能应该首先附加一个内存分析器并查看正在使用的内存类型以及原因。这个问题的答案列出了一堆你可以尝试的分析器。
堆是您分配用于在 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 时,它不会卸载所有类的旧版本,而只是加载新版本。