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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jvm结构

發布時間:2024/4/13 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jvm结构 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
優化是一個體系,不是一個點,特別是JVM的優化比SQL的優化還要復雜,它的顆粒度更細,比如你對垃圾回收器的選擇,比如對存儲結構區域的劃分.而且不同的情況所優化的方式不一樣,包括像我們數據庫優化,數據庫優化可以更換引擎,根據對表操作的不同,如果表查詢特別多,在設計表的時候這個表就是用來做查詢的,換成MYISAM的引擎查詢效率要比InnoDB要高的.其實虛擬機是分為兩個結構的,一個是client結構,一個是server結構,這是我們從來都不知道的.1. JVM結構2. JVM垃圾回收算法及收集器3. JVM優化4. Eclipse運行調優前面兩個是JVM的原理,第三個是JVM調優的工具,第四個是一個小實戰.還記得我們裝完JDK以后配置環境變量,我們會在命令行窗口執行 java 或者 java -version這個步驟就猶如我們打開電腦連接網絡以后想判斷它是否連接成功,打開瀏覽器輸入www.baidu.com一樣

以往我們只關注下面,只要不報既不是內部也不是外部命令可執行文件,或者看到這樣的結果就完事了,立馬把窗口關掉,但是我們有沒有認真的觀察這三行代碼里面到底涵蓋了什么,我們還是要從這里分析.它會給你輸出三行結果:第一行: java version 1.8.0_151 說明你當前JDK的版本是1.8的 這副版本是151然后再往下 Java<TM> SE Runtime Environment <build 1.8.0_151> 這是顯示開發環境的一些信息.Java HotSpot<TM> 64-Bit Server VM <build 25.151-b12, mixed mode> 這里我會看到兩個比較關鍵的詞語,一個是HotSpot,一個是Server, HotSpot是JVM的一個核心組件,或者叫JVM的名稱,JDK每次版本再更新的時候,都會側重的去優化一個問題,進一步的去優化JVM的運行效率,運行效率指的是什么呢?對class文件的解析或者是編譯,在JDK1.3之前的版本,這是在JDK1.3以后理論提出來的,JDK1.3之前的版本的核心不是HotSpot,那它會采取一個什么樣的策略來讀取字節碼文件呢,當你運行一個class的時候,classloader將類加載到內存虛擬機當中,但它加載進來的是class文件,class文件是一個中間層文件,它并不是一個CPU能夠直接解釋的這樣一個文件虛擬機需要把class文件編譯成本地代碼,本地代碼就是CPU能夠直接處理的文件,所以每次我們加載進來的class,JVM都會做一個本地代碼的轉換,每次來都轉換,轉換的越多,就表示消耗的性能就越大,那么在JDK1.3這個版本之后,其實SUN公司已經發現了這個問題,后來就引入HotSpot核心技術的VM,它也是一個虛擬機,但是HotSpot的VM并不是SUN公司去寫的,而是SUN公司收購的另一家公司的,因為在這個VM里面,它有很多比較先進的理念,熱點探測, HotSpot就是一個熱點探測,你每次虛擬機要加載class文件,我會對你加載的class文件做標記,標記的過程當中如果達到一定的閥值,它會對頻繁使用的class文件直接編譯成本地代碼緩存起來了,不再讓你頻繁的編譯了,有點像緩存,跟它的原理上差不多,也就是說它會把它的結果集放在緩存里,以便你下次再來的時候不需要再查數據庫了,它也是,會把本地代碼會緩存起來,下次再來的時候可以去掉編譯的環節,HotSpot的特點當然還有其他的特點,那些可能對于我們來說就不太關注,HotSpot在JDK1.3的時候就準備要往里放了,任何一個技術在商業化之前它都要經過嚴格的測試,所以在JDK1.3并沒有把HotSpot放在里面,而是在JDK1.5的那個版本才真正的把HotSpot的技術嵌入到或者說徹底商業化了.從JDK1.5以后的都是HotSpot的核心, Client是客戶端, JVM虛擬機在啟動時它給我們準備了兩個版本,一個是client,一個是server,但是其實他們不是兩套虛擬機,是一個虛擬機,是采用了兩套不同的機制來初始化,client更多的是做桌面型的應用而提供的一個虛擬機,也就是說應用于桌面級應用的虛擬機,對內存空間分配做的優化,我們都知道JAVA語言都可以寫C/S結構的東西,client的最大特點是什么呢?桌面型的操作系統, JVM處理的代碼量并不會很大,一個桌面系統打開以后,你的按鈕一次只能觸發一個,你能同時觸發兩個按鈕嗎?程序和JVM交互的頻率相對于B/S結構來講,它的頻率會低很多,雙十一瞬間會有好大的請求量,我們的代碼要嵌入虛擬機里面運行,虛擬機要處理的線程數是不是要多一些,但是桌面級操作系統,一次只能點一個按鈕,相比于B/S結構,讓JVM去處理的線程數,肯定要少很多,所以為了更合理的使用內存,在client版本當中,它把內存分配的空間,相比server端要少了,比如說,它把堆里的內存就分了10幾M,或者100多M,他覺得十幾兆一百多兆足夠用了,在十幾兆和一百多兆的區域內,我所耗的時間就是0.00幾秒,完全夠用,但是如果是server端,那分配的空間就可能更大,那么JVM啟用的都是客戶端,那我們能不能把它改成server端,可以的,怎么改呢?

