可以使用太多的静态variables导致Java中的内存泄漏?
如果我的应用程序有太多的静态variables或方法,那么按照定义,它们将被存储在堆中。 如果我错了,请纠正我
1)在应用程序closures之前,这些variables是否在堆上?
2)他们随时可以使用GC吗? 如果没有,我可以说这是一个内存泄漏?
静态方法只是方法,它们不存储在堆中,它们只是不使用“this”参数。
静态variables作为GC的“根源”。 因此,除非你明确地将它们设置为null,否则只要程序存在,它们就会生存,所有的东西都可以从它们中获得。
如果你打算让内存变成免费的而且它不会变成免费的,情况只会被认为是内存泄漏。 如果打算让静态variables在部分时间内包含对象的引用,并且在完成该对象时忘记将其设置为null,则可能最终导致泄漏。 但是,如果你把它放在静态variables中,并且打算在程序运行的时候在那里,那么它肯定不是泄漏,它更可能是一个“永久的单身人士”。 如果这个物体在你想要的时候被回收了,那就太糟糕了。
至于你关于堆的问题:Java中的所有对象都存在于堆上或堆栈中。 对象使用新的操作符在堆上创build。 然后附上一个参考资料。 如果引用变为null或超出范围(例如,块结束),则GC意识到无法再次访问该对象并将其回收。 如果你的引用是在一个静态variables中,它永远不会超出范围,但你仍然可以将它设置为null或另一个对象。
如果你有一个静态的hashmap,并且你添加了数据…数据永远不会消失,而且你有一个泄漏 – 如果你不再需要这些数据的话。 如果你需要的数据,这不是一个泄漏,但一个巨大的内存挂在一堆。
由静态引用直接或间接引用的对象将保留在堆上,直到可以收集相应的类加载器为止。 有些情况下(例如ThreadLocal)其他对象间接引用类加载器,导致它保持未收集。
如果你有一个静态列表,说,并dynamic地添加引用,那么你可以很容易地结束“对象生存期争用问题”。 避免可变静力学的原因很多。
只要你可以从代码中的某个地方引用这些variables,它就不能通过GCed,这意味着它们将在那里直到应用程序结束。
你可以把它称为内存泄漏,我不会把它称为内存泄漏,通常内存泄漏是你通常期望恢复的内存,但你永远不会做,或者你只能恢复它的一部分。 同样,内存泄漏通常会变得更糟(例如:每次调用一个方法时,会有更多的内存被“泄漏”),但是在这种情况下,这些variables的内存使用量是静态的。
它不会导致经典的C感觉内存泄漏…例如
Class A{ static B foo; ... static void makeFoo(){ foo = new B(); foo = new B(); }
在这种情况下,调用makeFoo()不会导致内存泄漏,因为第一个实例可以被垃圾收集。