java垃圾收受接管,主若是靠一个低优先级的历程负责收受接管,注重,不是后台的历程他的利益是边收受接管,边调整堆使其紧凑
' T# i9 p7 x, [ R( w 首要有以下几种算法:
5 W& v, t4 V- M0 Y. ?9 e4 }! k* | 1.引用计数该算法在java虚拟机没被使用过,主若是轮回引用问题,因为计数并不记实谁指向他,无法发现这些交互自引用对象。
; t8 F$ |8 Z$ R0 P 怎么计数?
; g- u) s. x9 l8 E; c, X 当引用毗连到对象时,对象计数加1
1 n/ x8 Z9 c* Y7 a t# u7 _* Y 当引用分开浸染域或被置为null时减14 A8 t$ B) Y- m- y9 y) Z. K
怎么收受接管?
) I: p$ U: a5 i" A1 B 遍历对象列表,计数为0就释放有侍趵硎题?
7 Z Y/ E0 P9 t" S* t* y6 c2 k 轮回引用问题。9 c' ~ r0 z3 q2 s
2.标识表记标帜算法标识表记标帜算法的思惟是年夜仓库和静态存储区的对象起头,遍历所有引用,标识表记标帜活得对象 T/ B5 P: c+ n) f: D8 t
对于标识表记标帜后有两种措置体例
" R0 o& r7 g) v (1)遏制-复制- X+ @3 t" |+ N0 Y% m$ l! Q$ {
所谓遏制,就是遏制在运行的轨范,进行垃圾收受接管所谓复制,就是将活得对象复制到此吐矣闽堆上,以使内存更紧凑利益在于,昔时夜块内存释放时,有利于整个内存的重分配有侍趵硎题?) A/ h! j6 J( k
一、遏制,干扰轨范的正常运行,二,复制,较开破耗年夜量时刻,三,如不雅察看序斗劲不变,垃圾斗劲少,那么每次年夜头复制量长短常年夜的,很是不合算什么时辰启动遏制-复制?
- g" f1 g6 v7 e. d8 j 内存数目较低时,具体多低我也不知道7 p; G9 `8 \% v( C
(2)断根. m8 z2 c5 N8 q6 k8 f( {
也称标识表记标帜-断根算法
2 a4 A! ^! }5 [) Z& l 也就是将标识表记标帜为非活得对象释放,也必需暂停轨范运行利益就是在轨范斗劲不变,垃圾斗劲少的时辰,速度斗劲快有侍趵硎题?
( @, M: f2 K; m8 X4 {; N# l8 X- f 很显然遏制轨范运行是一个问题,只断根也会造成很对内存碎片。1 q* W) x2 s- l" M6 L9 d
为什么这2个算法都要暂停轨范运行?7 Q6 U1 B2 i0 x0 [! I
这是因为,如不美观不暂停,适才的标识表记标帜会被运行的轨范弄乱,
* ^. E4 _0 T& D5 C (3)分代收集, G# h! y9 w( f, P
分代收集是操作轨范有年夜量姑且对象的特点,对象每被引用一次,代数就增添,代数小的小型对象会被收受接管清算,年夜对象只会代数增添,不会被清算。0 I) Z8 P; m6 k
利益在于对于措置年夜量姑且的变量很有辅佐
: g" Z, E9 S# b3 W$ E (4)自顺应! i8 G9 i. R2 { r( m+ W
jvm会监测垃圾收受接管的效率,在(1),(2)算法之间切换。0 b. O- W# ~- e/ p# i4 d
3.增量收集,增量收受接管的首要算法仍是分代(Young Objects 收受接管)与Train算法(Mature Object收受接管),所谓增量收受接管的关头问题是若何实现有序的增量收受接管而不会导致杂乱(引用及其的增添与削减),分代可以逐代收受接管,Train算法可以逐个车厢收受接管,这样每次一代或每次一厢可以实现短搁浅收受接管。 |