運行時常量池(JDK1.7被移出)
存放對象實例或數組
、新生代和老年代
線程私有
、棧
線程私有
、Native
線程私有
、行號指示器
、無OOM
字節碼解釋器工做時就是經過改變程序計數器的值來選取下一條須要執行的字節碼指令。java
選擇哪一種分配方式由Java堆是否規整決定,而Java堆是否規整又由所採用的垃圾收集器是否帶有壓縮整理功能決定。數組
使用句柄 -> 句柄池安全
直接指針微信
由於程序計數器中存儲的數據所佔空間的大小不會隨着程序的執行而發生改變。多線程
JDK1.6在常量池建立與此String內容相同的字符串;常量池 建立字符串
->返回引用
JDK1.7在常量池中記錄Heap中首次出現的引用,並返回該引用。常量池 記錄引用
->返回引用
app
String str1 = new StringBuilder("計算機").append("軟件").toString(); System.out.println((str1.intern() == str1)); //JDK1.6:false //JDK1.7:true
CAS(Compare And Swap 比較交換),是無鎖執行者,能夠用來保證線程執行的安全性。核心思想以下:函數
執行函數:CAS(V,E,N)
其包含3個參數佈局
若是V值等於E值,則將V的值設爲N。若V值和E值不一樣,則說明已經有其餘線程作了更新,此時當前線程不執行更新操做,但能夠選擇從新讀取該變量再嘗試再次修改該變量,也能夠放棄操做。ui
CAS是一條CPU的原子指令,完成某個功能的一個過程的原語的執行必須是連續的,不會形成所謂的數據不一致問題。spa
1 字節 = 1 byte = 8 bit
將堆的最小值-Xms參數與最大值-Xmx參數設置爲同樣便可避免堆自動擴展。
java.lang.OutOfMemoryError: Java heap space
堆內存溢出(最多見的),能夠Dump堆轉儲快照信息查看具體問題。
java.lang.StackOverflowError
虛擬機棧內存溢出 - 超出當前方法棧深度
java.lang.OutOfMemoryError: unable to create new native thread
多線程致使內存溢出,可經過「減小最大堆」和「減小棧容量」來換取更多的線程。
java.lang.OutOfMemoryError: PermGen space
出現這個異常說明運行時常量池屬於方法區的一部分,能夠手動設置MaxPermSize大小修改。 jdk1.7已經將常量池從方法區移出,jdk1.8徹底刪除永久代,全部jdk1.8不會出現此OOM。
java.lang.OutOfMemoryError
由DirectMemory(本機直接內存)致使的OOM,沒有明顯的異常說明,由於這裏的內存不足時它自己計算出來,並手動拋出異常。
-XX:+HeapDumpOnOutOfMemoryError
可讓虛擬機在出現OOM時Dump出當前的內存堆轉儲快照以便過後進行分析
-Server -XX:+DoEscapeAnalysis
開啓逃逸分析,直接棧上分配
-XX:MaxDirectMemorySize
指定本機直接內存容量,默認爲java堆最大值-Xmx
https://my.oschina.net/gmarshal
歡迎關注個人我的微信訂閱號:(聽說這個頭像程序猿專用)