深入理解java虛擬機第三章(關於java虛擬機,描述錯誤的是)

本文目錄一覽:

深入理解java虛擬機第二版和第三版的區別?

區別:

第三版是一款針對java學習打造的圖書,它從Java程序員的角度出發,系統地將Java程序運行過程中涉及的各種知識整合到了一起,而第二版不僅技術更新、內容更豐富,而且實戰性更強。

【第二版】

《深入理解Java虛擬機:JVM高級特性與最佳實踐(第2版)》共分為五大部分,圍繞內存管理、執行子系統、程序編譯與優化、高效並發等核心主題對JVM進行了全面而深入的分析,深刻揭示了JVM的工作原理。

第一部分從宏觀的角度介紹了整個Java技術體系、Java和JVM的發展歷程、模塊化,以及JDK的編譯,這對理解書中後面內容有重要幫助。

第二部分講解了JVM的自動內存管理,包括虛擬機內存區域的劃分原理以及各種內存溢出異常產生的原因;常見的垃圾收集算法以及垃圾收集器的特點和工作原理;常見虛擬機監控與故障處理工具的原理和使用方法。

第三部分分析了虛擬機的執行子系統,包括類文件結構、虛擬機類加載機制、虛擬機字節碼執行引擎。

第四部分講解了程序的編譯與代碼的優化,闡述了泛型、自動裝箱拆箱、條件編譯等語法糖的原理;講解了虛擬機的熱點探測方法、HotSpot的即時編譯器、編譯觸發條件,以及如何從虛擬機外部觀察和分析JIT編譯的數據和結果;

第五部分探討了Java實現高效並發的原理,包括JVM內存模型的結構和操作;原子性、可見性和有序性在Java內存模型中的體現;先行發生原則的規則和使用;線程在Java語言中的實現原理;虛擬機實現高效並發所做的一系列鎖優化措施。

【第三版】

深入理解java虛擬機第三版pdf是一款針對java學習打造的圖書,它從Java程序員的角度出發,系統地將Java程序運行過程中涉及的各種知識整合到了一起,並配以日常工作中可能會碰到的疑難案例,引領讀者輕鬆踏上探索Java虛擬機的旅途。

《深入理解Java虛擬機(第2版)JVM高級特性與最佳實踐》epub下載在線閱讀,求百度網盤雲資源

《深入理解Java虛擬機(第2版)》(周志明)電子書網盤下載免費在線閱讀

資源鏈接:

鏈接:

密碼:0xhz  

書名:深入理解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虛擬機?

虛擬機是一種抽象化的計算機,通過在實際的計算機上仿真模擬各種計算機功能來實現的。

Java虛擬機有自己完善的硬體架構,如處理器、堆棧、寄存器等,還具有相應的指令系統。JVM屏蔽了與具體操作系統平台相關的信息,使得Java程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平台上不加修改地運行。

這種解釋應該算是正確的,但是只描述了虛擬機的外部行為和功能,並沒有針對內部原理做出說明。一般情況下我們不需要知道虛擬機的運行原理,只要專註寫java代碼就可以了,這也正是虛擬機之所以存在的原因–屏蔽底層操作系統平台的不同並且減少基於原生語言開發的複雜性,使java這門語言能夠跨各種平台(只要虛擬機廠商在特定平台上實現了虛擬機),並且簡單易用。這些都是虛擬機的外部特性,但是從這些信息來解釋虛擬機,未免太籠統了,無法讓我們知道內部原理。

從進程的角度解釋JVM

讓我們嘗試從操作系統的層面來理解虛擬機。我們知道,虛擬機是運行在操作系統之中的,那麼什麼東西才能在操作系統中運行呢?當然是進程,因為進程是操作系統中的執行單位。可以這樣理解,當它在運行的時候,它就是一個操作系統中的進程實例,當它沒有在運行時(作為可執行文件存放於文件系統中),可以把它叫做程序。

對命令行比較熟悉的同學,都知道其實一個命令對應一個可執行的二進制文件,當敲下這個命令並且回車後,就會創建一個進程,加載對應的可執行文件到進程的地址空間中,並且執行其中的指令。下面對比C語言和Java語言的HelloWorld程序來說明問題。

