问个垃圾回收GC的问题,包含静态字段的类是否不能被回收?

qq_25526931 2015-10-31 05:45:49
下面的这个Food类是否会因为有一个静态Spoon字段而导致无法被回收?如果是这样的话是否应该避免使用静态字段?


public class Food
{
static Spoon spoon = new Spoon();

public void Eat()
{
spoon.Eat();
}
}
...全文
414 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
laoyulone 2017-12-11
  • 打赏
  • 举报
回复
Food可以被回收,在内存中,静态字段不是被Food实例所有,而是被类型对象所有,所以不影响Food实例的回收
qq_25526931 2015-10-31
  • 打赏
  • 举报
回复
大家的回复都没有说到我要问的要点,不要总是纠结类跟对象的问题了,这是我前面没讲清楚。 因为类里包含静态字段的问题在CLR via in c#的垃圾回收这一章里没有提到这问题,所以感觉总有些奇怪。刚才自己测试了一下,分别在Food跟Spoon类里增加了析构函数,发现Food类还是能被垃圾收集正常回收的,而Spoon类只会在程序终止时被回收。
Poopaye 2015-10-31
  • 打赏
  • 举报
回复
能够被回收的是Food的对象 你所担心的那个spoon属性是静态的,静态属性属于的是Food类 对象和类的区别你总明白吧
xuzuning 2015-10-31
  • 打赏
  • 举报
回复
static Spoon spoon = new Spoon(); spoon 已是静态的了,也就是所用的实例都共用一个 spoon 那么你本该将 Food 定义成单例的,而不是纠结如何回收垃圾
  • 打赏
  • 举报
回复
引用 4 楼 qq_25526931 的回复:
[quote=引用 3 楼 lovelj2012 的回复:] static变量在软件整个生命周期内都存在,是不会被GC回收的。 不是类不被回收,类本身不占用内存,是类对象、静态类成员占用内存空间。
那么Food使用完以后是否能被回收?

        static void Main(string[] args)
        {
            Food food = new Food();
        }
[/quote] 首先要说清楚哪个是类型,哪个是对象。
  • 打赏
  • 举报
回复
引用 2 楼 qq_25526931 的回复:
我是担心包含了静态字段Spoon的Food类如果也不能被回收,那么Food类被大量实例化的话会一直占用大量内存。
什么叫做 Food类被回收?被回收的都是对象而不是类。既然你知道Spoon类包含Food“类”而Spoon对象并不包含,结果就很清楚了。
qq_25526931 2015-10-31
  • 打赏
  • 举报
回复
引用 3 楼 lovelj2012 的回复:
static变量在软件整个生命周期内都存在,是不会被GC回收的。 不是类不被回收,类本身不占用内存,是类对象、静态类成员占用内存空间。
那么Food使用完以后是否能被回收?

        static void Main(string[] args)
        {
            Food food = new Food();
        }
qq_25526931 2015-10-31
  • 打赏
  • 举报
回复
引用 1 楼 sp1234 的回复:
回收了还怎么可能在 spoon.Eat() 中使用?
我的意思是Food类是否因为有一个静态字段Spoon而导致无法被回收?静态字段Spoon肯定是不能被回收的这个我当然知道。我是担心包含了静态字段Spoon的Food类如果也不能被回收,那么Food类被大量实例化的话会一直占用大量内存。
江南小鱼 2015-10-31
  • 打赏
  • 举报
回复
static变量在软件整个生命周期内都存在,是不会被GC回收的。 不是类不被回收,类本身不占用内存,是类对象、静态类成员占用内存空间。
  • 打赏
  • 举报
回复
回收了还怎么可能在 spoon.Eat() 中使用?

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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