如果我的应用程序有太多静态变量或方法,那么根据定义,它们将存储在堆中。如果我错了,请纠正我
1) 在应用程序关闭之前,这些变量会一直在堆上吗?
2) 它们是否随时可用于 GC?如果不是,我能说这是内存泄漏吗?
最佳答案
静态方法只是方法,它们不存储在堆上,它们只是不能使用“this”参数。
静态变量充当 GC 的“根”。因此,除非您将它们显式设置为 null,否则它们将与程序存在一样长,因此可以从它们访问的所有内容。
仅当您打算让内存变得空闲并且它没有变得空闲时,才会将这种情况视为内存泄漏。如果您打算让您的静态变量在部分时间内包含对对象的引用,并且在完成该对象时忘记将其设置为 null,那么您最终可能会出现泄漏。但是,如果您将它放在静态变量中并打算在程序运行时一直存在,那么它绝对不是泄漏,它更有可能是“永久单例”。如果该对象在您希望它仍然存在时被回收,那将非常糟糕。
关于堆的问题:Java 中的所有对象要么存在于堆上,要么存在于堆栈上。使用 new 运算符在堆上创建对象。然后将引用附加到它们。如果引用变为 null 或超出范围(例如, block 结束),GC 会意识到无法再次到达该对象并回收它。如果您的引用在静态变量中,它永远不会超出范围,但您仍然可以将其设置为 null 或另一个对象。
关于java - 在 Java 中使用过多的静态变量会导致内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/641462/