我正在开发一个基于Struts的基本应用程序,它在内存中遇到了重大的峰值。我们有一个监视工具,它会注意到每个用户有一个请求,向JVM堆内存添加3MB。有没有提示鼓励早期垃圾收集,释放内存或提高性能?
应用程序是一个基本的Struts应用程序,但JSP报告中有很多行,因此可能会创建很多对象。但这不是你以前没见过的东西。
注意:
1.表单在会话范围内,可能是数组的数据列表(可能这是一个问题)
2. POJO bean包含20个左右的字段,混合了String
或BigDecimal
个数据。
报告可以有300到1200个左右的行。所以至少创建了很多对象。
答案 0 :(得分:2)
根据您提供的信息,我估计您通常会为结果加载1到2兆字节的数据:750行* 20个字段*每个字段100个字节= 1.4 Mb。现在考虑数据库和最终标记之间所需的所有临时对象。 3 Mb并不奇怪。
我只关心那个记忆是否已经泄露;也就是说,年轻代空间的下一个垃圾收集不会收集所有这些对象。
答案 1 :(得分:0)
在设计要在Web应用程序中呈现的报表时,请考虑从数据库中提取的记录数。
如果记录数量很高且整个记录集占用大量内存,请考虑使用报告分页。
尽可能明确地调用垃圾收集器。这是因为两个原因:
垃圾收集是一个昂贵的过程 因为它会扫描整个内存。
大多数生产服务器都会 调整在JVM级别以避免 明确的garabage集合
答案 2 :(得分:0)
我认为问题是ActionForm中的arraylist需要分配大量的内存空间。我会将查询结果直接写入响应:从结果集中读取行,写入响应,读取下一行,写入等等。也许它不是MVC但对你的堆更好: - )
ActionForms适用于CRUD操作,但对于报告......我不这么认为。
注意:如果ActionForm具有scope = session,则实例将处于活动状态(以及巨大的arraylist),直到会话到期。如果scope = request,则实例将可用于GC。