棧溢出 :其實就是虛擬機棧內存滿了,虛擬機棧就是存方法的,一個虛擬機棧幀中有 操作數 參數列表 動態鏈接 返回值
stackoverflow情況
1、方法遞歸沒有出口,或者方法回調太長,也就是棧幀太多了,虛擬機棧存滿了。
2、定義的數組太大了,在棧中存不下
3、指針或數組越界。這種情況最常見,例如進行字符串拷貝,或處理用戶輸入等等。
OutOfMemoryError
堆溢出
看下面
******************************************************************************************************************
這就是一篇筆記。
什麼是內存泄漏,就是我們程序運行中某個已經不用了的對象,無法被我們的垃圾回收器回收掉,一直存在那裏佔內存。
靜態集合類
我們在使用集合類的時候,將它設爲靜態的 比如 static ArrayList list; //因爲類的靜態屬性是存在方法區中。
接下來分析一下,當我們使用這個集合類的使用,我們這樣 list.add(); 然後我們要是將那個對象設置爲null ,這個時候那一塊內存是不能被回收的。
長此以往,這個集合類就會出現很大一塊內存沒有數據,但是不能被回收。造成內存泄漏。
集合裏的對象屬性值被改變
public static void main(String[] args)
{
Set<Student> set = new HashSet<Student>();
Student s1 = new Student("Jack");
Student s2 = new Student("Mary");
Student s3 = new Student("Eason");
set.add(s1);
set.add(s2);
set.add(s3);
System.out.println(set.size());//3
s2.setName("Jackson"); //修改屬性,此時s2元素對應的hashcode值發生改變
set.remove(s2); // remove不掉,造成內存泄漏
set.add(s2); // 添加成功
System.out.println(set.size());//4
}
set集合使用對象student作爲元素,所以當我們去修改student裏面的數據的時候,就會造成一些找不到原來的那個元素了。並且我們也沒有辦法刪除掉那個數據。造成內存泄漏。這個好好想想。
解決辦法,重寫這個集合的equals和 hashcode方法, 這樣我們可以保證每一個對象的唯一屬性。然後每次根據這個唯一值去找到對象的那個對象。OK
監聽器
爲什麼監聽器他也會造成內存泄漏呢?
其實很簡單啊,監聽器是不是一直要在哪裏監聽,沒有爲null的情況吧,如果到了某個時候我們不想要他監聽了,那是不是就一定要我們自己去手動給他設爲null啊。沒毛病的啊。
所以當我們用完之後,一定要給他設爲null。就可以解決了。
內部類持有外部類
如果一個外部類的實例對象的方法返回了一個內部類的實例對象,這個內部類對象被長期引用了,即使那個外部類實例對象不再被使用,但由於內部類持有外部類的實例對象,這個外部類對象將不會被垃圾回收,這也會造成內存泄露。
各種連接
數據庫連接、網絡連接和IO連接等。在對數據庫進行操作的過程中,首先需要建立與數據庫的連接,當不再使用時,需要調用close方法來釋放與數據庫的連接。只有連接被關閉後,垃圾回收器纔會回收對應的對象。否則,如果在訪問數據庫的過程中,對Connection、Statement或ResultSet不顯性地關閉,將會造成大量的對象無法被回收,從而引起內存泄漏。