国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

《深入理解JVM》讀書筆記

idealcn / 1880人閱讀

摘要:抽時間重新讀了一遍深入理解一書。驗證確保文件的字節流中包含的信息符合當前虛擬機的要求,并且不會危害虛擬機自身的安全。可見性可見性是指當一個線程修改了共享變量的值,其他線程能夠立即得知這個修改。

抽時間重新讀了一遍《深入理解JVM》一書。以下為摘錄內容。

1 java內存區域

java虛擬機運行時數據區

1.1 程序計數器

是一塊較小的內存空間,可以看做是當前線程所執行的字節碼的行號指示器。每條線程都有一個獨立的程序計數器,各條線程之間計數器互不影響。

1.2 java虛擬機棧

描述的是java方法執行的內存模型:每個方法在執行的同時都會創建一個棧幀用于存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。

局部變量表存放了編譯器可知的各種基本數據類型、對象引用和returnAddress類型。

1.3 本地方法棧

虛擬機棧為虛擬機執行java方法服務,二本地方法棧為虛擬機使用到的Native方法服務。

1.4 java堆

被所有線程共享的一塊內存區域,在虛擬機啟動時創建。java堆是垃圾收集器管理的主要區域,因此很多時候也被叫做GC堆。

1.5 方法區

各個線程共享的內存區域,用于存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據。

1.6 運行時常量池

方法區的一部分。需要注意的是string的intern方法在jdk1.6前后的不同。jdk1.6之后常量池放到了堆中。

1.7 直接內存

并不是虛擬機運行時數據區的一部分,也不是java虛擬機規范中國定義的內存區域。NIO引入的通道和緩沖區可以使用native函數庫直接分配對外內存。

2 垃圾收集器與內存分配策略 2.1 判斷對象是否存活的算法:

引用計數算法:很難解決對象之間相互循環引用的問題

可達性分析算法:通過一系列GC Roots的對象作為起始點,從這些節點開始向下搜索,搜索所走過的路線稱為引用鏈,當一個對象到GC Roots沒有任何引用鏈相連時,則證明此對象是不可用的。

2.2 垃圾收集算法

標記-清除算法:效率低,空間碎片化

復制算法:運行簡單高效,代價高,降低了一半的使用率

標記-整理算法

分代收集:新生代用復制算法,老年代用標記整理算法

3 虛擬機類加載機制

加載、驗證、準備、解析、初始化。

3.1 有且只有5種情況必須立即對類進行初始化

1)遇到new、getstatic、putstatic或invokestatic這4條指令字節碼時,如果類沒有進行過初始化,則需要先觸發其初始化。

2)使用java.lang.reflect包的方法對類進行反射調用的時候,如果類沒有進行過初始化,則需要先觸發其初始化。

3)當初始化一個類的時候,如果發現其父類還沒有進行過初始化,需要先觸發其父類的初始化。

4)當虛擬機啟動時,需要制定main,虛擬機會先初始化main類。

5)當使用jdk1.7的動態語言支持時,如果java.lang.invoke.MethodHandle實例最后的解析結果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且這個方法句柄所對應的類沒有進行過初始化,則需要先觸發其初始化。

3.2 類加載的過程 3.2.1 加載

1)通過一個類的全限定名來獲取定義此類的二進制字節流

2)將這個字節流所代表的靜態存儲結構轉換為方法區的運行時數據結構

3)在內存中生成一個代表這個類的java.lang.Class對象,作為方法區這個類的各種數據的訪問入口。

3.2.2 驗證

確保Class文件的字節流中包含的信息符合當前虛擬機的要求,并且不會危害虛擬機自身的安全。

文件格式驗證——元數據驗證——字節碼驗證——符號引用驗證

3.2.3 準備

正式為類變量分配內存并設置類變量初始值的階段,這些變量所使用的內存都將在方法區中進行分配。這時候進行內存分配的僅包括類變量(被static修飾的變量),二不包括實例變量。

3.2.4 解析

解析階段是虛擬機將常量池內的符號引用替換為直接引用的過程。

類和接口的解析、字段解析、類方法解析、接口方法解析

3.2.5 初始化

類初始化階段是類加載過程的最后一步。在準備階段,變量已經賦過一次系統要求的初始值,而在初始化階段,則根據程序員通過程序指定的主觀計劃去初始化類變量和其他資源,或者可以從另一個角度來表達:初始化階段是執行類構造器()方法的過程。

4 java內存模型

硬件的效率與一致性

java內存模型(JMM)

