让我们以这个例子为例,我认为它涵盖了我所有的问题:
class SomeClass
{
static SomeType PropertyA
{
get
{
if (....)
return MethodA();
else
return MethodB();
}
}
static SomeType MethodA() { ... }
static SomeType MethodB() { ... }
}调用SomeClass.PropertyA属性会造成内存泄漏吗?我的意见是否定的,因为属性本身没有备份字段,这将导致内存泄漏。我之所以这样问,是因为我读过静态属性可以创建内存泄漏,但我认为是后台字段负责内存泄漏,因为它包含对实例的引用。
因此,在上面的示例中,上面示例中的MethodA、MethodB和PropertyA不应该创建任何内存泄漏。我是不是弄错了?
我的另一个问题是:我有很多类,它们大多没有状态或数据。他们只是在充当代理人。其中一些方法经常被调用。我的问题是:我应该使这些类是单例类、静态类还是常规类?
最好的例子是一个包含5-10个方法的类,并执行一些SQL查询。
1)如果我将它们作为常规的,那么我将需要非常经常地创建它们(对于某些用户的反应),调用某些方法,然后允许垃圾收集。
( 2)在单例和静态之间进行选择,利弊是什么?
3)如果我有一个包含代理方法的类,但是有2-3个IDbCommands,每个都包含10个参数,并且有利于重用它们,那么在选择正确的模式时,这会改变什么吗?
编辑:因为我得到了一些更让我困惑的答案,可能是因为误解,所以我会把第一个问题的答案贴出来。我做了一个测试,其中我分配了一个大字节数组(300 is ),该数组通过PropertyA (和MethodA)检索。在上面的示例中,和PropertyA abd MethodA都不会保存对该对象的引用,在获取对象之后,一旦调用代码使用数组,它将由GC处理。因此,如果我们只对getter使用静态属性,或者使用静态方法,则不应该有任何内存泄漏。
发布于 2012-08-25 01:23:24
因此,在上面的示例中,上面示例中的MethodA、MethodB和PropertyA不应该创建任何内存泄漏。我是不是弄错了?
如果您的意思是他们不会创建或保存任何内存,那么这就是事实--该属性本身将不保存内存。
静态字段不会创建“内存泄漏”-类型初始化程序将在第一次使用类之前运行,如果字段需要内存,则将分配该字段的内存。这个内存没有被清除--如果这是您所说的“泄漏”-but的意思,那么就没有可以释放的实例,所以这是预期的和需要的行为。
发布于 2012-08-25 01:30:10
简单的答案是一个问题:“这些方法是做什么的,它们是否保持状态,并且除了简单的垃圾收集之外,它们是否已经或没有进行清理?”
如果他们不对上述所有,这是理所当然的,你将不会有泄漏。只有当你不做一些事情的时候,泄漏才会发生,如果你什么都不需要做,你就不会有泄漏。
如今,它更多的是关于“记忆压力”而不是泄密。
一般来说,我倾向于使用实例方法,因为它提供了垃圾收集,并且允许更容易地模拟和测试场景。
静态方法和变量受到与实例变量和方法相同的问题的影响,因此,如果可能的话,泄漏也适用于这两种情况。
https://stackoverflow.com/questions/12118377
复制相似问题