欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

JVM內存模型以及垃圾收集策略解析

系統 1878 0

一JVM內存模型

1.1Java棧

Java棧是與每一個線程關聯的,JVM在創建每一個線程的時候,會分配一定的棧空間給線程。它主要用來存儲線程執行過程中的局部變量,方法的返回值,以及方法調用上下文。棧空間隨著線程的終止而釋放。

StackOverflowError:如果在線程執行的過程中,棧空間不夠用,那么JVM就會拋出此異常,這種情況一般是死遞歸造成的。

1.2堆

Java中堆是由所有的線程共享的一塊內存區域,堆用來保存各種JAVA對象,比如數組,線程對象等。

1.2.1Generation

JVM堆一般又可以分為以下三部分:

?Perm

Perm代主要保存class,method,filed對象,這部門的空間一般不會溢出,除非一次性加載了很多的類,不過在涉及到熱部署的應用服務器的時候,有時候會遇到java.lang.OutOfMemoryError:PermGenspace的錯誤,造成這個錯誤的很大原因就有可能是每次都重新部署,但是重新部署后,類的class沒有被卸載掉,這樣就造成了大量的class對象保存在了perm中,這種情況下,一般重新啟動應用服務器可以解決問題。

?Tenured

Tenured區主要保存生命周期長的對象,一般是一些老的對象,當一些對象在Young復制轉移一定的次數以后,對象就會被轉移到Tenured區,一般如果系統中用了application級別的緩存,緩存中的對象往往會被轉移到這一區間。

?Young

Young區被劃分為三部分,Eden區和兩個大小嚴格相同的Survivor區,其中Survivor區間中,某一時刻只有其中一個是被使用的,另外一個留做垃圾收集時復制對象用,在Young區間變滿的時候,minorGC就會將存活的對象移到空閑的Survivor區間中,根據JVM的策略,在經過幾次垃圾收集后,任然存活于Survivor的對象將被移動到Tenured區間。

1.2.2SizingtheGenerations

JVM提供了相應的參數來對內存大小進行配置。

正如上面描述,JVM中堆被分為了3個大的區間,同時JVM也提供了一些選項對Young,Tenured的大小進行控制。

?TotalHeap

-Xms:指定了JVM初始啟動以后初始化內存

-Xmx:指定JVM堆得最大內存,在JVM啟動以后,會分配-Xmx參數指定大小的內存給JVM,但是不一定全部使用,JVM會根據-Xms參數來調節真正用于JVM的內存

-Xmx-Xms之差就是三個Virtual空間的大小

?YoungGeneration

-XX:NewRatio=8意味著tenured和young的比值8:1,這樣eden+2*survivor=1/9

堆內存

-XX:SurvivorRatio=32意味著eden和一個survivor的比值是32:1,這樣一個Survivor就占Young區的1/34.

-Xmn參數設置了年輕代的大小

?PermGeneration

-XX:PermSize=16M-XX:MaxPermSize=64M

Thread Stack

-XX:Xss=128K

1.3堆棧分離的好處

呵呵,其它的先不說了,就來說說面向對象的設計吧,當然除了面向對象的設計帶來的維護性,復用性和擴展性方面的好處外,我們看看面向對象如何巧妙的利用了堆棧分離。如果從JAVA內存模型的角度去理解面向對象的設計,我們就會發現對象它完美的表示了堆和棧,對象的數據放在堆中,而我們編寫的那些方法一般都是運行在棧中,因此面向對象的設計是一種非常完美的設計方式,它完美的統一了數據存儲和運行。

二JAVA垃圾收集器

2.1垃圾收集簡史

垃圾收集提供了內存管理的機制,使得應用程序不需要在關注內存如何釋放,內存用完后,垃圾收集會進行收集,這樣就減輕了因為人為的管理內存而造成的錯誤,比如在C++語言里,出現內存泄露時很常見的。

Java語言是目前使用最多的依賴于垃圾收集器的語言,但是垃圾收集器策略從20世紀60年代就已經流行起來了,比如Smalltalk,Eiffel等編程語言也集成了垃圾收集器的機制。

