虚拟机 Minor GC 的时候可达性分析是针对整个堆还是只有新生代呢?

yldongfang402 2018-07-04 04:06:11
请问虚拟机在做 Minor GC 的时候可达性分析是针对整个堆还是只有新生代呢?
...全文
392 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
yldongfang402 2018-10-30
  • 打赏
  • 举报
回复 2
虚拟机使用Remembered Set来避免全堆扫描的,虚拟机会在新生代的Remembered Set中记录新生代哪些对象被老年代引用了,通过Remembered Set来避免全堆扫描。下面是深入理解java虚拟机中的原话: 在G1收集器中,Region之间的对象引用以及其他收集器中的。G1中每个Region都有一个与之对应的Remembered Set,虚拟机发现程序在对Reference类型的数据进行写操作时,会产生一个Write Barrier暂时中断写操作,检查Reference引用的对象是否处于不同的Region之中(在分代的例子中就是检查是否老年代中的对象引用了新生代中的对象),如果是,便通过CardTable把相关引用信息记录到被引用对象所属的Region的Remembered Set之中。当进行内存回收时,在GC根节点的枚举范围中加入Remembered Set即可保证不对全堆扫描也不会有遗漏。
吸尘器 2018-08-02
  • 打赏
  • 举报
回复
引用 5 楼 yldongfang402 的回复:
[quote=引用 3 楼 qq_25743741 的回复:] B是可达有效对象,那么A去找做可达性计算的时候肯定也能找到B,从而也能找到GC roots,所以A也算有效对象 ,minor gc 就不会将A回收;
可达性分析的时候以GC Roots 为起点,向下搜索的吧,应该是GC root -->B--->A,还能反着搜索吗?从A--》B--》GC root? 如果是B对象中有个引用指向A,那从B可以找到A,但是A并不知道被谁引用了吧,没有办法找到B吧[/quote] gc回收的有3中,第一种 gcRoots 向下搜索,没有引用链接,第二种被引用数量为0的,第三种 gcroot搜索不到,经过第一次标记清理后没有复活的对象。 我的理解是:gcroot第一次标记了A,因为A引用了B,但根据B找不到A,被清理了,但A的引用了B,引用数量大于0,会被复活,所以gc不会再清理A
狄伊煞迩 2018-08-02
  • 打赏
  • 举报
回复
引用 5 楼 yldongfang402 的回复:
[quote=引用 3 楼 qq_25743741 的回复:]
B是可达有效对象,那么A去找做可达性计算的时候肯定也能找到B,从而也能找到GC roots,所以A也算有效对象 ,minor gc 就不会将A回收;


可达性分析的时候以GC Roots 为起点,向下搜索的吧,应该是GC root -->B--->A,还能反着搜索吗?从A--》B--》GC root?
如果是B对象中有个引用指向A,那从B可以找到A,但是A并不知道被谁引用了吧,没有办法找到B吧[/quote]

A能到B 和 B 能到A 不是等价的吗?虽然他是向下搜索
yldongfang402 2018-07-09
  • 打赏
  • 举报
回复
引用 3 楼 qq_25743741 的回复:
B是可达有效对象,那么A去找做可达性计算的时候肯定也能找到B,从而也能找到GC roots,所以A也算有效对象 ,minor gc 就不会将A回收;


可达性分析的时候以GC Roots 为起点,向下搜索的吧,应该是GC root -->B--->A,还能反着搜索吗?从A--》B--》GC root?
如果是B对象中有个引用指向A,那从B可以找到A,但是A并不知道被谁引用了吧,没有办法找到B吧
stacksoverflow 2018-07-06
  • 打赏
  • 举报
回复
1,2,3楼正解。
狄伊煞迩 2018-07-06
  • 打赏
  • 举报
回复
B是可达有效对象,那么A去找做可达性计算的时候肯定也能找到B,从而也能找到GC roots,所以A也算有效对象 ,minor gc 就不会将A回收;
yldongfang402 2018-07-05
  • 打赏
  • 举报
回复
引用 1 楼 oyljerry 的回复:
minor gc本身就只针对新生代。

那会不会有这样的情况:新生代有个对象A,老年代有个对象B,B对象是可达的有效对象,B中有个引用指向A,A只有B这一个引用指向它。如果minor gc只处理新生代会不会将A回收掉呢?如果只扫描新生代的话A会不会被当成是不可达的对象?
oyljerry 2018-07-04
  • 打赏
  • 举报
回复
minor gc本身就只针对新生代。

50,523

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