jvm原理 個人理解版

2021-08-26 18:47:40 字數 1032 閱讀 8235

看了很多jvm寫的文章,網上都是一轉再轉,講的也不細,對於實際出現的問題用他們的原理來講很難講通,今天我特地自己理了一下,幫助別人的同時也提高自己,希望有不組的地方多指點

jvm研究

為什麼要研究:首先研究這個可以讓我們更加清楚jvm的工作原理,和解決實際生產中堆溢位和棧溢位的原因,同時對為什麼會產生同步問題也有了更進一步的思考

首先jvm會有乙個classload機制載入你所有的類和一些本地方法等,這個我就不再重複講,主要講下面一塊

jvm對資料的儲存

jvm對資料儲存分5大塊:

1.堆2.棧

3.方法區(方法區(主要2個):常量池,靜態成員區)

4.本地方法棧

5.程式計數器

首先,除了棧不是執行緒共享之外,其他都是執行緒共享

堆中存放的資料:

陣列和任何new 的物件(連帶著物件的成員變數是屬於每個物件的,所以也是放在堆中。例子:單例模式中,對乙個成員變數操作會有同步問題。備註:servlet的機制)。 方法中new的物件一樣存放在堆中,所以當你在乙個方法中new很多物件,一樣會出現堆溢位。

棧中存放的東西:(這裡主要講乙個執行緒的流程)準確來說棧是給執行緒執行的乙個通道,每個執行緒在啟動進入棧時,jvm都會賦予乙個棧幀給這個執行緒,棧幀中存放(中間結果集,方法中變數,物件的引用等。因為每個執行緒都有乙個棧幀,所以方法內部變數都是執行緒安全的。所說的棧是執行緒安全的也是這個原因。所以很多文章說基本型別int是放在棧中,但是我覺得這個不太準確),在賦予棧幀的之後,jvm會從棧中給這個執行緒分配棧空間,假設執行緒使用a,b,c方法,那麼執行緒就會把方法區中的方法放入棧中,然後通過棧幀來進行結果集的計算。所以當你的遞迴方法很多不能及時釋放棧空間,就會有棧溢位。

本地方法:(static和final 修飾符的存放地方)

常量池:存放final的常量

靜態成員區:存放類的成員變數(由於方法區是多執行緒共享,所以靜態成員變數是具有同步問題的)

其他:存放方法的資訊,比如方法名,方法返回值等等

程式計數器,本地方發棧,乙個是執行緒的執行過程,乙個是jvm自身的方法存放位置

Tomcat設計原理個人學習理解

在看how tomcat works,收穫頗深,結合最近看的 和個人理解寫些個人心得 1 tomcat對每個request的管理 在org.apache.catalina.connector.http包下,有個httpconnector聯結器類。它的工作過程是,先開啟socketserver埠,設定...

vue的vuex儲存原理個人理解

第一步 先說下為什麼會 new store 它是怎麼來的 我們先來看段element ui裡面的table 原始碼,裡面會出現乙個小型封裝的vuex 這裡只放 片段,嘿嘿,便於理解 這段在watcher.js export default vue.extend 不可響應的 filtereddata ...

Lucene原理個人總結

傳統資料庫無法滿足的痛點 在mysql中,我們根據關鍵字去搜尋一般都是like 但是這樣搜尋的效能是很低的,因為沒有走索引。相關性搜尋,電商 中的根據瀏覽記錄做的商品推薦,在海量資料下直接查詢資料庫也是無法做到快速反應 倒排索引 類似這樣的資料結構,它是把值作為索引,比如說搜尋 我 的時候,在字典樹...