美文网首页
Java005 Java Garbage Collection

Java005 Java Garbage Collection

作者: 攻城狮托马斯 | 来源:发表于2020-04-07 08:18 被阅读0次

Garbage Collector主要用于整理Heap中的data. 会通过以下的步骤.

1.标记(Marking)

标记那些没有被reference的Object.

2.Normal Deletion

'

把这些被标记过的object删除, 并且存一个reference指到free spaces当中.

把现有的memory存起来,然后压缩,释放出连续的space(当然这一步不经常做应为消耗的时间实在是太久了)

那么,能否一次性GC完呢?

在想这个问题前,需要提到 "Stopping the world". 一旦GC开始,那么Heap中不再加入或删除或替换任何data,否则的话,GC的过程中便不能保证有效性(如果在删除过程中又有更改的话。

因为Heap的size很大(可以大到100GB), 所以把Heap分到了以下Generation.

可以看到,分为新生代(Eden和Survivor Space,老年代和永生层)

在新生代满了之后,minor garbage collection. 通常新生代中的换代速度是比较快的(比如一个运算比较快的Thread). 然后活下来的就去了Survivor Space,当Survivor space中的元素足够老的时候,便去了老年层。

当老年层做GC时,便是major garbage collection. 

永生层通常包括了一些metadata,Java SE library classes and methods通常都储存在这里。一旦永生层都不需要了,那么则是a full garbage collection.


那么如何去判断一个object是否需要被GC?

逻辑是找到所有的GC roots, 在这个GC roots component(graph)之内的,就不删除,其他的则删除。

有四种 GC roots:

1.Local Varibles. 一个thread中stack的varible,只要thread还活着,那么local variables和其相关的就都活着.

2.Active Java Threads 正在活跃的Java threads

3.Static variables. Class在,static variables就在。

4.Java Native Interface(很多Java objects都依赖于Java Native Interface)


Card Making algorithm

在这一算法中, Heap被分为a set of cards, 每一张卡存比memory page小一些,然后JVM用一张card map,每一个bit代表一个card page. 通过标记那一个bit(dirty, clear), 来确定哪些是需要被保留,哪些需要删除。详情看如下

https://www.cnblogs.com/huajiezh/p/5769255.html

相关文章

网友评论

      本文标题:Java005 Java Garbage Collection

      本文链接:https://www.haomeiwen.com/subject/yqsuphtx.html