首先編寫C語言版的HelloWorld程序。

編譯C語言版的HelloWorld程序:

gcc HelloWorld.c -o HelloWorld

運行C語言版的HelloWorld程序:

zhangjg@linux:/deve/workspace/HelloWorld/src$ ./HelloWorld

hello world

gcc編譯器編譯後的文件直接就是可被操作系統識別的二進制可執行文件,當我們在命令行中敲下 ./HelloWorld這條命令的時候, 直接創建一個進程, 並且將可執行文件加載到進程的地址空間中, 執行文件中的指令。

作為對比, 我們看一下Java版HelloWord程序的編譯和執行形式。

首先編寫源文件HelloWord.java :

編譯Java版的HelloWorld程序:

運行Java版的HelloWorld程序:

zhangjg@linux:/deve/workspace/HelloJava/src$ java -classpath . HelloWorld

HelloWorld

從上面的過程可以看到, 我們在運行Java版的HelloWorld程序的時候, 敲入的命令並不是 ./HelloWorld.class 。 因為class文件並不是可以直接被操作系統識別的二進制可執行文件 。 我們敲入的是java這個命令。 這個命令說明, 我們首先啟動的是一個叫做java的程序, 這個java程序在運行起來之後就是一個JVM進程實例。

上面的命令執行流程是這樣的:

java命令首先啟動虛擬機進程,虛擬機進程成功啟動後,讀取參數“HelloWorld”,把他作為初始類加載到內存,對這個類進行初始化和動態鏈接(關於類的初始化和動態鏈接會在後面的博客中介紹),然後從這個類的main方法開始執行。也就是說我們的.class文件不是直接被系統加載後直接在cpu上執行的,而是被一個叫做虛擬機的進程託管的。首先必須虛擬機進程啟動就緒,然後由虛擬機中的類加載器加載必要的class文件,包括jdk中的基礎類(如String和Object等),然後由虛擬機進程解釋class字節碼指令,把這些字節碼指令翻譯成本機cpu能夠識別的指令,才能在cpu上運行。

從這個層面上來看,在執行一個所謂的java程序的時候,真真正正在執行的是一個叫做Java虛擬機的進程,而不是我們寫的一個個的class文件。這個叫做虛擬機的進程處理一些底層的操作,比如內存的分配和釋放等等。我們編寫的class文件只是虛擬機進程執行時需要的“原料”。這些“原料”在運行時被加載到虛擬機中,被虛擬機解釋執行,以控制虛擬機實現我們java代碼中所定義的一些相對高層的操作,比如創建一個文件等,可以將class文件中的信息看做對虛擬機的控制信息,也就是一種虛擬指令。

編程語言也有自己的原理, 學習一門語言, 主要是把它的原理搞明白。 看似一個簡單的HelloWorld程序, 也有很多深入的內容值得剖析。

JVM體系結構簡介

為了展示虛擬機進程和class文件的關係,特意畫了下面一張圖:

根據上圖表達的內容,我們編譯之後的class文件是作為Java虛擬機的原料被輸入到Java虛擬機的內部的,那麼具體由誰來做這一部分工作呢?其實在Java虛擬機內部,有一個叫做類加載器的子系統,這個子系統用來在運行時根據需要加載類。注意上面一句話中的“根據需要”四個字。在Java虛擬機執行過程中,只有他需要一個類的時候,才會調用類加載器來加載這個類,並不會在開始運行時加載所有的類。就像一個人,只有餓的時候才去吃飯,而不是一次把一年的飯都吃到肚子里。一般來說,虛擬機加載類的時機,在第一次使用一個新的類的時候。本專欄後面的文章會具體討論Java中的類加載器。

由虛擬機加載的類,被加載到Java虛擬機內存中之後,虛擬機會讀取並執行它裡面存在的字節碼指令。虛擬機中執行字節碼指令的部分叫做執行引擎。就像一個人,不是把飯吃下去就完事了,還要進行消化,執行引擎就相當於人的腸胃系統。在執行的過程中還會把各個class文件動態的連接起來。關於執行引擎的具體行為和動態鏈接相關的內容也會在本專欄後續的文章中進行討論。