2.2常見的垃圾收集策略

所有的垃圾收集算法都面臨同一個問題,那就是找出應用程序不可到達的內存塊,將其釋放,這里面得不可到達主要是指應用程序已經沒有內存塊的引用了,而在JAVA中,某個對象對應用程序是可到達的是指:這個對象被根(根主要是指類的靜態變量,或者活躍在所有線程棧的對象的引用)引用或者對象被另一個可到達的對象引用。

2.2.1ReferenceCounting(引用計數)

引用計數是最簡單直接的一種方式,這種方式在每一個對象中增加一個引用的計數,這個計數代表當前程序有多少個引用引用了此對象,如果此對象的引用計數變為0,那么此對象就可以作為垃圾收集器的目標對象來收集。

優點:

簡單,直接,不需要暫停整個應用

缺點:

1.需要編譯器的配合,編譯器要生成特殊的指令來進行引用計數的操作,比如每次將對象賦值給新的引用,或者者對象的引用超出了作用域等。

2.不能處理循環引用的問題

2.2.2跟蹤收集器

跟蹤收集器首先要暫停整個應用程序,然后開始從根對象掃描整個堆,判斷掃描的對象是否有對象引用,這里面有三個問題需要搞清楚:

1.如果每次掃描整個堆,那么勢必讓GC的時間變長,從而影響了應用本身的執行。因此在JVM里面采用了分代收集,在新生代收集的時候minorgc只需要掃描新生代,而不需要掃描老生代。

2.JVM采用了分代收集以后,minorgc只掃描新生代,但是minorgc怎么判斷是否有老生代的對象引用了新生代的對象,JVM采用了卡片標記的策略,卡片標記將老生代分成了一塊一塊的,劃分以后的每一個塊就叫做一個卡片,JVM采用卡表維護了每一個塊的狀態,當JAVA程序運行的時候,如果發現老生代對象引用或者釋放了新生代對象的引用,那么就JVM就將卡表的狀態設置為臟狀態,這樣每次minorgc的時候就會只掃描被標記為臟狀態的卡片,而不需要掃描整個堆。具體如下圖:

3.GC在收集一個對象的時候會判斷是否有引用指向對象,在JAVA中的引用主要有四種:Strongreference,Softreference,Weakreference,Phantomreference.

?StrongReference

強引用是JAVA中默認采用的一種方式,我們平時創建的引用都屬于強引用。如果一個對象沒有強引用,那么對象就會被回收。

publicvoidtestStrongReference(){

Objectreferent=newObject();

ObjectstrongReference=referent;

referent=null;

System.gc();

assertNotNull(strongReference);

}

?SoftReference

軟引用的對象在GC的時候不會被回收,只有當內存不夠用的時候才會真正的回收,因此軟

JVM內存模型以及垃圾收集策略解析


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日韩三级伦理在线 | 欧美综合一区二区 | 成人免费一区二区三区视频网站 | 精品视频在线观看视频免费视频 | 一级做a | 国产精品人人做人人爽 | 鲁丝片一区二区三区毛片 | 亚洲一区二区三区四区五区中文 | 久操成人| 波多久久夜色精品国产 | 色婷婷色综合缴情在线 | japanese末成年free | 精品一区二区在线观看视频 | 久久免费福利 | 久久免费福利 | 涩久久 | 国产成人福利 | 精品久久久影院 | 亚洲天天综合色制服丝袜在线 | 日本精品a在线观看 | 亚洲一区二区三区在线播放 | 三及片在线观看 | 久久国产精品亚洲 | 精品久久久久久一区二区 | 久久视屏这里只有精品6国产 | 国产精品久久久久国产精品 | 三级黄毛片 | 日本久久高清视频 | 奇米色777 | 91看片片| 亚洲伊人精品 | 午夜视频在线免费观看 | 免费看污又色又爽又黄视频 | 奇米影视在线视频 | 国产精品一区二 | 日韩精品视频美在线精品视频 | 色综合色综合 | 国产精品视频网站 | 国产精品一区二区三区久久 | 日本黄视色视频在线观看 | 天天操网 |