深入理解java虛擬機
⑴ 什麼是java虛擬機
虛擬機是一種抽象化的計算機,通過在實際的計算機上模擬模擬各種計算機功能來實現的。
Java虛擬機有自己完善的硬體架構,如處理器、堆棧、寄存器等,還具有相應的指令系統。JVM屏蔽了與具體操作系統平台相關的信息,使得Java程序只需生成在Java虛擬機上運行的目標代碼(位元組碼),就可以在多種平台上不加修改地運行。
這種解釋應該算是正確的,但是只描述了虛擬機的外部行為和功能,並沒有針對內部原理做出說明。一般情況下我們不需要知道虛擬機的運行原理,只要專注寫java代碼就可以了,這也正是虛擬機之所以存在的原因--屏蔽底層操作系統平台的不同並且減少基於原生語言開發的復雜性,使java這門語言能夠跨各種平台(只要虛擬機廠商在特定平台上實現了虛擬機),並且簡單易用。這些都是虛擬機的外部特性,但是從這些信息來解釋虛擬機,未免太籠統了,無法讓我們知道內部原理。
從進程的角度解釋JVM
讓我們嘗試從操作系統的層面來理解虛擬機。我們知道,虛擬機是運行在操作系統之中的,那麼什麼東西才能在操作系統中運行呢?當然是進程,因為進程是操作系統中的執行單位。可以這樣理解,當它在運行的時候,它就是一個操作系統中的進程實例,當它沒有在運行時(作為可執行文件存放於文件系統中),可以把它叫做程序。
對命令行比較熟悉的同學,都知道其實一個命令對應一個可執行的二進制文件,當敲下這個命令並且回車後,就會創建一個進程,載入對應的可執行文件到進程的地址空間中,並且執行其中的指令。下面對比C語言和Java語言的HelloWorld程序來說明問題。
首先編寫C語言版的HelloWorld程序。
總結
寫到這里,基本上關於我對java虛擬機的理解就寫完了。這篇文章的主題雖然是深入理解Java虛擬機,但是你可能感覺一點也不「深入」,也只是泛泛而談。我也有這樣的感覺。限於自己水平有限,也只能這樣了,要是想深入理解java虛擬機,強烈建議讀一下三本書:
《深入Java虛擬機》
《深入理解Java虛擬機JVM高級特性與最佳實踐》
《Java虛擬機規范》
其實我也讀過這幾本書,但是它們對虛擬機的解釋也是基於一個外部模型,而沒有深入剖析虛擬機內部的實現原理。虛擬機是一個大而復雜的東西,實現虛擬機的人都是大牛級別的,如果不是參與過虛擬機的實現,應該很少有人能把它參透。本專欄後面的一些文章也參考了這三本書, 雖然講解Java語法的書不計其數, 但是深入講解虛擬機的書, 目前為止我就見過這三本,並且網上的資料也不是很多。
最後做一個總結:
1 虛擬機並不神秘,在操作系統的角度看來,它只是一個普通進程。
2 這個叫做虛擬機的進程比較特殊,它能夠載入我們編寫的class文件。如果把JVM比作一個人,那麼class文件就是我們吃的食物。
3 載入class文件的是一個叫做類載入器的子系統。就好比我們的嘴巴,把食物吃到肚子里。
4 虛擬機中的執行引擎用來執行class文件中的位元組碼指令。就好比我們的腸胃,對吃進去的食物進行消化。
5 虛擬機在執行過程中,要分配內存創建對象。當這些對象過時無用了,必須要自動清理這些無用的對象。清理對象回收內存的任務由垃圾收集器負責。就好比人吃進去的食物,在消化之後,必須把廢物排出體外,騰出空間可以在下次餓的時候吃飯並消化食物。
(1)深入理解java虛擬機擴展閱讀:
關於JAVA虛擬機的參數說明如下:
1、運行class文件
執行帶main方法的class文件,Java虛擬機[3]命令參數行為:
java <CLASS文件名>
注意:CLASS文件名不要帶文件後綴.class
例如:
java Test
如果執行的class文件是帶包的,即在類文件中使用了:
package <;包名>
那應該在包的基路徑下執行,Java虛擬機命令行參數:
java <;包名>.CLASS文件名
例如:
PackageTest.java中,其包名為:com.ee2ee.test,對應的語句為:
package com.ee2ee.test;
PackageTest.java及編譯後的class文件PackageTest.class的存放目錄如下:
classes
|__com
|__ee2ee
|__test
|__PackageTest.java
|__PackageTest.class
要運行PackageTest.class,應在classes目錄下執行:
java com.ee2ee.test.PackageTest
2、運行jar文件中的class
原理和運行class文件一樣,只需加上參數-cp <jar文件名>;即可。
例如:執行test.jar中的類com.ee2ee.test.PackageTest,命令行如下:
java -cp test.jar com.ee2ee.test.PackageTest
3、顯示JDK版本信息
當一台機器上有多個jdk版本時,需要知道當前使用的是那個版本的jdk,使用參數-version即可知道其版本,命令行為:
java -version
4、增加虛擬機可以使用的最大內存
Java虛擬機可使用的最大內存是有限制的,預設值通常為64MB或128MB。
如果一個應用程序為了提高性能而把數據載入內存中而佔用較大的內存,比如超過了默認的最大值128MB,需要加大java虛擬機可使用的最大內存,否則會出現Out of Memory的異常。啟動java時,需要使用如下兩個參數:
-Xms java虛擬機初始化時使用的內存大小
-Xmx java虛擬機可以使用的最大內存
以上兩個命令行參數中設置的size,可以帶單位,例如:256m表示256MB
舉例說明:
java -Xms128m -Xmx256m ...
表示Java虛擬機初始化時使用的內存為128MB,可使用的最大內存為256MB。
對於tomcat,可以修改其腳本catalina. sh(Unix平台)或catalina.bat(Windows平台),設置變數JAVA_OPTS即可,例如:
JAVA_OPTS='-Xms128m -Xmx256m'
⑵ 《深入理解Java虛擬機(第2版)JVM高級特性與最佳實踐》epub下載在線閱讀,求百度網盤雲資源
《深入理解Java虛擬機(第2版)》(周志明)電子書網盤下載免費在線閱讀
資源鏈接:
鏈接:https://pan..com/s/1ySj-W7sTWYttLuIDrc6Bxw
書名:深入理解Java虛擬機(第2版)
作者:周志明
豆瓣評分:9.0
出版社:機械工業出版社
出版年份:2013-9-1
頁數:433
內容簡介:
《深入理解Java虛擬機:JVM高級特性與最佳實踐(第2版)》內容簡介:第1版兩年內印刷近10次,4家網上書店的評論近4?000條,98%以上的評論全部為5星級的好評,是整個Java圖書領域公認的經典著作和超級暢銷書,繁體版在台灣也十分受歡迎。第2版在第1版的基礎上做了很大的改進:根據最新的JDK 1.7對全書內容進行了全面的升級和補充;增加了大量處理各種常見JVM問題的技巧和最佳實踐;增加了若干與生產環境相結合的實戰案例;對第1版中的錯誤和不足之處的修正;等等。第2版不僅技術更新、內容更豐富,而且實戰性更強。
《深入理解Java虛擬機:JVM高級特性與最佳實踐(第2版)》共分為五大部分,圍繞內存管理、執行子系統、程序編譯與優化、高效並發等核心主題對JVM進行了全面而深入的分析,深刻揭示了JVM的工作原理。
第一部分從宏觀的角度介紹了整個Java技術體系、Java和JVM的發展歷程、模塊化,以及JDK的編譯,這對理解書中後面內容有重要幫助。
第二部分講解了JVM的自動內存管理,包括虛擬機內存區域的劃分原理以及各種內存溢出異常產生的原因;常見的垃圾收集演算法以及垃圾收集器的特點和工作原理;常見虛擬機監控與故障處理工具的原理和使用方法。
第三部分分析了虛擬機的執行子系統,包括類文件結構、虛擬機類載入機制、虛擬機位元組碼執行引擎。
第四部分講解了程序的編譯與代碼的優化,闡述了泛型、自動裝箱拆箱、條件編譯等語法糖的原理;講解了虛擬機的熱點探測方法、HotSpot的即時編譯器、編譯觸發條件,以及如何從虛擬機外部觀察和分析JIT編譯的數據和結果;
第五部分探討了Java實現高效並發的原理,包括JVM內存模型的結構和操作;原子性、可見性和有序性在Java內存模型中的體現;先行發生原則的規則和使用;線程在Java語言中的實現原理;虛擬機實現高效並發所做的一系列鎖優化措施。
作者簡介:
周志明,資深Java技術專家,對JavaEE企業級應用開發、OSGi、Java虛擬機和工作流等都有深入的研究,並在大量的實踐中積累了豐富的經驗。尤其精通Java虛擬機,撰寫了大量與JVM相關的經典文章,被各大技術社區爭相轉載,是ITeye等技術社區公認的Java虛擬機方面的領袖人物之一。除本書外,還著有經典著作《深入理解OSGi:Equinox原理、應用與最佳實踐》,廣獲讀者好評。現任遠光軟體股份有限公司開發部總經理兼架構師,先後參與過國家電網、南方電網等多個國家級大型ERP項目的平台架構工作,對軟體系統架構也有深刻的認識和體會。
⑶ 誰有《深入理解Java虛擬機:JVM高級特性與最佳實踐-周志明》電子書百度網盤資源下載
《深入理解Java虛擬機:JVM高級特性與最佳實踐-周志明》電子書網路網盤資源下載:
鏈接: https://pan..com/s/10SXSALpvlFQzmfDOmbSqnw
深入理解Java虛擬機:JVM高級特性與最佳實踐-周志明
⑷ 深入探索Java工作原理:JVM,內存回收及其他
Java語言引入了Java虛擬機 具有跨平台運行的功能 能夠很好地適應各種Web應用 同時 為了提高Java語言的性能和健壯性 還引入了如垃圾回收機制等新功能 通過這些改進讓Java具有其獨特的工作原理
.Java虛擬機
Java虛擬機(Java Virtual Machine JVM)是軟體模擬的計算機 它可以在任何處理器上(無論是在計算機中還是在其他電子設備中)安全兼容地執行保存在 class文件中的位元組碼 Java虛擬機的 機器碼 保存在 class文件中 有時也可以稱之為位元組碼文件
升大團Java程序的跨平台特性主要是指位元組碼文件可以在任何具有Java虛擬機的計算機或者電子設備上運行 Java虛擬機中的Java解釋器負責將位元組碼文件解釋成為特定的機器碼進行運行 因此在運行時 Java源程序需要通過編譯器編譯成為 class文件
Java虛擬機的建立需要針對不同的軟硬體平台來實現 既要考慮處理器的型號 也要考慮操作系統的種類 由此在SPARC結構 X 結構 MIPS和PPC等嵌入式處理晶元上 在UNIX Linux Windows和部分實時操作系統上都可實現Java虛擬機
.無用內存自動回收機制
在程序的執行過程中 部分內存在使用過後就處於廢棄狀態 如果不及時進行回收 很有可能會導致內存泄漏 進而引發系統崩潰 在C++語言中是由程序員進行內存回收的 程序員需要在編寫程序時把不再使用的對象內存釋放掉 這種人為管理內存釋放的方法往往由於程序員的疏忽而致使內存無法回收 同時也增加了程序員的工作量 而在Java運行環境中 始終存在著一個系統級的線程 專門跟蹤內存的使用情況 定期檢測出不再使用的內存 並自動進行回收 避免了內存的泄露 也減輕了程序員的工作量
.代碼安全性檢查機制
安全和方便總是相對矛盾的 Java編程語吵橘言的出現使得客戶端計算機可以方便地從網路上上傳或下載Java程序到本地計算機上運行 但是如何保證該Java程序不攜帶病毒或者沒有其他危險目的呢?為了確保Java程序執行的安全性 Java語言通過Applet程序來控制非法程序的安全性 也就是有了它才確保Java語言的生存
Java位元組碼的執行需要經過以下 個步驟
( )由類裝載器(class loader)負責把類文件( class文件)載入到Java虛擬機中 在此仿悉過程需要檢驗該類文件是否符合類文件規范
( )位元組碼校驗器(bytecode verifier)檢查該類文件的代碼中是否存在著某些非法操作 例如Applet程序中寫本地計算機文件系統的操作
( )如果位元組碼校驗器檢驗通過 由Java解釋器負責把該類文件解釋成為機器碼進行執行
注意
Java虛擬機採用 沙箱 運行模式 即把Java程序的代碼和數據都限制在一定內存空間里執行 不允許程序訪問該內存空間以外的內存 如果是Applet程序 還不允許訪問客戶端機器的文件系統
Java的運行環境
無論哪種語言都需要有它特定的運行環境 也就是平台 Java語言同樣不例外 但是如何理解Java程序與硬體環境無關呢?
幾乎所有的語言都需要通過編譯或者解釋才可以被計算機執行 但是Java有一點不同 它同時需要這兩個過程 其實 也正是因為這個原因才使Java這種語言具有了平台無關性 當完成一個Java源程序後 首先 通過Java翻譯程序將它編譯成一種叫做位元組碼的中間代碼 然後再由Java平台的解釋器將它轉換成為機器語言來執行 這一平台的核心就是JVM
Java的編譯過程與其他的語言不同 像C++這樣的語言 在編譯時它是與計算機的硬體平台信息密不可分的 編譯程序通過查表將所有指令的操作數和操作碼等轉換成內存的偏移量 即程序運行時的內存分配方式 目的是保證程序正常運行 而Java卻是將指令轉換成為一種 class的文件 這種文件不包含硬體的信息 需要執行時只要經過安裝有JVM的機器進行解釋 創建內存分配後再通過查表來確定一條指令所在的地址 這樣就有效地保證了Java的可移植性和安全性
Java平台具有這樣的特性和它的結構有關 通常一個程序運行的平台是一個硬體或者軟體運行的環境 目前比較流行的是Windows XP Linux Solaris和MacOS Java的平台不太一樣 它由兩個部分組成 即JVM和應用程序設計介面
.JVM
JVM是Java平台的核心 為了讓編譯產生的位元組碼能更好地解釋與執行 因此把JVM分成了 個部分 JVM解釋器 指令系統 寄存器 棧 存儲區和碎片回收區
◆JVM解釋器 即這個虛擬機處理欄位碼的CPU
◆JVM指令系統 該系統與計算機很相似 一條指令由操作碼和操作數兩部分組成 操作碼為 位二進制數 主要是為了說明一條指令的功能 操作數可以根據需要而定 JVM有多達 種不同的操作指令
◆寄存器 JVM有自己的虛擬寄存器 這樣就可以快速地與JVM的解釋器進行數據交換 為了功能的需要 JVM設置了 個常用的 位寄存器 pc(程序計數器) optop(操作數棧頂指針) frame(當前執行環境指針)和vars(指向當前執行環境中第一個局部變數的指針)
◆JVM棧 指令執行時數據和信息存儲的場所和控制中心 它提供給JVM解釋器運算所需要的信息
◆存儲區 JVM存儲區用於存儲編譯過後的位元組碼等信息
◆碎片回收區 JVM碎片回收是指將使用過的Java類的具體實例從內存進行回收 這就使得開發人員免去了自己編程式控制制內存的麻煩和危險 隨著JVM的不斷升級 其碎片回收的技術和演算法也更加合理 JVM 版後產生了一種叫分代收集技術 簡單來說就是利用對象在程序中生存的時間劃分成代 以此為標准進行碎片回收
.Java應用程序設計介面
Java Application Programming Interface簡稱Java API 其中文名為Java應用程序設計介面 它是一個軟體集合 其中有許多開發時所需要的控制項 可以用它來輔助開發
lishixin/Article/program/Java/hx/201311/26733