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

資訊專欄INFORMATION COLUMN

jvm體系結構和gc調優(一)

wupengyu / 610人閱讀

摘要:做好的優化能大大提升系統的性能體系結構概覽大致流程如圖編譯好的文件通過類加載器從物理結構轉換成運行時數據區結構。后面再寫一篇關于調優的

什么是jvm

jvm是java虛擬機的縮寫。所有的java程序都是在jvm上運行的。做好jvm的優化能大大提升系統的性能

jvm體系結構概覽

大致流程如圖:編譯好的class文件通過類加載器從物理結構轉換成運行時數據區結構。再通過jvm內置執行引擎和本地方法的調用實現 ps:本地方法就是帶有native關鍵字的方法

其中方法區和堆是最重要的兩塊區域(這里是以java7為參照。java8沒有方法區)
因為這兩塊是gc算法作用的最主要區域

gc算法

如果需要收集垃圾,則必須先找到垃圾。

1.引用計數法

解釋:每個對象都帶有一個引用計數器,當其他聲明的變量指向這個對象時候,計數器就+1,當指向消逝時候,就將計數器-1.垃圾回收只回收計數為0的對象。
缺點:無法回收循環引用的情況,比如A引用了B,B引用了C,C引用了A. 這種GC算法還需要編譯器進行配合,對對象引用進行計數,需要額外生成代碼。

2.可達性分析

解釋:設立若干個根對象,當一個對象不能通過任何根對象引用達到,那么這個對象在finalize中有一次可以請求“重生”機會,或者直接忽略finalize,選擇直接死亡。

找到垃圾后,開始垃圾收集

標記清除算法

簡單解釋下:首先標記出所有需要回收的對象,在標記完成后統一回收掉所有被標記的對象。它的主要缺點有兩個:一個是效率問題,標記和清除過程的效率都不高;另外一個是空間問題,標記清除之后會產生大量不連續的內存碎片,空間碎片太多可能會導致,當程序在以后的運行過程中需要分配較大對象時無法找到足夠的連續內存而不得不提前觸發另一次垃圾收集動作

這是最基本的gc算法,后續的gc算法都是根據這種思路來改進的

標記壓縮算法

標記過程仍然與“標記-清除”算法一樣,但后續步驟不是直接對可回收對象進行清理,而是讓所有存活的對象都向一端移動,然后直接清理掉端邊界以外的內存

復制算法

將可用內存按容量劃分為大小相等的兩塊,每次只使用其中的一塊。當這一塊的內存用完了,就將還存活著的對象復制到另外一塊上面,然后再把已使用過的內存空間一次清理掉。

分代收集算法

把Java堆分為新生代和老年代,這樣就可以根據各個年代的特點采用最適當的收集算法。在新生代中,每次垃圾收集時都發現有大批對象死去,只有少量存活,那就選用復制算法,只需要付出少量存活對象的復制成本就可以完成收集。而老年代中因為對象存活率高、沒有額外空間對它進行分配擔保,就必須使用“標記-清理”或“標記-整理”算法來進行回收。
這里總共會有三種gc


不同的gc使用不同的gc算法

注:默認新生代eden區和survivor區比例為8:1:1

火車算法

最先進的g1收集器使用的gc算法,相對于分代收集,它的分區處理更徹底

在火車算法中,內存被分為塊,多個塊組成一個集合。為了形象化,一節車廂代表一個塊,一列火車代表一個集合,火車與車箱都按創建順序標號,每個車廂大小相等,但每個火車包含的車廂數不一定相等;每節車箱有一個被記憶集合,而每輛火車的記憶集合是它所有車廂記憶集合的總和;算法在執行時,要么收集最小數字車廂,要么收集最小數字火車。如果整節火車都是垃圾,就收集最小數字火車。

現有該場景

內存分為四塊。 其中F,C,D,E是垃圾。G,A,B存活對象
首先掃描第一塊內存。發現G是存活對象,F是垃圾。利用記憶集合將G的應用存到最后一塊內存
回收第一塊內存

如果再次發生gc,則同樣掃描第二塊內存。發現A,B都是存活對象,都移到最后一塊內存。回收第二塊內存

因為火車算法是將一塊內存的對象移到另一塊內存上并清除原來的內存。很像復制算法。
所以火車算法就被稱為局部復制,外部標記清理

火車算法的問題

如果要保存一個比內存塊大的對象怎么辦

如果兩個對象在不同內存塊相互調用怎么辦

垃圾回收器 垃圾收集器一覽

術語

新生代垃圾收集器

serial (串行收集器) 特點