我們知道,Java虛擬機會進行自動內存管理。具體說來就是自動釋放沒有用的對象,而不需要程序員編寫代碼來釋放分配的內存。這部分工作由垃圾收集子系統負責。

從上面的論述可以知道, 一個Java虛擬機實例在運行過程中有三個子系統來保障它的正常運行,分別是類加載器子系統, 執行引擎子系統和垃圾收集子系統。 如下圖所示:

虛擬機的運行,必須加載class文件,並且執行class文件中的字節碼指令。它做這麼多事情,必須需要自己的空間。就像人吃下去的東西首先要放在胃中。虛擬機也需要空間來存放個中數據。首先,加載的字節碼,需要一個單獨的內存空間來存放;一個線程的執行,也需要內存空間來維護方法的調用關係,存放方法中的數據和中間計算結果;在執行的過程中,無法避免的要創建對象,創建的對象需要一個專門的內存空間來存放。關於虛擬機運行時數據區的內容,也會出現在本專欄後續的文章中。虛擬機的運行時內存區大概可以分成下圖所示的幾個部分。(這裡只是大概劃分,並沒有劃分的很精細)

總結

寫到這裡,基本上關於我對java虛擬機的理解就寫完了。這篇文章的主題雖然是深入理解Java虛擬機,但是你可能感覺一點也不“深入”,也只是泛泛而談。我也有這樣的感覺。限於自己水平有限,也只能這樣了,要是想深入理解java虛擬機,強烈建議讀一下三本書:

《深入Java虛擬機》

《深入理解Java虛擬機JVM高級特性與最佳實踐》

《Java虛擬機規範》

其實我也讀過這幾本書,但是它們對虛擬機的解釋也是基於一個外部模型,而沒有深入剖析虛擬機內部的實現原理。虛擬機是一個大而複雜的東西,實現虛擬機的人都是大牛級別的,如果不是參與過虛擬機的實現,應該很少有人能把它參透。本專欄後面的一些文章也參考了這三本書, 雖然講解Java語法的書不計其數, 但是深入講解虛擬機的書, 目前為止我就見過這三本,並且網上的資料也不是很多。

最後做一個總結:

1 虛擬機並不神秘,在操作系統的角度看來,它只是一個普通進程。

2 這個叫做虛擬機的進程比較特殊,它能夠加載我們編寫的class文件。如果把JVM比作一個人,那麼class文件就是我們吃的食物。

3 加載class文件的是一個叫做類加載器的子系統。就好比我們的嘴巴,把食物吃到肚子里。

4 虛擬機中的執行引擎用來執行class文件中的字節碼指令。就好比我們的腸胃,對吃進去的食物進行消化。

5 虛擬機在執行過程中,要分配內存創建對象。當這些對象過時無用了,必須要自動清理這些無用的對象。清理對象回收內存的任務由垃圾收集器負責。就好比人吃進去的食物,在消化之後,必須把廢物排出體外,騰出空間可以在下次餓的時候吃飯並消化食物。

擴展資料:

關於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虛擬機

深入理解Java虛擬機的目錄

前言

致謝

第一部分 走近Java

第1章 走近Java / 2

1.1 概述 / 2

1.2 Java技術體系 / 3

1.3 Java發展史 / 5

1.4 展望Java技術的未來 / 9

1.4.1 模塊化 / 9

1.4.2 混合語言 / 9

1.4.3 多核並行 / 11

1.4.4 進一步豐富語法 / 12

1.4.5 64位虛擬機 / 13

1.5 實戰:自己編譯JDK / 13

1.5.1 獲取JDK源碼 / 13

1.5.2 系統需求 / 14

1.5.3 構建編譯環境 / 15

1.5.4 準備依賴項 / 17

1.5.5 進行編譯 / 18

1.6 本章小結 / 21

第二部分 自動內存管理機制

第2章 Java內存區域與內存溢出異常 / 24

2.1 概述 / 24

2.2 運行時數據區域 / 25

