1.StringBuilder盗似、String酱塔、StringBuffer
buffer: 緩沖? ? ? ? ?append? :附加 增補
String類是不可變類沥邻,任何對String的改變都 會引發(fā)新的String對象的生成
StringBuffer則是可變類,任何對它所指代的字符串的改變都不會產(chǎn)生新的對象羊娃。
StringBuffer和StringBuilder類的區(qū)別也是如此唐全,他們的原理和操作基本相同,區(qū)別在于StringBufferd支持并發(fā)操作蕊玷,線性安全的邮利,適 合多線程中使用。StringBuilder不支持并發(fā)操作垃帅,線性不安全的延届,不適合多線程中使用。新引入的StringBuilder類不是線程安全的贸诚,但其在單線程中的性能比StringBuffer高方庭。
StringBuilder的操作速度很快,在單線程情況下使用很好酱固。
2.java虛擬機及其內(nèi)部結(jié)構(gòu)
????????Java語言的一個非常重要的特點就是與平臺的無關(guān)性二鳄。而使用Java虛擬機是實現(xiàn)這一特點的關(guān)鍵。一般的高級語言如果要在不同的平臺上運行媒怯,至少需要編譯成不同的目標代碼。而引入Java語言虛擬機后髓窜,Java語言在不同平臺上運行時不需要重新編譯扇苞。Java語言使用模式Java虛擬機屏蔽了與具體平臺相關(guān)的信息欺殿,使得Java語言編譯程序只需生成在Java虛擬機上運行的目標代碼(字節(jié)碼,16進制)鳖敷,就可以在多種平臺上不加修改地運行脖苏。Java虛擬機在執(zhí)行字節(jié)碼時,把字節(jié)碼解釋成具體平臺上的機器指令執(zhí)行定踱。
JAVA虛擬機運行時數(shù)據(jù)區(qū):
棧:
存儲局部變量的地方棍潘。每個線程都會分到一部分棧的空間。
? ? ? ?棧幀:每個線程占用的一個空間崖媚,因為多個線程占用多個空間亦歉,每片空間就叫一個棧幀。
每個棧幀中都包含以下四個部分:
? ? ? ? 1.方法出口畅哑,即執(zhí)行完當(dāng)前線程后肴楷,回到main線程或者其他線程。
? ? ? ? 2.操作數(shù)棧:存儲數(shù)據(jù)
? ? ? ? 3.局部變量表:給數(shù)據(jù)分配的存儲空間
? ? ? ? 4:動態(tài)鏈表
程序計數(shù)器:
目的是為了記錄當(dāng)前線程的程序運行到的位置荠呐。該線程被中斷后赛蔫,記錄下程序執(zhí)行到的位置。再恢復(fù)時繼續(xù)在這里執(zhí)行就行泥张。
堆:
堆中存儲的是對象呵恢。分為老年代和年輕代,老年代存儲空間占了總的2/3媚创。
? gc :garbage collect 垃圾收集?
堆中的垃圾對象:
所存在的線程結(jié)束了渗钉,其數(shù)據(jù)也都銷毀了,其指針也都銷毀了筝野。沒用了晌姚,留在堆浪費內(nèi)存。
系統(tǒng)如何判斷垃圾對象(minor gc)歇竟?
答:可使用可達性算法挥唠,從GC root根(對象)出發(fā),尋找它的引用焕议。當(dāng)gc root根沒了宝磨,或者說是,原來被引用的東西盅安,現(xiàn)在沒人使用他們了唤锉,他們就變成了垃圾對象。
對象每經(jīng)歷一次minor gc别瞭,即逃過以此垃圾清理窿祥,GC 分代年齡就加1.
從上圖可以看出,一個對象蝙寨,即objiect包含的不僅僅時在java代碼表面上看起來那么簡單晒衩,除了能見到的數(shù)據(jù)和方法之外嗤瞎。還有Klass Pointer(指明時哪個類的對象)、GC分代年齡等等關(guān)鍵信息听系。
方法區(qū):
方法區(qū)存放的主要是Class贝奇,而堆存放的主要是實例化對象。棧中存放的是對象的引用reference靠胜。
Java本地方法
圖中的本地方法棧的作用:
本地方法就是方法名前有native標記浪漠。意義是通過該java語句去調(diào)用c語言的方法陕习。本地方法棧就是存儲本地方法的信息的。java創(chuàng)建線程時就需要調(diào)用本地方法郑藏,用c語言去創(chuàng)建操作系統(tǒng)線程衡查。