- 相關推薦
Java虛擬機垃圾收集算法
Java虛擬機的內(nèi)存區(qū)域中,程序計數(shù)器、虛擬機棧和本地方法棧三個區(qū)域是線程私有的,隨線程生而生,隨線程滅而滅;棧中的棧幀隨著方法的進入和退出而進行入棧和出棧操作,每個棧幀中分配多少內(nèi)存基本上是在類結(jié)構(gòu)確定下來時就已知的,因此這三個區(qū)域的內(nèi)存分配和回收都具有確定性。垃圾回收重點關注的是堆和方法區(qū)部分的內(nèi)存。以下是小編為大家搜索整理的Java虛擬機垃圾收集算法,希望能給大家?guī)韼椭,更多精彩?nèi)容請及時關注我們應屆畢業(yè)生考試網(wǎng)!
一 標記-清除算法(Mark-Sweep)
首先標記出所有需要回收的對象,標記完成后統(tǒng)一回收。
主要缺點: 1. 標記和清除效率都很低 2. 產(chǎn)生大量不連續(xù)的內(nèi)存碎片,導致后面分配大內(nèi)存空間失敗
二 復制算法
將可用內(nèi)存劃分為大小相等的兩塊, 每次只使用其中一塊。 當這塊用完后,就將還存活對象復制到另外一塊上面,再把已經(jīng)使用的內(nèi)存空間一次清理掉。
主要缺點: 代價太高,至少一半的內(nèi)存不能使用。
三 標記-整理算法
標記過程和標記-清除算法一致,但是后續(xù)步驟是讓所有存活的對象都向一端移動,然后清理掉邊界以外的內(nèi)存。
四 分代收集算法
當前商業(yè)虛擬機都采用此算法,分為不同對象代,去進行不同管理。
【相關閱讀】
什么是java位運算
位運算允許對整數(shù)中的單個比特進行操作。位運算會對連個操作數(shù)中對應的比特執(zhí)行布爾代數(shù)運算,并產(chǎn)生一個結(jié)果。
java中有3種位運算符:&(與) |(或) ^(異或) ~(非)
看例子說明位運算的過程:
public class test{
public static void main(String[] args){
int a=12|2; //1100|0010
System.out.println(a);
}
}
結(jié)果是14(1110)
位移運算操作的目標也是數(shù)字的二進制的位。用來操作位數(shù)的向左向右移動。
java種有3種基本的`位移操作:
>>(右移) <<(左移) >>>(無符號右移)
<<:將操作符左邊的整數(shù)按位向左邊移動運算符右邊整數(shù)指定的位數(shù),在右邊添加0;
看例子:
public class test{
public static void main(String[] args){
int a=8<<1;
System.out.println(a);
}
}
8的二進制表示:00000000 00000000 00000000 00001000
左移1位后二進制:00000000 00000000 00000000 00010000 -> 14
結(jié)果為14
tip:左移相當于num*(2^n) 其中num為被移數(shù),n為移動的位數(shù)
>>:右移的道理也是一樣的,注意的是:若最高位為1,移動后最高位用1來填充,否則用0來填充。
例子:
int a=-8>>1;
System.out.println(a);
-8的二進制:11111111 11111111 11111111 11111000
右移后的二進制:11111111 11111111 11111111 11111100 -> -4
結(jié)果為-4
tip:右移相當于num/(2^n) 其中num為被移數(shù),n為移動的位數(shù)
>>>:無符號右移跟右移原理是一樣的,只是覆蓋位的覆蓋規(guī)則不同:不管最高位是0還是1,全部用0來填充。
例子:
int a=-8>>>1;
System.out.println(a);
-8的二進制:11111111 11111111 11111111 11111000
無符號右移后的二進制:01111111 11111111 11111111 11111100 -> 2147483644
tip:用無符號右移的時候要注意,絕對值很小的負數(shù)移動后都可能成為絕對值很大的正數(shù),這在大多數(shù)情況下沒意義。
奇葩的例外:
那代碼:
int a=11>>32;
long b=12<<64;
System.out.println(a);
System.out.println(b);
int類型占32位,long類型占64位,這樣子的話,上面的例子輸出應該都是0才對,因為剛好將有效位都移走了,但結(jié)果并不是這樣的。
輸出的結(jié)果是:11 12
這跟java對位移的底層操作機制有關:
從結(jié)果可以看出兩個數(shù)都沒有變化,這是因為,在進行移位前,java首先將要移動的位數(shù)跟被移數(shù)的位數(shù)求余,然后去移動余數(shù)個位數(shù)。上面例子中,32對32求余,64對64求余,結(jié)果都是0,java系統(tǒng)對被移數(shù)進行0個位的移動,也就是沒移動啦。
這樣子的話,看下下面的代碼:
int c=8>>33;
System.out.println(c);
因為int有32位,那么8實際上被移動的位數(shù)是:332=1;
就相當于:int c=8>>1;
結(jié)果自然是:4
【Java虛擬機垃圾收集算法】相關文章:
Java虛擬機介紹07-12
java通用組合算法如何實現(xiàn)09-12
java中全排列是如何生成算法09-05
Java常用的五大排序算法09-09
java教程之Java編程基礎09-12
PHP快速排序算法解析10-09
PHP排序算法類講解07-18
JAVA的就業(yè)方向10-09
Java 的分支結(jié)構(gòu)10-27
java的應用范圍06-24