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

資訊專欄INFORMATION COLUMN

JAVA虛擬機

edagarli / 1105人閱讀

摘要:它一般運行在模式下的虛擬機。設置最大垃圾收集停頓時間設置吞吐量大小開關參數,打開以后就由虛擬機自動調節策略。

Java內存區域

    程序計數器:當前線程所執行字節碼的行號指示器,字節碼解釋器工作時就是通過改變這個計數器的值來選取下一條需要執行的字節碼指令

    虛擬機棧:指我們平常所說的堆棧中的棧(或者說是虛擬機棧中的局部變量部分),線程私有的,生命周期與線程相同。用來描述Java方法執行的內存模型,用于存儲局部變量表、操作棧、動態鏈接、方法出口等信息

    本地方法棧:跟虛擬機棧類似,不過本地方法棧是為虛擬機使用到的Native方法服務

    堆:被所有線程共享的一塊內存區域,用來存放對象實例以及對象類型數據的地址信息,如果堆中沒有內存完成實例分配,并且堆也無法再擴展時,將會拋出OutOfMemoryError異常

    方法區:跟堆一樣,是各個線程共享的內存區域,用來存儲類信息(對象類型、父類、實現的接口、方法等)、常量、靜態變量,其中方法區還包含一個運行時常量池,用來存儲編譯期生成的各種字面量和符號引用

垃圾收集器及內存分配策略

對象存活判斷

垃圾回收主要是回收堆內存。在垃圾回收期(GC)回收之前,需要確定哪些對象可以回收,有以下幾種方法:

    引用計數算法
    原理:給對象添加一個引用計數器,每當有一個地方引用它時,計數器值就加1;當引用失效時,計數器值就減1;任何時刻計數器都為0的對象就是不可能再被使用的。這種算法效率高。不過很難解決對象之間的相互循環引用的問題。

    根搜索算法(默認)
    原理:通過一系列的名為“GC Roots”的對象作為起始點,從這些節點開始向下搜索,搜索所走過的路徑稱為引用鏈,當一個對象到GC Roots沒有任何引用鏈相連時,則證明此對象是不可用的。作為GC Roots的對象包括以下幾種:

    虛擬機棧中的引用的對象

    方法區中的類靜態屬性引用的對象

    方法區中的常量引用的對象

    本地方法棧中JNI的引用的對象

引用

強引用,類似"Object obj = new Object()"這種,只要強引用存在,則GC永遠不會回收被引用的對象

軟引用,指還有用,但是并非必須的對象,內存溢出之前進行回收,實現軟引用可以通過SoftReference類,軟引用主要用戶實現類似緩存的功能,在內存足夠的情況下直接通過軟引用取值,無需從繁忙的真實來源查詢數據,提升速度;當內存不足時,自動刪除這部分緩存數據,從真正的來源查詢這些數據。

弱引用,跟軟引用一樣,不過強度比軟引用弱一些,第二次垃圾回收時回收,實現弱引用可以通過WeakReference類,弱引用主要用于監控對象是否已經被垃圾回收器標記為即將回收的垃圾,可以通過弱引用的isEnQueued方法返回對象是否被垃圾回收器標記。

虛引用,是最弱的一種引用關系,垃圾回收時回收,無法通過引用取到對象值。主要用于檢測對象是否已經從內存中刪除。

垃圾收集算法

    標記-清除算法:首先標記出所有需要回收的對象,在標記完成后統一回收所有被標記的對象,不過該算法有以下缺點:

    效率低

    空間問題,該算法會產生大量不連續的內存碎片,這樣導致程序在以后的運行中如果需要分配較大對象時無法找到足夠的連續內存而觸發另一次垃圾收集動作

    復制算法:將可用內存按容量劃分大小相等的兩塊,每次只使用其中的一塊。當一塊內存用完了,就將還存活的對象復制到另外一塊上面,然后再把已使用過的內存空間一次清理掉。這種算法實現簡單,效率高,不過會將可使用的內存減少一半。如果對象存活率高就要執行較多的復制操作,將導致效率變低。目前在復制算法中,通常是將內存分為一塊較大的Eden空間和兩塊較小的Survivor空間,每次只使用Eden和一塊Survivor。當回收時,將Eden和Survivor中還存活的對象一次性拷貝到另外一塊Survivor中,最后清理使用的Eden和Survivor。并且以老年代作為空間分配擔保,即Survivor無法容納的對象會直接進入老年代。目前新生代主要采用這個算法。

    標記-整理算法:將所有存活的對象都向一端移動,然后直接清理掉邊界以外的內存。

    分代收集算法:根據對象的存活周期的不同將內存劃分為幾塊,一般是分為新生代和老年代。然后根據各個年代的特點采用最適當的收集算法。新生代通常采用復制算法,因為對象生存時間都不長。老年代一般采用"標記-清理"或者"標記-整理"算法回收,因為老年代中對象存活率高,沒有額外空間對它進行分配擔保。

