日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《深入理解JVM虚拟机》读书笔记(一)

發(fā)布時間:2023/12/10 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《深入理解JVM虚拟机》读书笔记(一) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

此書一共分為5個部分:

  • 走近Java
  • 自動內(nèi)存管理機(jī)制
  • 虛擬機(jī)執(zhí)行子系統(tǒng)
  • 程序編譯與代碼優(yōu)化
  • 高效并發(fā)
  • 這里,我直接跳過第一部分的內(nèi)容,開始第二部分的內(nèi)容。此部分包括:

    • Java內(nèi)存區(qū)域與內(nèi)存溢出異常
    • 垃圾收集器與內(nèi)存分配策略
    • 虛擬機(jī)性能監(jiān)控與故障處理工具
    • 調(diào)優(yōu)案例分析與實戰(zhàn)

    開記!!!

    首先引用原書中的一句話,“Java與C++之間有一堵由內(nèi)存動態(tài)分配和垃圾收集技術(shù)所圍成的“高墻”, 墻外面的人想進(jìn)去, 墻里面的人卻想出來。

    一. 運(yùn)行時數(shù)據(jù)區(qū)域

    Java虛擬機(jī)在執(zhí)行Java程序的過程中會把它所管理的內(nèi)存劃分為若干個不同的數(shù)據(jù)區(qū)域。

    程序計數(shù)器:一塊很小的內(nèi)存區(qū)域,用來記錄程序下一條字節(jié)碼指令的地址,如果線程正在執(zhí)行的是一個Java方法,這個程序計數(shù)器記錄的是正在執(zhí)行的虛擬機(jī)字節(jié)碼指令地址;如果正在執(zhí)行的是一個Native方法,這個計數(shù)器的值則為空。

    此區(qū)域是Java虛擬機(jī)規(guī)范中沒有規(guī)定任何OutofMemoryError情況的區(qū)域。


    虛擬機(jī)棧:線程私有,生命周期與線程相同,這個區(qū)域描述的是Java方法執(zhí)行的內(nèi)存模型:每個方法在執(zhí)行的時候都會創(chuàng)建一個棧幀(Stack Frame)用于存儲局部變量表,操作數(shù)棧,動態(tài)鏈接,方法出口等信息。
    在虛擬機(jī)規(guī)范中,這個區(qū)域規(guī)定了2種異常:一是線程請求的棧深度大于虛擬機(jī)所允許的深度將拋出StackOverflowError異常;如果虛擬機(jī)棧可以動態(tài)擴(kuò)展,如果申請到足夠的內(nèi)存,就會拋出OutOfMemoryError異常。


    本地方法棧:與虛擬機(jī)棧類型,只不過本地方法棧是調(diào)用本地的Native方法,與虛擬機(jī)棧一樣會拋出StackOverflowError及OutOfMemoryError異常。


    Java堆:所有對象實例及數(shù)組都要在堆上分配(Java虛擬機(jī)規(guī)范描述),但是隨著JIT編譯器的發(fā)展與逃逸分析技術(shù)逐漸成熟,棧上分配,標(biāo)量替換優(yōu)化技術(shù)將會導(dǎo)致一些微妙的變化。
    Java堆可以分為新生代和老年代;再細(xì)致一點(diǎn)新生代分為Eden空間,From Survivors空間,To Survivors空間。進(jìn)一步劃分是為了更好的回收內(nèi)存,跟回收算法有關(guān)系。
    虛擬機(jī)規(guī)范中規(guī)定,Java堆可以處于物理上不連續(xù)的內(nèi)存空間中,只要邏輯上是連續(xù)的即可。會發(fā)生OutOfMemoryError異常。


    方法區(qū):跟Java堆一樣是線程共享的內(nèi)存區(qū)域,它用于存儲已被虛擬機(jī)加載的類信息,常量,靜態(tài)變量,即時編譯器編譯后的代碼等數(shù)據(jù)。虛擬機(jī)規(guī)范把這個區(qū)域描述為堆的一個邏輯部分,但它有一個別名叫非堆(Non-Heap),會發(fā)生OutOfMemoryError異常。


    運(yùn)行時常量池:是方法區(qū)的一部分,用來存儲各種字面量及符號引用,這部分內(nèi)容將在類加載后進(jìn)入方法區(qū)的運(yùn)行時常量池中存放。
    常量池具有動態(tài)性,運(yùn)行期間也可能將新的常量放入池中,這種特性用的比較多的是String的intern()方法。會發(fā)生OutOfMemoryError異常。


    直接內(nèi)存:并不是虛擬機(jī)運(yùn)行時數(shù)據(jù)區(qū)的一部分,也不是Java虛擬機(jī)規(guī)范中定義的內(nèi)存區(qū)域,但這部分也被頻繁的使用,最典型的應(yīng)用便是JDK1.4新增的NIO通過DirectByteBuffer對象來操作這部分內(nèi)存,這樣避免了Java堆跟Native堆中數(shù)據(jù)來回復(fù)制數(shù)據(jù)的開銷。


    二. HotSpot虛擬機(jī)對象探秘

    Java對象的創(chuàng)建過程:只提供一個圖,細(xì)節(jié)太多。


    Java對象的內(nèi)存分布:

    三個區(qū)域--對象頭Header,實例數(shù)據(jù)Instance Data,對齊數(shù)據(jù)Padding

    其中對象頭分為2個部分,分別是Mark word與類型指針(指向它的類元數(shù)據(jù))


    總結(jié)

    以上是生活随笔為你收集整理的《深入理解JVM虚拟机》读书笔记(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。