1. 程式人生 > >java一個簡單的記憶體洩漏的例子

java一個簡單的記憶體洩漏的例子

想要記憶體洩漏

                     記憶體還存在著對於程式來說沒有用的物件 ! 這些物件是可達的(存在引用),即在有向圖中,存在通路可以與其相連;其次,這些物件是無用的,即程式以後不會再使用這些物件。如果物件滿足這兩個條件,這些物件就可以判定為Java中的記憶體洩漏,這些物件不會被GC所回收,然而它卻佔用記憶體

例:

public class Person {

	public String id;
	public String name;
	
	public Person(String id, String name) {
		super();
		this.id = id;
		this.name = name;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	
	
}
public class MemoryLeakPerson {
	
	public static void main(String[] args) {
		
		Collection<Person> list =new HashSet<Person>();
		Person p1 = new Person("1","a");
		Person p2 = new Person("2","b");
		Person p3 = new Person("3","c");
		Person p4 = new Person("4","d");
		Person p5 = new Person("5","e");
		Person p6 = new Person("6","f");
		
		list.add(p1);
		list.add(p2);
		list.add(p3);
		list.add(p4);
		list.add(p5);
		list.add(p6);
		
		    //1.要實現hashcode方法,因為更改後remove的時候,去根據hashcode尋找此物件的時候就找不到了.詳情看原始碼
                   //2.這時候刪除就會刪除不掉,就會造成記憶體洩露,列印的還是6
		p1.id="10";
		p1.name="aaa";
		list.remove(p1);
		
		System.out.println(list.size());
		
	}
}