欧美日韩不卡一区二区三区,www.蜜臀.com,高清国产一区二区三区四区五区,欧美日韩三级视频,欧美性综合,精品国产91久久久久久,99a精品视频在线观看

java語(yǔ)言

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

時(shí)間:2024-12-31 17:27:47 java語(yǔ)言 我要投稿

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

  Java虛擬機(jī)的內(nèi)存區(qū)域中,程序計(jì)數(shù)器、虛擬機(jī)棧和本地方法棧三個(gè)區(qū)域是線程私有的,隨線程生而生,隨線程滅而滅;棧中的棧幀隨著方法的進(jìn)入和退出而進(jìn)行入棧和出棧操作,每個(gè)棧幀中分配多少內(nèi)存基本上是在類結(jié)構(gòu)確定下來(lái)時(shí)就已知的,因此這三個(gè)區(qū)域的內(nèi)存分配和回收都具有確定性。垃圾回收重點(diǎn)關(guān)注的是堆和方法區(qū)部分的內(nèi)存。以下是小編為大家搜索整理的Java虛擬機(jī)垃圾收集算法,希望能給大家?guī)?lái)幫助,更多精彩內(nèi)容請(qǐng)及時(shí)關(guān)注我們應(yīng)屆畢業(yè)生考試網(wǎng)!

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

  一 標(biāo)記-清除算法(Mark-Sweep)

  首先標(biāo)記出所有需要回收的對(duì)象,標(biāo)記完成后統(tǒng)一回收。

  主要缺點(diǎn): 1. 標(biāo)記和清除效率都很低 2. 產(chǎn)生大量不連續(xù)的內(nèi)存碎片,導(dǎo)致后面分配大內(nèi)存空間失敗

  二 復(fù)制算法

  將可用內(nèi)存劃分為大小相等的兩塊, 每次只使用其中一塊。 當(dāng)這塊用完后,就將還存活對(duì)象復(fù)制到另外一塊上面,再把已經(jīng)使用的內(nèi)存空間一次清理掉。

  主要缺點(diǎn): 代價(jià)太高,至少一半的內(nèi)存不能使用。

  三 標(biāo)記-整理算法

  標(biāo)記過(guò)程和標(biāo)記-清除算法一致,但是后續(xù)步驟是讓所有存活的對(duì)象都向一端移動(dòng),然后清理掉邊界以外的內(nèi)存。

  四 分代收集算法

  當(dāng)前商業(yè)虛擬機(jī)都采用此算法,分為不同對(duì)象代,去進(jìn)行不同管理。

  【相關(guān)閱讀】

  什么是java位運(yùn)算

  位運(yùn)算允許對(duì)整數(shù)中的單個(gè)比特進(jìn)行操作。位運(yùn)算會(huì)對(duì)連個(gè)操作數(shù)中對(duì)應(yīng)的比特執(zhí)行布爾代數(shù)運(yùn)算,并產(chǎn)生一個(gè)結(jié)果。

  java中有3種位運(yùn)算符:&(與) |(或) ^(異或) ~(非)

  看例子說(shuō)明位運(yùn)算的過(guò)程:

  public class test{

  public static void main(String[] args){

  int a=12|2; //1100|0010

  System.out.println(a);

  }

  }

  結(jié)果是14(1110)

  位移運(yùn)算操作的目標(biāo)也是數(shù)字的二進(jìn)制的位。用來(lái)操作位數(shù)的向左向右移動(dòng)。

  java種有3種基本的位移操作:

  >>(右移) <<(左移) >>>(無(wú)符號(hào)右移)

  <<:將操作符左邊的整數(shù)按位向左邊移動(dòng)運(yùn)算符右邊整數(shù)指定的位數(shù),在右邊添加0;

  看例子:

  public class test{

  public static void main(String[] args){

  int a=8<<1;

  System.out.println(a);

  }

  }

  8的二進(jìn)制表示:00000000 00000000 00000000 00001000

  左移1位后二進(jìn)制:00000000 00000000 00000000 00010000 -> 14

  結(jié)果為14

  tip:左移相當(dāng)于num*(2^n) 其中num為被移數(shù),n為移動(dòng)的'位數(shù)

  >>:右移的道理也是一樣的,注意的是:若最高位為1,移動(dòng)后最高位用1來(lái)填充,否則用0來(lái)填充。

  例子:

  int a=-8>>1;

  System.out.println(a);

  -8的二進(jìn)制:11111111 11111111 11111111 11111000

  右移后的二進(jìn)制:11111111 11111111 11111111 11111100 -> -4

  結(jié)果為-4

  tip:右移相當(dāng)于num/(2^n) 其中num為被移數(shù),n為移動(dòng)的位數(shù)

  >>>:無(wú)符號(hào)右移跟右移原理是一樣的,只是覆蓋位的覆蓋規(guī)則不同:不管最高位是0還是1,全部用0來(lái)填充。

  例子:

  int a=-8>>>1;

  System.out.println(a);

  -8的二進(jìn)制:11111111 11111111 11111111 11111000

  無(wú)符號(hào)右移后的二進(jìn)制:01111111 11111111 11111111 11111100 -> 2147483644

  tip:用無(wú)符號(hào)右移的時(shí)候要注意,絕對(duì)值很小的負(fù)數(shù)移動(dòng)后都可能成為絕對(duì)值很大的正數(shù),這在大多數(shù)情況下沒(méi)意義。

  奇葩的例外:

  那代碼:

  int a=11>>32;

  long b=12<<64;

  System.out.println(a);

  System.out.println(b);

  int類型占32位,long類型占64位,這樣子的話,上面的例子輸出應(yīng)該都是0才對(duì),因?yàn)閯偤脤⒂行欢家谱吡,但結(jié)果并不是這樣的。

  輸出的結(jié)果是:11 12

  這跟java對(duì)位移的底層操作機(jī)制有關(guān):

  從結(jié)果可以看出兩個(gè)數(shù)都沒(méi)有變化,這是因?yàn)椋谶M(jìn)行移位前,java首先將要移動(dòng)的位數(shù)跟被移數(shù)的位數(shù)求余,然后去移動(dòng)余數(shù)個(gè)位數(shù)。上面例子中,32對(duì)32求余,64對(duì)64求余,結(jié)果都是0,java系統(tǒng)對(duì)被移數(shù)進(jìn)行0個(gè)位的移動(dòng),也就是沒(méi)移動(dòng)啦。

  這樣子的話,看下下面的代碼:

  int c=8>>33;

  System.out.println(c);

  因?yàn)閕nt有32位,那么8實(shí)際上被移動(dòng)的位數(shù)是:332=1;

  就相當(dāng)于:int c=8>>1;

  結(jié)果自然是:4

【Java虛擬機(jī)垃圾收集算法】相關(guān)文章:

Java虛擬機(jī)垃圾收集算法簡(jiǎn)介03-03

java垃圾回收算法講解01-16

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

Java排序算法06-17

Java虛擬機(jī)是什么04-02

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

權(quán)重隨機(jī)算法的java實(shí)現(xiàn)08-13

java常見(jiàn)的排序算法的代碼03-26

常用Java排序算法詳解05-21