java - 在 Java 中使用过多的静态变量会导致内存泄漏吗?

标签 java memory-management memory-leaks

如果我的应用程序有太多静态变量或方法,那么根据定义,它们将存储在堆中。如果我错了,请纠正我

1) 在应用程序关闭之前,这些变量会一直在堆上吗?
2) 它们是否随时可用于 GC?如果不是,我能说这是内存泄漏吗?

最佳答案

静态方法只是方法,它们不存储在堆上,它们只是不能使用“this”参数。

静态变量充当 GC 的“根”。因此,除非您将它们显式设置为 null,否则它们将与程序存在一样长,因此可以从它们访问的所有内容。

仅当您打算让内存变得空闲并且它没有变得空闲时,才会将这种情况视为内存泄漏。如果您打算让您的静态变量在部分时间内包含对对象的引用,并且在完成该对象时忘记将其设置为 null,那么您最终可能会出现泄漏。但是,如果您将它放在静态变量中并打算在程序运行时一直存在,那么它绝对不是泄漏,它更有可能是“永久单例”。如果该对象在您希望它仍然存在时被回收,那将非常糟糕。

关于堆的问题:Java 中的所有对象要么存在于堆上,要么存在于堆栈上。使用 new 运算符在堆上创建对象。然后将引用附加到它们。如果引用变为 null 或超出范围(例如, block 结束),GC 会意识到无法再次到达该对象并回收它。如果您的引用在静态变量中,它永远不会超出范围,但您仍然可以将其设置为 null 或另一个对象。

关于java - 在 Java 中使用过多的静态变量会导致内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/641462/

相关文章:

java - 为什么即使指定了 TFramedTransport,Node JS 也会提示缺少 TFramedTransport?

java - Java非堆内存和栈内存有什么区别?如果不是,它们是否相同?它们之间有什么区别?

模板函数 <queue> 中的 C++ 内存错误

c++ - malloc、struct、std::string 和 free 可能发生内存泄漏

java - 在 java 中将 int 转换为 double 然后返回 int

java - 如何在调用方法 FileManager.get().loadModel(url) 期间获取 apache jena 中的 http 响应 header

java - 为什么这段 Scala 代码会在运行时抛出 IllegalAccessError?

c++ - 初学者的C++内存分配乱七八糟

c - 在c中使用基于区域的内存管理

java - Swing 拖放导致内存泄漏