垃圾收集器

    Serial收集器:這是一個單線程的收集器,該收集器在進行垃圾收集時,必須暫停其它所有的工作線程,不過該收集器簡單而高效。它一般運行在Client模式下的虛擬機。新生代收集器。

    ParNew收集器:這是一個多線程版本的Serial收集器。新生代收集器。

    Parallel Scavenge收集器:新生代收集器,使用復制算法,并行多線程。它主要是控制吞吐量=(運行用戶代碼時間)/(運行用戶代碼時間+垃圾收集時間)。有兩個參數可以用來精確控制吞吐量。

    -XX:MaxGCPauseMillis:設置最大垃圾收集停頓時間

    -XX:GCTimeRatio:設置吞吐量大小

    -XX:+UseAdaptiveSizePolicy:開關參數,打開以后就由虛擬機自動調節策略。這也是跟ParNew收集器的一個重要區別

    Serial Old收集器:這是Serial收集器的老年代版本,使用"標記-整理"算法,該收集器有兩大用途,一是與Parallel Scavenge收集器搭配使用。二是作為CMS收集器的后備預案,在并發收集發生Concurrent Mode Failure的時候使用。

    Parallel Old收集器:是Parallel Scavenge收集器的老年代版本。使用"標記-整理"算法。

    CMS收集器:以獲取最短回收停頓時間為目標的收集器。重視服務的響應速度。主要用于互聯網或B/S系統的服務端上。基于"標記-清除"算法。老年代收集器。使用CMS收集器時,不能像其它收集器那樣等到老年代幾乎被填滿了再進行收集,需要預留一部分空間提供并發收集時的程勛運行使用。主要優點就是并發收集、低停頓。它有以下缺點:

    對CPU資源非常敏感

    無法處理浮動垃圾。即在垃圾收集階段用戶線程繼續進行,這個過程會有新的垃圾產生,但是CMS收集器不會對這部分垃圾(浮動垃圾)進行標記。如果預留的內存空間不足,就會導致Concurrent Mode Failure。這時會臨時啟動Serial Old收集器重新進行老年代的垃圾收集,導致停頓時間過長。

    由于采用的算法,會導致收集結束時產生大量空間碎片。

    G1收集器:基于"標記-整理"算法實現。可以非常精確的控制停頓,并且在不犧牲吞吐量的前提下完成低停頓的內存回收。因為該收集器會將整個java堆劃分為多個大小固定的獨立區域,并且跟蹤這些區域的垃圾堆積程度,每次根據允許的收集時間,優先回收垃圾最多的區域。 垃圾收集相關的常用參數參見下圖:

內存分配

    對象首先在新生代Eden區分配,當Eden沒有足夠的空間進行分配時,虛擬機將發起一次MinorGC

    大對象直接進入老年代,通過-XX:PretenureSizeThreshold參數區分,大于這個值的表示大對象,該參數只對Serial和ParNew有效

    長期存活的對象將進入老年代,識別對象長期存活通過參數-XX:MaxTenuringThreshold設定,對于每個對象而言,虛擬機都會定義一個年齡計數器,如果對象在經過第一次MinorGC后仍然存活,并且能夠被Survivor容納的話,就將被移動到Survivor中,并且年齡增加一歲。每經過一次MinorGC,年齡就增加一歲,超過設定值或者默認值(15),就會進入老年代中。

