了解java中的垃圾收集,以及如何防止滥用堆空间

时间:2014-08-12 10:48:39

标签: java garbage-collection

我不是关于GC的专家,我试图了解对象堆大小是否会对变量赋值产生影响,而不是直接将值绑定到集合中。

我在我的程序中有很多存储String对象的变量,然后将这些变量注入到Collection中,我认为之前的开发人员以这种方式编写它以便于阅读,但是在我们的数据库增长之后,垃圾收集器会抛出一个因内存不足而异常。

更清楚,这里有一个例子。 假设我有这个简单的类

class Person{
 String name;
 public Person(String name){
   this.name=name;
 }
 public String getName(){
  return name;
 }
}

现在假设我必须在一个Collection中插入1000个人名,第二个版本是否比第一个版本更友好?

//Version 1: assign to variables first, then inject to list
List<Person> persons=SomeTool.getPersons();//this fills the list with 1000 Person objcts
List<String> names=new ArrayList<String>();
for(Person person:persons){
  String name=person.getName();
  names.add(name);
 }

//Version 2, No variable assignment here, inject into the list from the method returned value directly
List<Person> persons=SomeTool.getPersons();//this fills the list with 1000 Person objcts
List<String> names=new ArrayList<String>();
for(Person person:persons){
  names.add(person.getName());
 }

1 个答案:

答案 0 :(得分:0)

问题不在于如何插入对象,问题是对象在集合中仍然在使用。

这意味着,如果您将一个人添加到集合中,他就会成为正在使用的对象。如果该人变得过时并且不再需要但保留在收集中,他仍将被使用,垃圾收集者将无法摧毁他。如果你从收集中删除了这个人,但随着他变得过时,他将被垃圾收集器收集