java一個簡單的記憶體洩漏的例子
阿新 • • 發佈:2019-02-19
想要記憶體洩漏
記憶體還存在著對於程式來說沒有用的物件 ! 這些物件是可達的(存在引用),即在有向圖中,存在通路可以與其相連;其次,這些物件是無用的,即程式以後不會再使用這些物件。如果物件滿足這兩個條件,這些物件就可以判定為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()); } }