1. 程式人生 > 其它 >學習筆記 2021.10.26

學習筆記 2021.10.26

2021.10.20and21

JVM

執行時資料區

虛擬區棧

各種變數型別的一個簡單的比較。

類變數即是在用static修飾的變數。

更想知道的還是為什麼靜態方法中無法用this關鍵字。

這個先記到這,後面用到再詳細說

運算元棧(用陣列來實現的棧結構)

其他的一些需要注意的

最後一條即是無法通過什麼讀陣列下標之類的操作去進行資料訪問,還是隻有入棧和出棧。

通過程式碼追蹤演示有幾點想說的:

  • 運算元棧是根據方法測試已經定義好的陣列長度,即能夠實現多個變數在不同時候使用時共享空間這麼一個情況。
  • 入棧出棧後一般就緊跟著store的指令,即將資料存入區域性變量表中的對應位置,也就是前面區域性變量表有看到的資訊。
  • 帶有返回值的方法,會將返回值放在0位置,通過呼叫可以看出會第一時間load該資料放在棧底的位置用來使用。
棧頂快取技術

由於虛擬機器用的是精簡指令的,所以自然在程式碼長時會造成指令過多。因此引入快取技術。

動態連結!?

常量池:

即轉換為位元組碼檔案後,會將所有使用到的資訊化為符號存在常量池中去。常量池是存在於方法區中的結構。

符號引用就是#7之類的東西。

簡單理解就是動態連結可以指向常量池中的具體方法名稱。

這麼做的意義即是有利於多次引用,而不至於每次使用都要建立一次。並且常量池的作用就是提供一些符號和常量便於指令的識別和引用。而不至於全部都放在記憶體中去。

這裡看完了後面的方法區就相對好理解一點了。

早期繫結與晚期繫結

即就是動態連結和靜態連結差不多的意思。

這時該方法就無法知道具體是哪個物件進行的方法呼叫,所以屬於晚期繫結。

虛擬函式即是晚期繫結。

虛擬機器中的幾種方法呼叫指令:

虛方法與非虛方法和四種方法的呼叫(再說)
方法重寫的本質

建立的時候即是連結階段的第一步,可以通過前面的記錄看出來。正是因為虛方法指定不確定,所以說才會需要記錄來節省時間。

具體實現的方式就是將虛方法表中的對應方法按照重寫的規定直接指向該呼叫的類,從而不用每次呼叫時都進行判斷了。

方法返回地址的說明

即有點像微嵌課程中中斷的處理方法一樣。

概念上很好理解,最多就是位元組碼檔案上的理解。

一些附加資訊 略 用的很少
一些面試題

最後一個,執行緒安全的定義其實是對於變數能否被不同的執行緒所呼叫,這裡有個印象就可以了。

本地方法介面(其實是在執行時資料區外面的)

這裡意思即是用native關鍵字修飾的方法,都是沒有方法體的,即是沒法用java語言去實現的。

使用本地方法的原因:

具體的應用包括作業系統和sun s java等等。

該介面即是用於在java程式中呼叫本地方法的介面。

本地方法棧

與虛擬機器棧類比著來記憶。

本地方法的執行和java方法執行的區別:

首先說明由程序私有的含義即是一個程序對應著一個JVM例項即runtime物件。

堆的核心概述

最後一條的意思是,在堆中還會分出一個區域提供每個執行緒獨有的對空間用來解決共 用的問題,這一塊空間也就叫做TLAB。

第一條几乎的概念後面會具體解釋。

第三條也就可以看出,由於方法的呼叫是非常頻繁的,所以對於方法回收的執行緒和使用者執行緒的協調是非常重要的問題了。

堆記憶體的細分

邏輯上分為上面三部分,但其實實際擁有的就是前兩部分。這裡通過jvm visual看具體的堆的空間的分配就可以看出來。

對於JDK7和8之間區域劃分的區別,這裡先做一個瞭解即可。

關於堆空間大小的一些概念和設定:

一般設定的時候會把初始堆記憶體和最大對記憶體設定成相同的值,從而保證後面垃圾回收時不會出現其他的麻煩。

這些都是後面用到的話再去具體瞭解。

注意這裡會出現計算跟實際結果不同的情況,其實就是伊甸區和s區的設定問題,後面會說。

年輕代和老年代的解釋

區分的意義就在於對於那些存在週期很長的物件,就不要頻繁的去進行垃圾回收浪費時間了。

新生代與老年代所佔空間的比例也可以進行調整,具體根據實際調整需求去改即可。包括很多調引數的配置也都是這樣的。

第三條例外即是物件大到伊甸園區放不下的時候才會考慮建立在其他地方。

具體分配空間過程

概述:

  • minorGC也叫YGC。

  • 第三步的意思就是對於一開始放進伊甸區的物件,在第一次YGC判斷不是垃圾過後,放到s0區。

  • 當第二次觸發YGC的時候,不管伊甸區還是s0區中不是垃圾的物件都放到S1區去。

  • 後面的每次過程都是重複的,都是把還沒有變成垃圾的物件放到空的s區中去。

  • 每次換位置的過程都會把age的一個變數加一。

  • 空的區也叫to區,有物件的區就是from區。

  • 當age的次數達到一定的次數後,就會直接放到老年區中去。

  • 也要注意到s區滿的時候不會觸發YGC,但是他會在伊甸區滿的時候一起觸發。

  • 也有物件可能一生成就放到老年區去了。

    當然,老年區觸發GC的可能性就相對小點了。

一些特殊的情況:

其中FGC即是老年區的垃圾回收。

並且注意到報OOM時一般是在老年區?

常用調優工具!!

後面用到時再去下載和了解。都是可以用來去看記憶體空間的。