JVM是Java Virtual Machine(Java虛擬機)的縮寫,它是整個java實現跨平臺的最核心的部分,全部的Java程序會首先被編譯爲.class的類文件,這種類文件能夠在虛擬機上執行,也就是說class並不直接與機器的操做系統相對應,而是通過虛擬機間接與操做系統交互,由虛擬機將程序解釋給本地系統執行。JVM是Java平臺的基礎,和實際的機器同樣,它也有本身的指令集,而且在運行時操做不一樣的內存區域。JVM經過抽象操做系統和CPU結構,提供了一種與平臺無關的代碼執行方法,即與特殊的實現方法、主機硬件、主機操做系統無關。JVM的主要工做是解釋本身的指令集(即字節碼)到CPU的指令集或對應的系統調用,保護用戶免被惡意程序騷擾。JVM對上層的Java源文件是不關心的,它關注的只是由源文件生成的類文件(.class文件)。java
1) 內存泄漏是指分配出去的內存沒法回收了。數據庫
2) 內存溢出是指程序要求的內存,超出了系統所能分配的範圍,從而發生溢出。好比用byte類型的變量存儲10000這個數據,就屬於內存溢出。網絡
3) 內存溢出是提供的內存不夠;內存泄漏是沒法再提供內存資源。操作系統
1) 靜態集合類:在使用Set、Vector、HashMap等集合類的時候須要特別注意,有可能會發生內存泄漏。當這些集合被定義成靜態的時候,因爲它們的生命週期跟應用程序同樣長,這時候,就有可能會發生內存泄漏。設計
2) 監聽器:在Java中,咱們常常會使用到監聽器,如對某個控件添加單擊監聽器addOnClickListener(),但每每釋放對象的時候會忘記刪除監聽器,這就有可能形成內存泄漏。好的方法就是,在釋放對象的時候,應該記住釋放全部監聽器,這就能避免了由於監聽器而致使的內存泄漏。對象
3) 各類鏈接:Java中的鏈接包括數據庫鏈接、網絡鏈接和io鏈接,若是沒有顯式調用其close()方法,是不會自動關閉的,這些鏈接就不能被GC回收而致使內存泄漏。通常狀況下,在try代碼塊裏建立鏈接,在finally裏釋放鏈接,就可以避免此類內存泄漏。生命週期
4) 外部模塊的引用:調用外部模塊的時候,也應該注意防止內存泄漏。如模塊A調用了外部模塊B的一個方法,如:public void register(Object o)。這個方法有可能就使得A模塊持有傳入對象的引用,這時候須要查看B模塊是否提供了去除引用的方法,如unregister()。這種狀況容易忽略,並且發生了內存泄漏的話,比較難察覺,應該在編寫代碼過程當中就應該注意此類問題。內存
5) 單例模式:使用單例模式的時候也有可能致使內存泄漏。由於單例對象初始化後將在JVM的整個生命週期內存在,若是它持有一個外部對象(生命週期比較短)的引用,那麼這個外部對象就不能被回收,而致使內存泄漏。若是這個外部對象還持有其它對象的引用,那麼內存泄漏會更嚴重,所以須要特別注意此類狀況。這種狀況就須要考慮下單例模式的設計會不會有問題,應該怎樣保證不會產生內存泄漏問題。(來自 尚學堂)資源