1. 程式人生 > >9.垃圾回收機制和JVM

9.垃圾回收機制和JVM

都在 可能 sys 機制 防止 情況 關閉 bject 泄露

9.垃圾回收機制和JVM

1.GC(Garbage Coolection)指垃圾回收機制。沒有提供相關api,手動回收,所有的內存分配和回收權限都在jvm中

2.System.gc():呼叫java虛擬機的垃圾回收器運行回收內存的垃圾

3.finalize()方法

  當垃圾回收器認為一個對象沒有存在意義時,會回收該對象的內存,會調用該對象的finalize()方法,釋放該對象在堆中占用的內存(繼承於Object類)

4.垃圾回收的優點和原理。並考慮2種回收機制
  Java語言中一個顯著的特點就是引入了垃圾回收機制,使c++程序員最頭疼的內存管理的問題迎刃而解,它使得Java程序員在編寫程序的時候不再需要考慮內存管理。由於有個垃圾回收機制,Java中的對象不再有"作用域"的概念,只有對象的引用才有"作用域"。垃圾回收可以有效的防止內存泄露,有效的使用可以使用的內存。垃圾回收器通常是作為一個單獨的低級別的線程運行,不可預知的情況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清楚和回收,程序員不能實時的調用垃圾回收器對某個對象或所有對象進行垃圾回收。回收機制有分代復制垃圾回收和標記垃圾回收,增量垃圾回收。

5.垃圾回收器的基本原理是什麽?垃圾回收器可以馬上回收內存嗎?有什麽辦法主動通知虛擬機進行垃圾回收
  對於GC來說,當程序員創建對象時,GC就開始監控這個對象的地址、大小以及使用情況。通常,GC采用有向圖的方式記錄和管理堆(heap)中的所有對象。通過這種方式確定哪些對象是"可達的",哪些對象是"不可達的"。當GC確定一些對象為"不可達"時,GC就有責任回收這些內存空間。程序員可以手動執行System.gc(),通知GC運行,但是Java語言規範並不保證GC一定會執行。

6.Java中的異常處理機制的簡單原理和應用
  當JAVA程序違反了JAVA的語義規則時,JAVA虛擬機就會將發生的錯誤表示為一個異常。違反語義規則包括2種情況。一種是JAVA類庫內置的語義檢查。例如數組下標越界,會引發IndexOutOfBoundsException;訪問null的對象時會引發NullPointerException。另一種情況就是JAVA允許程序員擴展這種語義檢查,程序員可以創建自己的異常,並自由選擇在何時用throw關鍵字引發異常。所有的異常都是java.lang.Thowable的子類。

7.GC 如何判斷對象失去引用 

  GC 判斷對象引用是否可達是從 Root 根目錄開始判斷的,在 JVM 中可以作為 gc root 的有:JVM 棧中對象引用(主要)、方法區中引用的對象、JNI 方法引用的對象、靜態區域中引用的對象(一般不回收)。對於多層結構的,則已遞歸的方式查找,能到達的都是不會被 GC 的對象。

8.java內存泄漏的原因有哪些

  首先造成 Java JVM 泄露的主要原因:JVM 未及時的對垃圾進行回收造成的;當對象失去引用且持續占有內存或無用對象的內存得不到及時釋放,從而造成內存 空間的浪費稱為內存泄漏。造成這種對象無法及時釋放導致內存泄露的原因,可以簡單 的為歸分兩類。

  一是基於設計方面:

    1、對應用加載數據級別判斷失誤,從而導致 JVM 內存分配不合理(企業單機部署應用常見到)。

    2、應用請求的常連接設計,常連接會一直占用後臺資源,不能及時釋放。3、數據庫操作時,存在很多耗時連接,導致大量資源不能釋放。4、 大量的監聽設計等。

  二是基於開發方面:

    1、大量靜態變量的使用(靜態變量的生成周期與應用一致),如果靜態引用指向的是集合或者數據,會一直占用資源。

    2、不合理的方法使用,比如 jdk6 之前的 substring 就可能導致內存泄露。

    3、數據庫連接未能及時關閉,剛工作不久的同學容易忽略。

    4、單例模式使用,單例通常用來加載資源信息,但如果加載信息裏有大量的集合、數組等對象,這些資源會一直駐留內存中,不易釋放。

    5、在循環中創建復雜對象、 一次性讀取加載大量信息到內存中,都有可能造成內存泄露。

9.垃圾回收機制和JVM