我想创建一个网站,有时我得到了PermGen例外 所以我开始寻找减少创建对象数量的方法,并减少内存消耗。
我读了一些文章。但我不确定一些事情 例如,在方法(全局)之外声明列表或在方法中创建列表是否更好?在这种情况下,内存消耗方面的差异是什么?如果我将它们声明为本地,这意味着在使用它们后,垃圾收集器将收集它们,从而释放堆中的空间?
有人可以提出减少更多内存消耗和减少创建对象数量的方法(@Autowired是一种更好的方法来声明对象)吗?
答案 0 :(得分:5)
如果你得到关于PermGen的内存不足异常,那么减少对象的数量和大小很可能无济于事(因为它们会占用堆中的空间,而不是你的PermGen)
这个答案PermGen Out of Memory reasons应该有助于解决PermGen问题的原因
答案 1 :(得分:2)
全局变量和局部变量都占用相同数量的内存,不同之处在于它们超出范围并因此有资格获得gargabe。 全局变量不会超出范围,而本地变量一旦“阻塞”(例如方法或循环)就会超出范围。如果现在没有对此变量的引用,它将被垃圾收集器删除。
根据经验,总是尝试将变量放在尽可能低的范围内,这样可以在变量不再使用时释放变量。 如果可以的话,你应该尝试重用变量。
答案 2 :(得分:1)
静态或非静态数据在使用方面没有区别。它们在堆上使用相同的数量。
如果你的PermGen用完了,你需要
-XX:MaxPermSize=256m
答案 3 :(得分:0)
声明块一旦完成,就可以从垃圾收集器中收集所有局部变量。所以这是更好的内存回收方式。