2

我试图创建一个网站,有时我得到了 PermGen 异常。
所以我开始寻找减少创建对象数量并减少内存消耗的方法。

我读了一些文章。但我不确定有些事情。
例如,是在方法之外(全局)声明列表,还是在方法内创建列表更好?在这种情况下,内存消耗有什么区别?如果我将它们声明为本地,这意味着在使用它们之后,垃圾收集器将收集它们,从而释放堆上的空间?

任何人都可以提出减少更多内存消耗和减少创建对象数量的方法(@Autowired 是在对象上声明的更好方法)吗?

4

4 回答 4

5

如果您收到有关 PermGen 的内存不足异常,那么减少对象的数量和大小很可能无济于事(因为它们将占用堆中的空间,而不是您的 PermGen)

这个答案PermGen Out of Memory 原因应该有助于解决 PermGen 问题的原因

于 2012-07-13T15:36:43.287 回答
3

全局变量和局部变量都占用相同数量的内存,不同之处在于它们超出范围并因此有资格进行 gargabe 收集。全局变量不会超出范围,而本地变量会在“块”(例如方法或循环)完成后立即超出范围。如果现在没有对该变量的引用,它将被垃圾收集器删除。

根据经验,总是尝试将变量放在尽可能低的范围内,这将在变量不再使用时释放它们。如果可以的话,你也应该尝试重用变量。

这是一篇关于范围的小文章,一篇关于 java 垃圾收集器的工作原理和另一篇关于使用哪种收集器的文章。

于 2012-07-13T15:32:19.177 回答
1

静态数据和非静态数据在使用方面没有区别。他们在堆上使用相同的数量。

如果你的 PermGen 用完了,你要么需要

  1. 加载更少的类
  2. 增加最大 PermGen 大小,例如-XX:MaxPermSize=256m
于 2012-07-13T15:27:19.187 回答
0

一旦声明块完成,所有局部变量都可以从垃圾收集器中收集。所以这是更好的内存回收方式。

于 2012-07-13T15:32:43.087 回答