java內存溢出場景

棧溢出   :其實就是虛擬機棧內存滿了,虛擬機棧就是存方法的,一個虛擬機棧幀中有 操作數 參數列表 動態鏈接 返回值

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不顯性地關閉,將會造成大量的對象無法被回收,從而引起內存泄漏。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章