-client和-server誰在上就以誰啟動,由上至下來看,我們也可以手動將它的位置來做一些改變,它修改需要管理員的權限

虛擬機默認的,不管是client端還是server端,默認的已經可以很好的適應了常見的JAVA的運行了.除非你的項目的體系比較強大,你才需要對它進行進一步的優化,把client改成server版本,server端這么好,為什么不默認的使用server端,因為server版本的比client版本申請的空間要大,比較浪費空間,所以在當時那個年代內存比較緊張的時候,不是占內存越大越好,所以給你一個選擇性,現在這兩個問題已經解決了.這是JVM的一個開始,接下來我們來看JVM的結構:我們要向理解虛擬機,首先還是得理解結構.JVM結構第一部分JVM的總體結構:

這個其實劃分的顆粒度也不是很細,但是這個顆粒度已經足夠我們認識了,JVM在運行過程當中,會分配這么幾個區域,第一個類加載子系統,第二個方法區,第三個JAVA堆,第四塊直接內存,第五塊垃圾回收器,第六塊執行引擎,這每一塊都代表什么意思呢?1. 類加載子系統和方法區: 類加載子系統負責從文件或者網絡中加載class文件,也就是說classloader也就是一個組件,其實不是加載進來直接就運行了,它會經過好多模塊的處理,文件的校驗,還有HotSpot的處理等等加載的信息存放于一塊稱為方法區的一塊內存空間,也就是說classloader通過IO把我們的class文件里面的字節加載到虛擬機當中的時候它要保存起來,它不能加載完就扔掉了,那class文件的字節會保存到哪呢?會放在一個叫方法區的空間里面. 除了類的信息以外,方法區中可能還會存放運行時的常量池信息,常量池就是存放我們的常量,都是唯一一份放著,包括字符串字面量和數字常量,這部分常量信息是class文件中常量池部分的內存映射.所以說這兩塊的能力通過類加載系統將我們class文件加載進來放到方法區里,放在方法區的都是唯一的東西.2. java堆: 這個java堆就是我們在講SE的時候的堆棧. java堆在虛擬機啟動時就建立了,它是java程序主要的內存工作區域,幾乎所有的java對象實例都存放在java堆中,堆空間是所有線程共享的,這是一塊與java應用密切相關的內存空間. 這里是我們要了解的重點,我們都是以他作為主講解,我們所有創建的對象,都會在堆里出現,那么所指的堆就是這個堆.3. 直接內存: java的NIO庫允許java程序使用直接內存,直接內存是java堆外的,直接向系統申請內存空間,通常訪問直接內存的速度優于java堆. 因此出于性能的考慮,讀寫頻繁的場合可能會考慮使用直接內存,由于直接內存在java堆外,因此它的大小不會直接受限于Xmx指定的最大堆大小,但是系統內存是有限的,java堆和直接內存的的總和依賴依然受限于操作系統能給出的最大內存. 其實直接內存并不隸屬于java堆的范疇內,也就是說它并不是java堆所包含的, java堆的大小是由JVM來控制的,它說多大就多大,而直接內存是直接映射到系統內存上的,它理論上的空間是無限的,不受JVM堆的控制,但是實際上也不可能是無限的,它的大小取決于你物理內存的大小,你說你物理內存是1G的,剩余的可以給他分配多少多少,但是它的空間大小要比這大一堆的.這就是直接內存,NIO庫下的一個東西,提升效率的.4. 垃圾回收系統: 這個也是一個重點內存,是java虛擬機的重要組成部分,垃圾回收器可以對方法區,java堆和直接內存進行回收,也就是說垃圾回收系統并不局限于回收java堆,對于方法區和直接內存都是可以回收的,其中java堆是垃圾回收器的重點,和C/C++不同,java中所有的對象空間釋放都是隱式的,也就是對于程序員來講對于內存的開辟和釋放完全是不透明的,他不像C語言或者C++,也就是說,java中沒有類似free()或者delete()這樣的函數釋放指定的內存區域,對于不再使用的垃圾對象,垃圾回收系統會在后臺默默的工作,默默的查找,標記并釋放對象,完成包括 java堆、方法區和直接內存中的全自動管理. 我們要了解垃圾回收,以便與以后我們真的要做優化,跟別人學習優化的時候,你知道優化的點,其中垃圾回收就是一個優化的點.5. java棧: 每一個java虛擬機線程都有一個私有的java棧,一個線程的java棧在線程創建的時候就創建了,java棧中保存著幀信息,其實所謂的java棧,比如我們講遞歸的時候,要想把遞歸講的透徹一些,我們肯定要畫棧圖,因為方法都是在棧運行的,或者說是跟棧有關的,這個時候我機會發現,方法自己調用自己的時候,這個方法壓棧壓棧,但是當一個新的方法壓棧的時候,由于原來的方法還沒有運行完,有些數據需要保存,這個保存點就叫棧幀,java棧中保存著局部變量,方法參數,也就是說所有的局部變量和參數也叫做棧變量,原因就在這里,它是獨立的,棧和棧中間是完全隔離的,同時和java方法的調用和返回密切相關.6. 本部方法棧: 本地方法棧和java棧非常類似,也是一個棧空間,最大的不同在于java棧用于方法的調用,而本地方法棧則用于本地方法的調用,本地方法就是native method, 也就是說虛擬機在運行一些內容的時候,其實脫離不了操作系統的內容,也就是要調用操作系統的API,這個API在JVM里就叫做本地方法,為什么不同的操作系統提供了不同版本的JVM,就是因為在這一塊的位置上不通用,因為不同的操作系統的結構或者方法是不一樣的,所以為了讓虛擬機能夠適應各個操作系統,那么就必須寫多個虛擬機調用多個操作系統里的不同的方法來完成它想要做的事,如果所有的操作系統本地方法都相同,那虛擬機只要有一份就可以了,java虛擬機允許java直接調用本地方法(通常使用C編寫)7. PC寄存器(Program Counter): PC寄存器是每一個線程私有的空間,java虛擬機會為每一個java線程創建PC寄存器,在任意時刻, 一個java線程總是在執行一個方法, 這個正在執行的方法稱為當前方法,如果當前方法不是本地方法, PC寄存器就會指向當前正在被執行的指令,如果當前方法是本地方法,那么PC寄存器的值就是undefined, PC寄存器是區別線程里執行的方法是本地方法還是java自己的方法的作用.8. 執行引擎: 執行引擎是java虛擬機的最核心組件之一,它負責執行虛擬機的字節碼,現在虛擬機為了提升效率會使用即時編譯(just in time)技術將方法編譯成機器碼后再執行.

?

總結

以上是生活随笔為你收集整理的jvm结构的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。