1. 程式人生 > 其它 >Java碼農是如何進入騰訊的

Java碼農是如何進入騰訊的

Java碼農是如何進入騰訊的

1 JVM的記憶體區域佈局

  • java程式碼的執行步驟有三點

    • java原始碼檔案->編譯器->位元組碼檔案
    • 位元組碼檔案->JVM->機器碼
    • 機器碼->系統CPU執行
  • JVM執行的位元組碼需要用類載入來載入;位元組碼檔案可以來自本地檔案,可以在網路上獲取,也可以實時生成。就是說你可以跳過寫java程式碼階段,直接生成位元組碼交由JVM執行

  • 其中Java虛擬機器棧、程式計數器、Heap、本地方法棧、Metaspace屬於JVM執行時的記憶體;按是否執行緒共享則可以分兩類

  • JAVA堆和MetasSpace元空間屬於執行緒共享的;虛擬機器棧和本地方法棧、程式計數器是執行緒私有的

2 JVM五大資料區域介紹

  • 2.1 程式計數器(Progarm Counter Register)

    • 一塊較小的記憶體空間, 是當前執行緒所執行的位元組碼的行號指示器。執行緒有一個獨屬的程式計數器,位元組碼解析工作時需要程式計數器來選取下一指令,分支、迴圈、跳轉等依賴它
    • 正在執行java方法執行緒的計數器記錄的是虛擬機器位元組碼指令的地址;如果還是Native方法,則為空
    • 程式計數器記憶體區域是唯一一個在虛擬機器中沒有規定任何OutOfMemoryError錯誤的區域
  • 2.2 虛擬機器棧(Virtual Machine Stack)

    • Java方法執行的記憶體模型:每個方法在執行的同時都會建立一個棧幀(Stack Frame)用於儲存區域性變量表、運算元棧、動態連結、方法出口等資訊
    • 每一個方法從呼叫直至執行完成的過程,就對應著一個棧幀在虛擬機器棧中入棧到出棧的過程
    • 棧幀是用來儲存資料和部分過程結果的資料結構,同時也被用來處理動態連結(Dynamic Linking)、 方法返回值和異常分派(Dispatch Exception)。棧幀隨著方法呼叫而建立,隨著方法結束而銷燬(無論方法是正常完成還是異常完成)
    • 如果執行緒請求的棧深度大於虛擬機器允許深度,則丟擲StackOverflowError;擴充套件時無法申請到足夠記憶體,則丟擲OutOfMemeryError
  • 2.3 本地方法棧(Native Method Stack)

    • 本地方法棧和虛擬機器棧作用類似,區別是虛擬機器棧為執行Java方法服務,而本地方法棧則為Native方法服務。(HopShot的實現 直接把本地方法棧和虛擬機器棧合二為一)
  • 上述3類區域,生命週期與Thread相同,即:執行緒建立時,相應的記憶體區建立,執行緒銷燬時,釋放相應記憶體

  • 2.4 堆(Heap)

    • 執行緒共享的一塊記憶體區域,幾乎所有的物件例項在這裡分配記憶體,也是垃圾收集器進行垃圾收集的最重要的記憶體區域。因此很多時候也叫GC堆
    • 執行緒私有的分配快取區(Thread Local Alloaction Buffer)也是在堆劃分出來的
    • JDK8的版本,因使用元空間代替永久代,字串常量池和類的靜態變數也放入java堆中
  • 2.5 元空間(MetaSpace)

    • 主要儲存類的元資料,比如類的各種描述資訊,類名、方法、欄位、訪問限制等,既編譯器編譯後的程式碼等資料
    • 執行時常量池:Class檔案中除了有類的版本、欄位、方法等描述等資訊外;還有一項資訊是常量池,用於存放編譯期生成的各種字面量和符號引用,這部分將在類載入後存放到元空間的執行時常量池中
  • 使用元空間代替永久代原因

    • 永久代的大小是在啟動時固定好的,很難進行調優;太大則容易導致永久代溢位;太小在執行時,容易丟擲OutOfMemeryError
    • 字串存在永久代中,使用時易出問題,由於永久代記憶體經常不夠用,爆出異常OutOfMemoryError: PermGen
  • CodeCache

    • JVM生成的native code存放的記憶體空間稱之為Code Cache;JIT編譯、JNI等都會編譯程式碼到native code,其中JIT生成的native code佔用了Code Cache的絕大部分空間
  • 直接記憶體

    • 它並不是虛擬機器執行時資料區的一般分,也不在規範定義。JDK1.4,引入了Channel(通道)與Buffer(快取區)的I/O方式,它可以使用Native函式分配堆外記憶體,可通過DirectByteBuffer操作。

3 JVM執行時記憶體佈局和JMM記憶體模型區別

  • JVM記憶體區域是指JVM執行時將記憶體資料分割槽域儲存,強調對記憶體空間的劃分
  • JAVA記憶體模型是Java語言在多執行緒併發情況下對於共享變數記憶體操作的規範:解決變數在多執行緒的可見性、原子性的問題

總結

大型分散式系統猶如一個生命,系統中各個服務猶如骨骼,其中的資料猶如血液,而Kafka猶如經絡,串聯整個系統。這份Kafka原始碼筆記通過大量的設計圖展示、程式碼分析、示例分享,把Kafka的實現脈絡展示在讀者面前,幫助讀者更好地研讀Kafka程式碼。

需要免費領取這份Kafka原始碼筆記的鐵汁們,麻煩幫忙轉發一下這篇文章+關注我,然後戳這裡免費獲取!