我不是关于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());
}
答案 0 :(得分:0)
问题不在于如何插入对象,问题是对象在集合中仍然在使用。
这意味着,如果您将一个人添加到集合中,他就会成为正在使用的对象。如果该人变得过时并且不再需要但保留在收集中,他仍将被使用,垃圾收集者将无法摧毁他。如果你从收集中删除了这个人,但随着他变得过时,他将被垃圾收集器收集