2.2.1 程序計數器 / 25

2.2.2 Java虛擬機棧 / 26

2.2.3 本地方法棧 / 27

2.2.4 Java堆 / 27

2.2.5 方法區 / 28

2.2.6 運行時常量池 / 29

2.2.7 直接內存 / 29

2.3 對象訪問 / 30

2.4 實戰:OutOfMemoryError異常 / 32

2.4.1 Java堆溢出 / 32

2.4.2 虛擬機棧和本地方法棧溢出 / 35

2.4.3 運行時常量池溢出 / 38

2.4.4 方法區溢出 / 39

2.4.5 本機直接內存溢出 / 41

2.5 本章小結 / 42

第3章 垃圾收集器與內存分配策略 / 43

3.1 概述 / 43

3.2 對象已死? / 44

3.2.1 引用計數算法 / 44

3.2.2 根搜索算法 / 46

3.2.3 再談引用 / 47

3.2.4 生存還是死亡? / 48

3.2.5 回收方法區 / 50

3.3 垃圾收集算法 / 51

3.3.1 標記 -清除算法 / 51

3.3.2 複製算法 / 52

3.3.3 標記-整理算法 / 54

3.3.4 分代收集算法 / 54

3.4 垃圾收集器 / 55

3.4.1 Serial收集器 / 56

3.4.2 ParNew收集器 / 57

3.4.3 Parallel Scavenge收集器 / 59

3.4.4 Serial Old收集器 / 60

3.4.5 Parallel Old收集器 / 61

3.4.6 CMS收集器 / 61

3.4.7 G1收集器 / 64

3.4.8 垃圾收集器參數總結 / 64

3.5 內存分配與回收策略 / 65

3.5.1 對象優先在Eden分配 / 66

3.5.2 大對象直接進入老年代 / 68

3.5.3 長期存活的對象將進入老年代 / 69

3.5.4 動態對象年齡判定 / 71

3.5.5 空間分配擔保 / 73

3.6 本章小結 / 75

第4章 虛擬機性能監控與故障處理工具 / 76

4.1 概述 / 76

4.2 JDK的命令行工具 / 76

4.2.1 jps:虛擬機進程狀況工具 / 79

4.2.2 jstat:虛擬機統計信息監視工具 / 80

4.2.3 jinfo:Java配置信息工具 / 82

4.2.4 jmap:Java內存映像工具 / 82

4.2.5 jhat:虛擬機堆轉儲快照分析工具 / 84

4.2.6 jstack:Java堆棧跟蹤工具 / 85

4.3 JDK的可視化工具 / 87

4.3.1 JConsole:Java監視與管理控制台 / 88

4.3.2 VisualVM:多合一故障處理工具 / 96

4.4 本章小結 / 105

第5章 調優案例分析與實戰 / 106

5.1 概述 / 106

5.2 案例分析 / 106

5.2.1 高性能硬件上的程序部署策略 / 106

5.2.2 集群間同步導致的內存溢出 / 109

5.2.3 堆外內存導致的溢出錯誤 / 110

5.2.4 外部命令導致系統緩慢 / 112

5.2.5 服務器JVM進程崩潰 / 113

5.3 實戰:Eclipse運行速度調優 / 114

5.3.1 調優前的程序運行狀態 / 114

5.3.2 升級JDK 1.6的性能變化及兼容問題 / 117

5.3.3 編譯時間和類加載時間的優化 / 122

5.3.4 調整內存設置控制垃圾收集頻率 / 126

5.3.5 選擇收集器降低延遲 / 130

5.4 本章小結 / 133

第三部分 虛擬機執行子系統

第6章 類文件結構 / 136

6.1 概述 / 136

6.2 無關性的基石 / 136

6.3 Class類文件的結構 / 138

6.3.1 魔數與Class文件的版本 / 139

6.3.2 常量池 / 141

6.3.3 訪問標誌 / 147

6.3.4 類索引、父類索引與接口索引集合 / 148

6.3.5 字段表集合 / 149

6.3.6 方法表集合 / 153

6.3.7 屬性表集合 / 155

6.4 Class文件結構的發展 / 168

