静态变量的生命周期与程序一致。因此常驻内存。
public class StaticTest {
public static List<Integer> list = new ArrayList<>();
public void populateList() {
for (int i = 0; i < 10000000; i++) {
list.add((int)Math.random());
}
System.out.println(&#34;running......&#34;);
}
public static void main(String[] args) {
System.out.println(&#34;before......&#34;);
new StaticTest().populateList();
System.out.println(&#34;after......&#34;);
}
}
现在可以使用jvisualvm运行一边,看看内存效果。
定义新类时,如果没有重新equals()和hashCode()方法,也有可能会造成内存泄漏。主要原因是没有这两个方法时,很容易造成重复的数据添加。看例子:
public class User{
public String name;
public int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
}
public class EqualTest {
public static void main(String[] args) {
Map<User, Integer> map = new HashMap<>();
for(int i=0; i<100; i++) {
map.put(new User(&#34;&#34;, 1), 1);
}
System.out.println(map.size() == 1);//输出为false
}
}
然后运行一下,看看内存情况:
内存从150M一下子飙升到225M,可见飙升的厉害。输出为false,说明user对象被重复添加了。我们知道像HashMap在添加新的对象时,会对其hashcode进行比较,如果一样,那就不插入。如果一样那就插入。此时说明这100个User其hashcode不同。
现在重写这俩方法再运行一边:
public class User{
public static String name;
public User(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof User)) {
return false;
}
User user = (User) o;
return User.name.equals(name);
}
@Override
public int hashCode() {
return name.hashCode();
}
}
在EqualTest类再测试一遍,首先看看内存变化: