首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >静态属性/方法内存分配

静态属性/方法内存分配
EN

Stack Overflow用户
提问于 2012-08-25 01:08:11
回答 2查看 1.3K关注 0票数 1

让我们以这个例子为例,我认为它涵盖了我所有的问题:

代码语言:javascript
复制
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使用静态属性,或者使用静态方法,则不应该有任何内存泄漏。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-25 01:23:24

因此,在上面的示例中,上面示例中的MethodA、MethodB和PropertyA不应该创建任何内存泄漏。我是不是弄错了?

如果您的意思是他们不会创建或保存任何内存,那么这就是事实--该属性本身将不保存内存。

静态字段不会创建“内存泄漏”-类型初始化程序将在第一次使用类之前运行,如果字段需要内存,则将分配该字段的内存。这个内存没有被清除--如果这是您所说的“泄漏”-but的意思,那么就没有可以释放的实例,所以这是预期的和需要的行为。

票数 1
EN

Stack Overflow用户

发布于 2012-08-25 01:30:10

简单的答案是一个问题:“这些方法是做什么的,它们是否保持状态,并且除了简单的垃圾收集之外,它们是否已经或没有进行清理?”

如果他们不对上述所有,这是理所当然的,你将不会有泄漏。只有当你不做一些事情的时候,泄漏才会发生,如果你什么都不需要做,你就不会有泄漏。

如今,它更多的是关于“记忆压力”而不是泄密。

一般来说,我倾向于使用实例方法,因为它提供了垃圾收集,并且允许更容易地模拟和测试场景。

静态方法和变量受到与实例变量和方法相同的问题的影响,因此,如果可能的话,泄漏也适用于这两种情况。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12118377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档