6.5 本章小結 / 170

第7章 虛擬機類加載機制 / 171

7.1 概述 / 171

7.2 類加載的時機 / 172

7.3 類加載的過程 / 176

7.3.1 加載 / 176

7.3.2 驗證 / 178

7.3.3 準備 / 181

7.3.4 解析 / 182

7.3.5 初始化 / 186

7.4 類加載器 / 189

7.4.1 類與類加載器 / 189

7.4.2 雙親委派模型 / 191

7.4.3 破壞雙親委派模型 / 194

7.5 本章小結 / 197

第8章 虛擬機字節碼執行引擎 / 198

8.1 概述 / 198

8.2 運行時棧幀結構 / 199

8.2.1 局部變量表 / 199

8.2.2 操作數棧 / 204

8.2.3 動態連接 / 206

8.2.4 方法返回地址 / 206

8.2.5 附加信息 / 207

8.3 方法調用 / 207

8.3.1 解析 / 207

8.3.2 分派 / 209

8.4 基於棧的字節碼解釋執行引擎 / 221

8.4.1 解釋執行 / 221

8.4.2 基於棧的指令集與基於寄存器的指令集 / 223

8.4.3 基於棧的解釋器執行過程 / 224

8.5 本章小結 / 230

第9章 類加載及執行子系統的案例與實戰 / 231

9.1 概述 / 231

9.2 案例分析 / 231

9.2.1 Tomcat:正統的類加載器架構 / 232

9.2.2 OSGi:靈活的類加載器架構 / 235

9.2.3 字節碼生成技術與動態代理的實現 / 238

9.2.4 Retrotranslator:跨越JDK版本 / 242

9.3 實戰:自己動手實現遠程執行功能 / 246

9.3.1 目標 / 246

9.3.2 思路 / 247

9.3.3 實現 / 248

9.3.4 驗證 / 255

9.4 本章小結 / 256

第四部分 程序編譯與代碼優化

第10章 早期(編譯期)優化 / 258

10.1 概述 / 258

10.2 Javac編譯器 / 259

10.2.1 Javac的源碼與調試 / 259

10.2.2 解析與填充符號表 / 262

10.2.3 註解處理器 / 264

10.2.4 語義分析與字節碼生成 / 264

10.3 Java語法糖的味道 / 268

10.3.1 泛型與類型擦除 / 268

10.3.2 自動裝箱、拆箱與遍歷循環 / 273

10.3.3 條件編譯 / 275

10.4 實戰:插入式註解處理器 / 276

10.4.1 實戰目標 / 276

10.4.2 代碼實現 / 277

10.4.3 運行與測試 / 284

10.4.4 其他應用案例 / 286

10.5 本章小結 / 286

第11章 晚期(運行期)優化 / 287

11.1 概述 / 287

11.2 HotSpot虛擬機內的即時編譯器 / 288

11.2.1 解釋器與編譯器 / 288

11.2.2 編譯對象與觸發條件 / 291

11.2.3 編譯過程 / 294

11.2.4 查看與分析即時編譯結果 / 297

11.3 編譯優化技術 / 301

11.3.1 優化技術概覽 / 301

11.3.2 公共子表達式消除 / 305

11.3.3 數組邊界檢查消除 / 307

11.3.4 方法內聯 / 307

11.3.5 逃逸分析 / 309

11.4 Java與C/C++的編譯器對比 / 311

11.5 本章小結 / 313

第五部分 高效並發

第12章 Java內存模型與線程 / 316

12.1 概述 / 316

12.2 硬件的效率與一致性 / 317

12.3 Java內存模型 / 318

12.3.1 主內存與工作內存 / 319

12.3.2 內存間交互操作 / 320

12.3.3 對於volatile型變量的特殊規則 / 322

12.3.4 對於long和double型變量的特殊規則 / 327

12.3.5 原子性、可見性與有序性 / 328

12.3.6 先行發生原則 / 330

12.4 Java與線程 / 333

12.4.1 線程的實現 / 333

12.4.2 Java線程調度 / 337

12.4.3 狀態轉換 / 339