線程、主內存、工作內存之間的交互關系
java內存模型規定了所有的變量都存儲在主內存中,每條線程有自己的工作內存,線程的工作內存中保存了被該線程使用到的變量的主內存副本拷貝,線程對變量的所有操作(讀取、賦值)都必須在工作內存中進行,而不能直接讀寫主內存中的變量。線程間變量值的傳遞均需要通過主內存來完成。

java內存模型時圍繞著在并發過程中如何處理原子性、可見性和有序性這三個特征來建立的。

原子性:通過read、load、assign、user、store、write操作來保證。通過lock和unlock也可以滿足。

可見性:可見性是指當一個線程修改了共享變量的值,其他線程能夠立即得知這個修改。Java內存模型是通過在變量修改后將新值同步回主內存,在變量讀取前從主內存刷新變量值這種依賴主內存作為傳遞媒介的方式來實現可見性的,無論普通變量還是volatile變量都是如此,普通變量與volatile變量的區別是,volatile的特殊規則保證了新值能夠立即同步到主內存,以及每次使用前立即從主內存刷新。volatile保證了多線程操作時變量的可見性,二普通變量不能保證這一點。(synchronized和final關鍵字)

有序性:volatile和synchronized保證線程之間操作的有序性,volatile本身就包含了禁止指令重排序的語義。

先行發生原則 保證了我們大多數情況下不用關心太多。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73343.html

相關文章

  • 深入理解JVM虛擬機》讀書筆記-開篇

    摘要:年開始工作,年畢業,兩年來的工作接觸知識面很廣,用的東西比較多,包括基礎的開發到開發到大數據,推薦系統,到服務器運維,到數據庫維護,,,可愈發明白貪多嚼不爛的道理,唯有才能踏踏實實,趁著剛剛讀完這本書,想復習,順便寫一些筆記,聊以鞏固。 13年開始工作,14年畢業,兩年來的工作接觸知識面很廣,用的東西比較多,包括基礎的java開發到j2ee,web開發,到大數據,推薦系統,到服務器運維...

    legendaryedu 評論0 收藏0
  • 那些年我看過的書 —— 致敬我的大學生活 —— Say Good Bye !

    摘要:開頭正式開啟我入職的里程,現在已是工作了一個星期了,這個星期算是我入職的過渡期,算是知道了學校生活和工作的差距了,總之,盡快習慣這種生活吧。當時是看的廖雪峰的博客自己也用做爬蟲寫過幾篇博客,不過有些是在前人的基礎上寫的。 showImg(https://segmentfault.com/img/remote/1460000010867984); 開頭 2017.08.21 正式開啟我...

    xiaoqibTn 評論0 收藏0
  • Java進階之路

    摘要:探索專為而設計的將探討進行了何種改進,以及這些改進背后的原因。關于最友好的文章進階前言之前就寫過一篇關于最友好的文章反響很不錯,由于那篇文章的定位就是簡單友好,因此盡可能的摒棄復雜的概念,只抓住關鍵的東西來講,以保證大家都能看懂。 周月切換日歷 一個可以進行周月切換的日歷,左右滑動的切換月份,上下滑動可以進行周,月不同的視圖切換,可以進行事件的標記,以及節假日的顯示,功能豐富 Andr...

    sushi 評論0 收藏0
  • JVM從小白學成大佬】1.開篇

    摘要:的重要性毋庸置疑,可以毫不夸張的說虛擬機是整個平臺的基石。方面的知識,也一直是等大廠面試考核的重點。本專欄將分為如下幾個大模塊進行分析開篇介紹運行時數據區。最主要的是讓我知道能得到多少小伙伴的認可,畢竟大家的認可,就是不懈努力的動力 JVM的重要性毋庸置疑,可以毫不夸張的說Java虛擬機是整個Java平臺的基石。 JVM方面的知識,也一直是BAT等大廠面試考核的重點。特別是JVM調優,...

    姘存按 評論0 收藏0
  • 對比JVM GC算法的讀書筆記

    摘要:但是為了豐富引用的種類,以適應各種應用,中加入了中引用,但是除了強引用,其生命周期會有所不同,生存能力遞減。加載該類的已被回收。 GC面臨的問題有三個:哪些內存需要回收、什么時候回收和怎么回收 哪些內存需要回收,一般有兩種方法 引用計數 對每個對象都有個被引用的次數,單被引用的次數為0的時候,就表示對象需要被回收 引用計數的缺點是沒有辦法解決循環引用導致的內存泄露問題 ...

    FrozenMap 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<