奶头挺立呻吟高潮av全片,成人试看120秒体验区,性欧美极品v,A片高潮抽搐揉捏奶头视频

java語言

java中JVM虛擬機(jī)內(nèi)存模型詳細(xì)說明

時(shí)間:2024-09-07 07:47:51 java語言 我要投稿
  • 相關(guān)推薦

java中JVM虛擬機(jī)內(nèi)存模型詳細(xì)說明

  以下是百分網(wǎng)小編為大家收集的java中JVM虛擬機(jī)內(nèi)存模型詳細(xì)說明內(nèi)容,歡迎閱讀學(xué)習(xí)!

  JVM的內(nèi)部結(jié)構(gòu)如下圖:

  java中JVM虛擬機(jī)內(nèi)存模型詳細(xì)說明 - 天涯草 - 天涯草

  一個優(yōu)秀Java程序員,必須了解Java內(nèi)存模型、GC工作原理,以及如何優(yōu)化GC的性能、與GC進(jìn)行有限的交互,有一些應(yīng)用程序?qū)π阅芤筝^高,例如嵌入式系統(tǒng)、實(shí)時(shí)系統(tǒng)等,只有全面提升內(nèi)存的管理效率,才能提高整個應(yīng)用程序的性能。

  本文將從JVM內(nèi)存模型、GC工作原理,以及GC的幾個關(guān)鍵問題進(jìn)行探討,從GC角度提高Java程序的性能。

  1 java內(nèi)存分為:

  程序計(jì)數(shù)器(當(dāng)前線程所執(zhí)行字節(jié)碼的行號指示器,字節(jié)碼解釋器要通過改變這個計(jì)數(shù)器的值來選擇下一條字節(jié)碼指令,分支、循環(huán)、異常處理等。每條線程都有一條獨(dú)立的程序計(jì)數(shù)器,屬于線程私有的內(nèi)存區(qū))、

  java虛擬機(jī)棧(也是線私有的,存儲局部變量、操作棧,每個方法執(zhí)行時(shí)創(chuàng)建一個棧幀,執(zhí)行過程就是棧的出棧入棧操作)、

  本地方法棧(執(zhí)行native方法)、

  年輕代堆(eden、from survivor、to survivor)、年老代堆(經(jīng)過幾次垃圾回收,保存下來的)、

  持久代堆(也叫方法區(qū),保存常量池和類型數(shù)據(jù)信息,不會被回收)、

  直接內(nèi)存(使用native方法直接分配堆外內(nèi)存,再通過堆內(nèi)的DirectByteBuffer作為這塊內(nèi)存的引用進(jìn)行操作)

  2 對象訪問有兩種:通過句柄池和直接通過指針,句柄池的好處是垃圾回收后,不需要改變對象引用,只要改變句柄引用;直接指針的好處是效率較高。

  引用《深入java虛擬機(jī)第二章》

  解釋了minor gc和major gc,和兩個survivor區(qū)之于復(fù)制收集算法的意義

  3 jvm內(nèi)存機(jī)制

  java內(nèi)存中的四種引用解析,強(qiáng)引用、弱引用、軟引用、虛引用

  4 垃圾回收算法

  4.1 引用計(jì)數(shù),效率高,但是無法解決無用對象循環(huán)引用的問題。及時(shí)引用計(jì)數(shù)大于0,但卻不可用。

  4.2 根對象可達(dá),java虛擬機(jī)使用的方式。可以作為根對象的有:虛擬機(jī)棧幀中引用的對象,方法區(qū)中(持久區(qū))類靜態(tài)屬性引用的對象(類靜態(tài)屬性在創(chuàng)建實(shí)例之前就已經(jīng)為這個屬性分配好空間,創(chuàng)建好實(shí)例,在所有的類實(shí)例中共享),方法區(qū)中常量引用的對象(比如常量字符串),本地方法棧中引用的對象(native方法)。

  4.3 引用強(qiáng)度,強(qiáng)(即傳統(tǒng)理解的引用,obj=new obj()),軟(softReference,在內(nèi)存溢出之前,GC會將這部分納入回收范圍,進(jìn)行二次回收,如果還是沒有足夠內(nèi)存,那么OOM),弱(weakReference,一旦GC進(jìn)行回收,無論內(nèi)存是否充足都會被回收),虛(有虛引用不會影響生命周期,無法通過虛引用來獲得一個對象,唯一作用是對象被回收時(shí)能得到一個系統(tǒng)通知,PhantomReference)

  4.4 對象在回收之前會調(diào)用僅有一次finalize(),可以在finalize中自救,把自己被引用。只有當(dāng)對象覆蓋finalize()方法才會被放入執(zhí)行finalize()的隊(duì)列。不建議使用這個,可以用try{} finally代替。

  4.5 java回收算法

  標(biāo)記清除法,效率低下,會產(chǎn)生內(nèi)存碎片。

  復(fù)制收集算法,較為主流的算法,分區(qū),eden,survivor,將未被回收的對象移動到survivor區(qū),然后一次性清理eden區(qū)。這種算法適用于對象存活率不高的情況,要犧牲一部分分配空間,一般來說eden:survivor=8:1。

  當(dāng)對象存活率很高的時(shí)候,復(fù)制收集算法的效率會出現(xiàn)問題,所以有了標(biāo)記-整理算法。把所有存活對象整理到一端,再把另一端直接清理掉。

  分代算法,java內(nèi)存一般都分為新生代和年老代,根據(jù)兩個區(qū)域?qū)ο蟠婊盥实奶攸c(diǎn),分別采用了復(fù)制-收集算法和標(biāo)記-清理(標(biāo)記-整理)算法。

  4.6 垃圾收集器

  serial收集器,單線程收集。很可惡,會停掉其他用戶線程。糟糕的用戶體驗(yàn)。但是適用于client端,因?yàn)楫a(chǎn)生的垃圾量少,回收快,幾十毫秒解決。

  parNew收集器,和serial一樣。區(qū)別是收集時(shí)采用多線程機(jī)制。

  CMS收集器,可以讓收集線程和用戶線程并發(fā)執(zhí)行,可惜的是作為年老代的收集器,只能和上面兩個不靠譜的收集器一起配合使用。它是以最短停頓時(shí)間為目標(biāo)的年老代收集器,使用mark-sweep算法(標(biāo)記-清除)。回收步驟是初始標(biāo)記(stop world),并發(fā)標(biāo)記,重新標(biāo)記(stop world),并發(fā)清除。stop world的時(shí)間很短,所以可以認(rèn)為是用戶線程并發(fā)的收集器。

  parallel scavenge收集器,是并發(fā)收集器,可以和用戶線程并存。可以通過參數(shù)控制吞吐量=用戶線程時(shí)間/(用戶時(shí)間+垃圾收集時(shí)間),前臺程序適用低吞吐量,減少用戶操作每次停頓的時(shí)間;而后臺程序適用于高吞吐量,盡快完成后臺的計(jì)算。也稱作吞吐量優(yōu)先收集器。該收集器還能設(shè)置自適應(yīng)模式,會根據(jù)實(shí)際情況動態(tài)調(diào)整吞吐量。

  serial old收集器和serial一樣,用于年老代收集。使用標(biāo)記整理算法。

  parallel old收集器,用于和parallel scavenge配合使用的年老代收集器,是parallel scavenge的最佳搭檔。

  G1(garbage first)收集器,最前沿的,jdk1.6進(jìn)入試用期。采用標(biāo)記-整理算法,并且對新生區(qū)分區(qū),分區(qū)有不同的優(yōu)先級,優(yōu)先收集內(nèi)存較滿的區(qū)域。有著很高的并發(fā)和較低的停頓,也算是敏捷的一種收集器。

  5 基本經(jīng)驗(yàn)

  minor gc是運(yùn)行在新生代的gc,major GC是運(yùn)行在年老代的GC,比minor慢十倍。

  大對象很有可能直接進(jìn)入年老代,程序中盡量避免短命大對象(數(shù)組、列表)。

  一次minor沒被收集,從eden進(jìn)入survivor,每過一次GC,survivor加一歲,直到N歲進(jìn)入年老區(qū)。

  根據(jù)GC的工作原理,我們可以通過一些技巧和方式,讓GC運(yùn)行更加有效率,更加符合應(yīng)用程序的要求。一些關(guān)于程序設(shè)計(jì)的幾點(diǎn)建議:

  1)最基本的建議就是盡早釋放無用對象的引用。大多數(shù)程序員在使用臨時(shí)變量的時(shí)候,都是讓引用變量在退出活動域(scope)后,自動設(shè)置為 null.我們在使用這種方式時(shí)候,必須特別注意一些復(fù)雜的對象圖,例如數(shù)組,隊(duì)列,樹,圖等,這些對象之間有相互引用關(guān)系較為復(fù)雜。對于這類對象,GC 回收它們一般效率較低。如果程序允許,盡早將不用的引用對象賦為null,這樣可以加速GC的工作。

  2)盡量少用finalize函數(shù)。finalize函數(shù)是Java提供給程序員一個釋放對象或資源的機(jī)會。但是,它會加大GC的工作量,因此盡量少采用finalize方式回收資源。

  3)如果需要使用經(jīng)常使用的圖片,可以使用soft應(yīng)用類型。它可以盡可能將圖片保存在內(nèi)存中,供程序調(diào)用,而不引起OutOfMemory.

  4)注意集合數(shù)據(jù)類型,包括數(shù)組,樹,圖,鏈表等數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)對GC來說,回收更為復(fù)雜。另外,注意一些全局的變量,以及一些靜態(tài)變量。這些變量往往容易引起懸掛對象(dangling reference),造成內(nèi)存浪費(fèi)。

  5)當(dāng)程序有一定的等待時(shí)間,程序員可以手動執(zhí)行System.gc(),通知GC運(yùn)行,但是Java語言規(guī)范并不保證GC一定會執(zhí)行。使用增量式GC可以縮短Java程序的暫停時(shí)間。

