2.若是java虛擬機棧能夠動態拓展,而且擴展的動做已經嘗試過,可是目前沒法申請到足夠的內存去完成拓展,或者在創建新線程的時候沒有足夠的內存去建立對應的虛擬機棧,那java虛擬機將會拋出一個OutOfMemoryError異常。java
內存泄漏是指再也不被使用的對象或者變量一直被佔據在內存中。可是java中有垃圾回收機制,它可以將再也不被使用的對象,自動從內存中清除。程序員
即便這樣,java中也存在着內存泄漏的狀況:緩存
一:當長生命週期的對象持有短生命週期的對象的引用,就極可能發生內存泄漏。儘管短生命週期的對象已經再也不須要,可是長生命週期的對象一直持有它的引用致使其沒法被回收。例如,緩存系統;加載一個對象放在緩存系統中,一直不去使用這個對象,可是它一直被緩存引用,因此不會被回收致使緩存泄漏。ide
檢查java中的內存泄漏,必定要將程序各個分支狀況都完成執行至結束,而後看其是否被使用過,若是沒有才能斷定這個對象屬於內存泄漏。性能
二:當一個對象被存儲進HashSet集合中,就不可修改這個對象中用於計算哈希值的屬性了。不然,對象修改後的哈希值與剛添加進HashSet集合時的哈希值不同,此時若是將當前對象的引用做爲參數,用contains方法判斷對象是否存在,則會返回找不到對象的結果。這會致使沒法從HashSet單獨刪除當前對象,形成內存泄漏線程
垃圾回收是Java程序員瞭解最少的一部分. 他們認爲Java虛擬機接管了垃圾回收,所以不必去擔憂內存的申請,分配等問題. 可是隨着應用愈來愈複雜,垃圾回收也愈來愈複雜,一旦垃圾回收變的複雜,應用的性能將會大打折扣. 因此,Java程序員瞭解垃圾回收的機制而且知道怎樣解決「內存溢出」問題會有很大的益處. 對象
在Java中,有兩個很是廣泛的內存溢出問題. 一個是堆內存溢出,另外一個是持久代內存溢出. Java對象是java 類的實例. 每當建立一個Java對象時,Java虛擬機都會建立該對象的內部引用而且保存在堆中. 若是一個類是第一次訪問,那麼它必須經過Java虛擬機加載進來.生命週期