JVM -- 一、Java虛擬機初識與瞭解

博主我的認爲,做爲Java開發者,只會敲代碼,不知道JVM是不行的。所以博主這幾天在學習了下JVM,順便把所學的知識點記錄下,與你們一塊兒分享交流。java

    一塊兒學習,一塊兒進步。繼續沉澱,慢慢強大。但願這文章對您有幫助。如有寫的很差的地方,歡迎評論給建議哈!tomcat

    初寫博客不久,我是楊展浩。這是個人第十二篇博客。加油!!!服務器

    本篇關於JVM的理論東西比較多,所以文字比較多,看了以後會對JVM有個大致的概念,起碼別人在討論JVM的時候,你不會說一臉懵逼的聽。也能夠參與討論學習。網絡

    不說閒話,先丟個圖先。Java虛擬機的基本機構圖。eclipse

   

 

接下來就是根據上述的圖中的每一個框框進行一一講解,起碼知道這塊是個什麼東西,幹什麼用的先。入個門。jvm

    一、類加載子系統方法區函數

        類加載子系統負責經過文件系統或者網絡上加載Class信息(類),性能

        因爲Class信息(類)會被頻繁使用,JVM不可能不斷啓動關閉啓動關閉去加載Class信息,像Tomcat,WebLogic這些中間容器,只啓動一次存。學習

        所以JVM會將從 類加載子系統 加載到的Class信息 存放在一塊稱爲 方法區 的內存空間中,供新建立的線程去公共調用。除此以外, 方法區 還會存放運行時常量池信息,包括字符串字面量和數字常量(這部分常量信息是 Class 文件中常量池部分的內存映射)。優化

 

    二、Java堆(重點 !!! 重點)

         j ava 堆在虛擬機啓動的時候就創建了,它是 java 程序最主要的內存工做區域。 幾乎全部的 java 對象實例都存放在 java 堆中
         堆空間是全部線程共享使用的。 
         這是一塊與 java 應用密切相關的內存空間。
 

 

    三、Java棧

        每個 java 虛擬機啓動的線程都有一個私有的 java 棧,一個線程的 java 棧在線程建立的時候被建立,java 棧中保存着幀信息,java 棧中保存着局部變量、方法參數,同時和 java 方法的調用、返回密切相關。

        

    四、直接內存

        能夠理解爲:java程序中頻繁使用到 NIO庫 的時候,java程序會直接向 OS系統(術語來的,也就是操做系統)申請一塊內存空間進行 NIO 操做。直接內存不屬於堆內存。並且訪問直接內存的速度要優於堆內存。

        因爲直接內存是在 java 堆內存外面的,所以它的大小不會直接受限於 Xmx 指定的最大堆大小,可是系統內存是有限的,java 堆內存和直接內存的總和依然受限於操做系統能給出的最大內存。比如:個人機子內存是16G,java 堆內存和直接內存的總和只能小於15G(操做系統在運行佔了一部份內存)。

 

    五、本地方法棧  (目前瞭解便可)

        本地方法棧和 java 棧很是相似,最大的不一樣在於 java 棧用於方法的調用,而本地方法棧則用於本地方法的調用,做爲對 java 虛擬機的重要擴展,java 虛擬機容許 java 直接調用本地方法(一般使用 C 編寫)。Object類中就存在 clone() 本地方法。

    

 

    六、PC寄存器 (學過單片機的朋友應該知道寄存器

        PCProgram Counter)寄存器也是每個線程私有的空間,java 虛擬機會爲每個 java 線程建立 PC 寄存器。在任意時刻,一個 java 線程老是在執行一個方法,這個正在被執行的方法稱爲當前方法。若是當前方法不是本地方法,PC 寄存器就會指向當前正在被執行的指令。若是當前方法是本地方法,那麼 PC 寄存器的值就是 undefined 。

 

    七、垃圾回收系統GC重點學習 !!! 重點學習

        試想下開發寫代碼時候,須要調用到什麼對象,使用關鍵字 new 便可。若是不主動釋放的話。堆內存空間就會爆。可是平常開發也沒主動地去釋放內存,程序照樣好好的跑着。這是由於 java 虛擬機 會在程序運行過程當中或者內存不足的狀況下,GC會主動執行,回收堆內存中垃圾對象,進而釋放內存。

        垃圾回收系統是 java 虛擬機的重要組成部分,垃圾回收器能夠對方法區、java 堆、直接內存進行回收。其中,java 堆是垃圾收集器的工做重點。和 C/C++不一樣,java 中全部的對 象空間釋放都是隱式的,也就是說,java 中沒有相似 free() 或者 delete() 這樣的函數釋放指定的內存區域。對於再也不使用的垃圾對象,垃圾回收系統會在後臺默默工做,默默查找、標識並釋放垃圾對象,完成包括 java 堆、方法區和直接內存中的全自動化管理。

 

    八、執行引擎

         執行引擎是 java 虛擬機的最核心組件之一,它負責執行虛擬機的字節碼,現代虛擬機 爲了提升執行效率,會使用 即時編譯(just in time) 技術將方法編譯成機器碼後再執行。 Java HotSpot Client VM(-client),爲在客戶端環境中減小啓動時間而優化的執行引擎;本地應用開發使用。(如:eclipse)

        Java HotSpot Client VM(-server),爲在服務器環境中最大化程序執行速度而設計的執行引擎。應用在服務端程序。(如:tomcat)

        Java HotSpot Client 模式和 Server 模式的區別:
        當虛擬機運行在-client 模式的時候, 使用的是一個代號爲 C1 的輕量級編譯器 , 而運行在-server 模式啓動的虛擬機採用相對重量級,代號爲 C2 的編譯器 . C2 C1 編譯器編譯的相對完全 ,服 務起來以後,性能更高 JDK 安裝目錄/jre/lib/ x86 i386 amd32 amd64 )/jvm.cfg 文件中的內容,-server 和 -client 哪個配置在上,執行引擎就是哪個。若是是 JDK1.5 及以上版本且是 64 位系統應用時, -client 無效。
        --64 位系統內容                --32 位系統內容
        -server KNOWN                -server KNOWN
        -client IGNORE                  -client KNOWN
注意:在部分 JDK1.6 版本和後續的 JDK 版本 (64 位系統 ) 中, -client 參數已經不起做用了,Server 模式成爲惟一。

  

 

相關文章
相關標籤/搜索