【java中JVM虛擬機(jī)內(nèi)存模型詳細(xì)說明】相關(guān)文章:

Java的內(nèi)存模型09-22

java內(nèi)存的詳細(xì)介紹06-04

Linux系統(tǒng)中JVM內(nèi)存2GB上限的詳解09-03

Java虛擬機(jī)介紹07-12

Java內(nèi)存回收07-17

java虛擬機(jī)的故障處理摘要09-25

Java虛擬機(jī)垃圾收集算法08-13

Java內(nèi)存區(qū)域的使用詳解08-28

Java線程編程中的主線程詳細(xì)介紹09-05

Java虛擬機(jī)垃圾收集算法簡介09-15

主站蜘蛛池模板: 招远市| 汤阴县| 民乐县| 榆社县| 新化县| 右玉县| 香格里拉县| 天台县| 古蔺县| 永德县| 安新县| 鄂托克旗| 寿光市| 柘城县| 雷波县| 新河县| 虎林市| 彭泽县| 缙云县| 建平县| 阳城县| 阿图什市| 遂昌县| 沧源| 丹凤县| 泾源县| 华坪县| 云安县| 开封市| 蒙城县| 同江市| 琼结县| 连平县| 临安市| 航空| 比如县| 秭归县| 无为县| 望都县| 新兴县| 襄垣县|