全局vs本地(变量和列表)按字节消耗JAVA

时间:2012-07-13 15:13:15

标签: java

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

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

有人可以提出减少更多内存消耗和减少创建对象数量的方法(@Autowired是一种更好的方法来声明对象)吗?

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

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

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

这是一篇关于scope的小文章,一篇关于java垃圾收集器works和另一种收集器use的文章。

答案 2 :(得分:1)

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

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

  1. 加载更少的课程
  2. 增加最大PermGen大小,例如-XX:MaxPermSize=256m

答案 3 :(得分:0)

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