在 Java 中使用过多的静态变量会导致内存泄漏吗?
2022-08-31 20:53:38
如果我的应用程序有太多的静态变量或方法,那么根据定义,它们将存储在堆中。如果我错了,请纠正我
1) 在应用程序关闭之前,这些变量是否会在堆上?
2) 它们是否随时可用于 GC?如果不是,我能说这是内存泄漏吗?
如果我的应用程序有太多的静态变量或方法,那么根据定义,它们将存储在堆中。如果我错了,请纠正我
1) 在应用程序关闭之前,这些变量是否会在堆上?
2) 它们是否随时可用于 GC?如果不是,我能说这是内存泄漏吗?
静态方法只是方法,它们不存储在堆上,只是不能使用“this”参数。
静态变量充当 GC 的“根”。因此,除非您显式将它们设置为 null,否则只要程序存在,它们就会存活,并且可以从它们访问的所有内容也是如此。
只有当您打算使内存变为可用并且它不变为空闲时,才会将情况视为内存泄漏。如果您打算让静态变量在部分时间内包含对某个对象的引用,并且在完成该对象后忘记将其设置为 null,则最终可能会发生泄漏。但是,如果您将其放在静态变量中,并打算只要程序正在运行,它就在那里,那么它绝对不是泄漏,它更有可能是“永久单例”。如果对象在你希望它仍然存在时被回收,那将是非常糟糕的。
至于你关于堆的问题:Java中的所有对象要么存在于堆上,要么存在于堆栈上。使用 new 运算符在堆上创建对象。然后将引用附加到它们。如果引用变为 null 或超出范围(例如,块的末尾),GC 意识到无法再次访问该对象并回收它。如果引用位于静态变量中,则它永远不会超出范围,但您仍可以将其设置为 null 或设置为另一个对象。
如果你有一个静态哈希映射,并且你向它添加数据...数据永远不会消失,并且您有泄漏 - 以防您不再需要数据。如果你需要数据,它不是泄漏,而是一堆巨大的内存。