12.5 本章小結 / 341

第13章 線程安全與鎖優化 / 342

13.1 概述 / 342

13.2 線程安全 / 343

13.2.1 Java語言中的線程安全 / 343

13.2.2 線程安全的實現方法 / 348

13.3 鎖優化 / 356

13.3.1 自旋鎖與自適應自旋 / 356

13.3.2 鎖消除 / 357

13.3.3 鎖粗化 / 358

13.3.4 輕量級鎖 / 358

13.3.5 偏向鎖 / 361

13.4 本章小結 / 362

附錄A Java虛擬機家族 / 363

附錄B 虛擬機字節碼指令表 / 366

附錄C HotSpot虛擬機主要參數表 / 372

附錄D 對象查詢語言(OQL)簡介 / 376

附錄E JDK歷史版本軌跡 / 383

誰有《深入理解Java虛擬機:JVM高級特性與最佳實踐-周志明》電子書百度網盤資源下載

《深入理解Java虛擬機:JVM高級特性與最佳實踐-周志明》電子書百度網盤資源下載:

鏈接:

提取碼: kpf4    

深入理解Java虛擬機:JVM高級特性與最佳實踐-周志明

原創文章,作者:K9F84,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/130246.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
K9F84的頭像K9F84
上一篇 2024-10-03 23:28
下一篇 2024-10-03 23:28

相關推薦

  • 深入解析Vue3 defineExpose

    Vue 3在開發過程中引入了新的API `defineExpose`。在以前的版本中,我們經常使用 `$attrs` 和` $listeners` 實現父組件與子組件之間的通信,但…

    編程 2025-04-25
  • 深入理解byte轉int

    一、字節與比特 在討論byte轉int之前,我們需要了解字節和比特的概念。字節是計算機存儲單位的一種,通常表示8個比特(bit),即1字節=8比特。比特是計算機中最小的數據單位,是…

    編程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什麼是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一個內置小部件,它可以監測數據流(Stream)中數據的變…

    編程 2025-04-25
  • 深入探討OpenCV版本

    OpenCV是一個用於計算機視覺應用程序的開源庫。它是由英特爾公司創建的,現已由Willow Garage管理。OpenCV旨在提供一個易於使用的計算機視覺和機器學習基礎架構,以實…

    編程 2025-04-25
  • 深入了解scala-maven-plugin

    一、簡介 Scala-maven-plugin 是一個創造和管理 Scala 項目的maven插件,它可以自動生成基本項目結構、依賴配置、Scala文件等。使用它可以使我們專註於代…

    編程 2025-04-25
  • 深入了解LaTeX的腳註(latexfootnote)

    一、基本介紹 LaTeX作為一種排版軟件,具有各種各樣的功能,其中腳註(footnote)是一個十分重要的功能之一。在LaTeX中,腳註是用命令latexfootnote來實現的。…

    編程 2025-04-25
  • 深入探討馮諾依曼原理

    一、原理概述 馮諾依曼原理,又稱“存儲程序控制原理”,是指計算機的程序和數據都存儲在同一個存儲器中,並且通過一個統一的總線來傳輸數據。這個原理的提出,是計算機科學發展中的重大進展,…

    編程 2025-04-25
  • 深入理解Python字符串r

    一、r字符串的基本概念 r字符串(raw字符串)是指在Python中,以字母r為前綴的字符串。r字符串中的反斜杠(\)不會被轉義,而是被當作普通字符處理,這使得r字符串可以非常方便…

    編程 2025-04-25
  • 深入了解Python包

    一、包的概念 Python中一個程序就是一個模塊,而一個模塊可以引入另一個模塊,這樣就形成了包。包就是有多個模塊組成的一個大模塊,也可以看做是一個文件夾。包可以有效地組織代碼和數據…

    編程 2025-04-25
  • 深入剖析MapStruct未生成實現類問題

    一、MapStruct簡介 MapStruct是一個Java bean映射器,它通過註解和代碼生成來在Java bean之間轉換成本類代碼,實現類型安全,簡單而不失靈活。 作為一個…

    編程 2025-04-25

發表回復

登錄後才能評論