串行,stop the world

適用場景

單cpu,新生代內存小,對暫停時間要求不高的應用
是client和32位windows的默認垃圾收集器

對象分配到old區的情況

對象大于eden區

大對象直接分到old區

晉升規則

經歷多次gc后仍存活的對象

to survivor區裝不下直接晉升

parallel scanvenge收集器 特點

并行,stop the world
并行線程數默認值:cpu <= 8 則 線程數=cpu數 cpu>8 則(3+cpu*5)/8
可自定義線程數 :

適用場景

多cpu,對暫停時間較短的應用
是server和2核cpu,2g內存的默認選擇

對象分配到old區的情況

在eden區分配失敗,且對象大于eden的一半

大對象直接分到old區

晉升規則

經歷多次gc后仍存活的對象

to survivor區裝不下直接晉升

parnew 特點

并行,stop the world
serial的多線程版
可搭配cms
不能搭配parllel old

適用場景

多cpu,對暫停時間較短的應用
是server和2核cpu,2g內存的默認選擇

對象分配到old區的情況

對象大于eden區

大對象直接分到old區

晉升規則

經歷多次gc后仍存活的對象

to survivor區裝不下直接晉升

老年代垃圾收集器

serial old 特點

串行,stop the world ,標記整理算法,清除時間長

適用場景

是client和32位windows的默認垃圾收集器

parallel old 特點

串行,stop the world ,標記整理算法

適用場景

是server和2核cpu,2g內存的默認選擇

cms 特點

并行,并發,標記清理算法
默認并發線程數:(新生代并行線程數+3)/4

適用場景

暫停時間短,很適用于追求高響應速度的互聯網引用

執行步驟

缺點

和應用搶占cpu

gc耗時長

浮動垃圾

內存碎片

第一篇先到這兒了。先消化一下。后面再寫一篇關于調優的

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

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

相關文章

  • JVM體系結構GC調優(二)

    摘要:在設計堆的大小時。設計為比更大的數前提是內存允許。這樣既可以降低堆調整的頻率,還可以提高系統的負載能力新生代調優大小增大區。因為時間跟存活對象成正比新生代調優晉升盡可能讓對象停留在中。 jvm支持的垃圾收集器組合 showImg(https://segmentfault.com/img/bVbbcTv?w=1101&h=351); 組合選擇的標準 吞吐量=應用運行時間/總時間 關...

    DirtyMind 評論0 收藏0
  • 面試官問我JVM調優,我忍不住了!

    面試官:今天要不來聊聊JVM調優相關的吧?面試官:你曾經在生產環境下有過調優JVM的經歷嗎?候選者:沒有面試官:...候選者:嗯...是這樣的,我們一般優化系統的思路是這樣的候選者:1. 一般來說關系型數據庫是先到瓶頸,首先排查是否為數據庫的問題候選者:(這個過程中就需要評估自己建的索引是否合理、是否需要引入分布式緩存、是否需要分庫分表等等)候選者:2. 然后,我們會考慮是否需要擴容(橫向和縱向都...

    不知名網友 評論0 收藏0
  • JVM調優之經驗

    摘要:內存設置現在線上業務系統基本物理內存都是夠用的,不過物盡其用,我們調優就是爭取讓每空間都發揮出最大的作用。區總內存減去一個區的大小不宜過大,否則可能把物理內存耗光。 在生產系統中,高吞吐和低延遲一直都是JVM調優的最終目標,但這兩者恰恰又是相悖的,魚和熊掌不可兼得,所以在調優之前要清楚舍誰而取誰。一般計算任務和組件服務會偏向高吞吐,而web展示則偏向低延遲才會帶來更好的用戶體驗。 本文...

    worldligang 評論0 收藏0
  • [譯]GC專家系列3-GC調優

    摘要:原文鏈接本篇是專家系列的第三篇。但是,請記住調優是不得已時的選擇。縮短耗時的單次執行與相比,耗時有較明顯的增加。創建文件過程中,進程會中斷,因此不要在正常運行時系統上做此操作。因此校驗結果并根據具體的服務需要,決定是否要進行調優。 原文鏈接:http://www.cubrid.org/blog/dev-platform/how-to-tune-java-garbage-collecti...

    leap_frog 評論0 收藏0
  • jvm調優

    摘要:一內存調優主要的目的是減小的頻率和的次數。調優工具之主要用來輸出中運行的進程狀態信息。調優工具之和用來查看堆內存使用狀況,一般結合使用。 一、jvm內存調優 主要的...

    snowLu 評論0 收藏0

發表評論

0條評論

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