none
关于GC分代回收的问题 RRS feed

  • 问题

  • 当GC只打算回收0代对象时,如果有0代对象正被1代或2代对象引用,但引用它的1代或2代对象已经处于不可达状态了,那么该0代对象会不会被回收?我利用弱引用做实验证实这样的0代对象不会被回收,但无法知道是不是只有在存在相关弱引用时才不会回收。
    2014年3月19日 1:50

答案

  • 你好:

    我对你的实验过程很感兴趣,能把你的实验代码贴出来看看吗?GC的回收过程一般是自动的,你怎么知道“GC只打算回收0代对象”的呢?

    根据我的理解,GC判断一个对象是否可以回收有两个标准:1. 对象是否被应用程序的根引用。2. 对象是否被其他对象所引用。对象刚创建的时候会被推入到0代,回收不到的对象会被推入到下一代,然后GC会对内润进行一个压缩。

    你描述中的那个对象被其他对象所引用,所以GC在这一轮的回收中就不会回收这个对象。GC回收的过程一般都是CLR自动执行的,程序员没有必要关心回收过程,只要记住及时释放非托管资源就可以了。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    • 已标记为答案 062369 2014年3月20日 7:24
    2014年3月20日 6:44
    版主

全部回复

  • 你好:

    我对你的实验过程很感兴趣,能把你的实验代码贴出来看看吗?GC的回收过程一般是自动的,你怎么知道“GC只打算回收0代对象”的呢?

    根据我的理解,GC判断一个对象是否可以回收有两个标准:1. 对象是否被应用程序的根引用。2. 对象是否被其他对象所引用。对象刚创建的时候会被推入到0代,回收不到的对象会被推入到下一代,然后GC会对内润进行一个压缩。

    你描述中的那个对象被其他对象所引用,所以GC在这一轮的回收中就不会回收这个对象。GC回收的过程一般都是CLR自动执行的,程序员没有必要关心回收过程,只要记住及时释放非托管资源就可以了。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    • 已标记为答案 062369 2014年3月20日 7:24
    2014年3月20日 6:44
    版主
  • 你好:

    我对你的实验过程很感兴趣,能把你的实验代码贴出来看看吗?GC的回收过程一般是自动的,你怎么知道“GC只打算回收0代对象”的呢?

    根据我的理解,GC判断一个对象是否可以回收有两个标准:1. 对象是否被应用程序的根引用。2. 对象是否被其他对象所引用。对象刚创建的时候会被推入到0代,回收不到的对象会被推入到下一代,然后GC会对内润进行一个压缩。

    你描述中的那个对象被其他对象所引用,所以GC在这一轮的回收中就不会回收这个对象。GC回收的过程一般都是CLR自动执行的,程序员没有必要关心回收过程,只要记住及时释放非托管资源就可以了。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    我是手动调用GC.Collect(0)强制GC只回收0代对象的,这应该可以模拟“GC只打算回收0代对象”的情况吧。
    2014年3月20日 7:24
  • 你好:

    我对你的实验过程很感兴趣,能把你的实验代码贴出来看看吗?GC的回收过程一般是自动的,你怎么知道“GC只打算回收0代对象”的呢?

    根据我的理解,GC判断一个对象是否可以回收有两个标准:1. 对象是否被应用程序的根引用。2. 对象是否被其他对象所引用。对象刚创建的时候会被推入到0代,回收不到的对象会被推入到下一代,然后GC会对内润进行一个压缩。

    你描述中的那个对象被其他对象所引用,所以GC在这一轮的回收中就不会回收这个对象。GC回收的过程一般都是CLR自动执行的,程序员没有必要关心回收过程,只要记住及时释放非托管资源就可以了。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    你说的标准2有点问题,如果两个0代对象互相引用,但都不被根引用,那么它们都可以被回收。更准确的表述应该为:对象是否被本轮不打算回收的其他对象引用。
    2014年3月20日 7:31