名詞解釋

    MinorGC:指發生在新生代的垃圾收集動作,頻繁,速度快

    MajorGC/Full GC:指發生在老年代的GC,速度慢

    大對象:需要大量連續內存空間的Java對象,比如很長的字符串及數組,應當避免短命的大對象

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

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

相關文章

  • 深入理解Java虛擬到底是什么

    摘要:由虛擬機加載的類,被加載到虛擬機內存中之后,虛擬機會讀取并執行它里面存在的字節碼指令。虛擬機中執行字節碼指令的部分叫做執行引擎。 什么是Java虛擬機? 作為一個Java程序員,我們每天都在寫Java代碼,我們寫的代碼都是在一個叫做Java虛擬機的東西上執行的。但是如果要問什么是虛擬機,恐怕很多人就會模棱兩可了。在本文中,我會寫下我對虛擬機的理解。因為能力所限,可能有些地方描述的不夠欠...

    宋華 評論0 收藏0
  • 《深入理解Java虛擬》(一)Java虛擬發展史

    摘要:虛擬機發展史注本文大部分摘自深入理解虛擬機第二版作為一名開發人員,不能局限于語言規范,更需要對虛擬機規范有所了解。虛擬機規范有多種實現,其中是和中所帶的虛擬機,也是目前使用范圍最廣的虛擬機。世界第一款商用虛擬機。號稱世界上最快的虛擬機。 Java虛擬機發展史 注:本文大部分摘自《深入理解Java虛擬機(第二版)》 作為一名Java開發人員,不能局限于Java語言規范,更需要對Java虛...

    張春雷 評論0 收藏0
  • 《深入理解Java虛擬》(二)Java虛擬運行時數據區

    摘要:虛擬機運行時數據區分為以下幾個部分。程序計數器也是在虛擬機規范中唯一沒有規定任何異常情況的區域。在方法運行期間不會改變局部變量表的大小。長度在位和位的虛擬機中,分別為官方稱它為。 Java虛擬機運行時數據區 詳解 2.1 概述 本文參考的是周志明的 《深入理解Java虛擬機》第二章 ,為了整理思路,簡單記錄一下,方便后期查閱。 2.2 運行時數據區域 Java虛擬機在Java程序運行時...

    draveness 評論0 收藏0
  • Java虛擬規范(介紹)

    摘要:此處指定的虛擬機與平臺兼容,并支持語言規范中指定的編程語言。第章說明了虛擬機的指令集,按字母順序顯示操作碼助記符。 介紹 一點歷史 Java?編程語言是一種通用的、并發的、面向對象的語言,它的語法類似于C和C++,但它省略了許多使C和C++復雜、混亂和不安全的特性。最初開發Java平臺是為了解決為聯網的消費者設備構建軟件的問題,它旨在支持多種主機架構,并允許安全交付軟件組件,為了滿足這...

    chnmagnus 評論0 收藏0
  • 【JVM從小白學成大佬】2.Java虛擬運行時數據區

    摘要:虛擬機在執行程序的過程中會把它所管理的內存劃分為若干個不同的數據區域。棧幀棧幀是用于支持虛擬機進行方法調用和方法執行的數據結構,它是虛擬機運行時數據區中的虛擬機棧的棧元素。棧幀的概念結構如下運行時數據區腦圖高 這里我們先說句題外話,相信大家在面試中經常被問到介紹Java內存模型,我在面試別人時也會經常問這個問題。但是,往往都會令我比較尷尬,我還話音未落,面試者就會背誦一段(Java虛擬...

    shuibo 評論0 收藏0
  • Java虛擬規范(Java虛擬的結構)

    摘要:原始類型和值虛擬機支持的原始數據類型是數字類型布爾類型和類型。,其值為位帶符號的二進制補碼整數,其默認值為零。 Java虛擬機的結構 本文檔指定了一個抽象機器,它沒有描述Java虛擬機的任何特定實現。 要正確實現Java虛擬機,你只需要能夠讀取類文件格式并正確執行其中指定的操作,不屬于Java虛擬機規范的實現細節會不必要地限制實現者的創造力。例如,運行時數據區的內存布局、使用的垃圾收集...

    bang590 評論0 收藏0

發表評論

0條評論

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