当前位置: 首页 > 面试题库 >

可以使用太多的静态变量来导致Java中的内存泄漏吗?

方河
2023-03-14
问题内容

如果我的应用程序具有太多的静态变量或方法,则按照定义,它们将存储在堆中。如果我错了请指正我

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


问题答案:

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

静态变量充当GC的“根”。结果,除非您将它们显式设置为null,否则它们将一直存在,只要程序处于活动状态,那么它们可以访问的所有内容都将保留。

仅当您打算释放内存而没有释放内存时,情况才被视为内存泄漏。如果您打算让静态变量在一段时间内包含对某个对象的引用,而忘记了在处理完该对象后将其设置为null,则很可能导致泄漏。但是,如果将其放在静态变量中并希望在程序运行期间一直存在,则绝对不是泄漏,它很可能是“永久单例”。如果在您希望对象仍然存在时被回收,那将是非常糟糕的。

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



 类似资料:
  • 我正在调试一个我在Tomcat应用程序中多年来遇到的问题——由于Webapp类加载器无法通过气相色谱重新启动应用程序时导致的内存泄漏。我用JProfiler对堆进行了快照,似乎至少我的一些静态变量没有被释放。 某些类有一个静态 final 成员,该成员在首次加载类时初始化,并且因为它是 final,所以我无法在应用程序关闭时将其设置为 null。 静态最终变量是Tomcat中的反模式,还是我错过了

  • 静态变量以这样的方式进行垃圾收集: 静态变量由类对象引用,类对象由类加载器引用。所以,静态变量只是在加载了静态字段所在的类的类加载器在java中被垃圾收集时才被垃圾收集。 因此,假设一个web应用程序和Tomcat管理它。在一个特定的应用程序中存在静态变量,该应用程序被多次主动重新部署。 静态变量是否保留在元空间中,因为类加载器在重新部署时尚未进行GC处理?

  • 我知道静态字段会导致内存泄漏,因为它们不会被 GC 处理。 但是,当有一个 Web 应用程序部署在容器(例如 Tomcat)中时,每个应用程序都有自己的 ClassLoader,并且可以取消部署。 我的问题是,垃圾收集器是否声明将要卸载的类的静态成员引用的对象? 最简单的情况是单例(由引用自身的静态变量实现),如果应用程序被取消部署,它会被GCed吗?

  • 严重:web应用程序[]创建了一个ThreadLocal,其键类型为[com.box.sdk.boxDateFormat$1](值为[com.box.sdk.boxDateFormat$1@275AB696])和值类型为[java.text.SimpleDateFormat](值为[java.text.SimpleDateFormat@faabb360]),但在web应用程序停止时未能删除它。线程

  • 我想首先说,这是我第一次必须处理性能,因为这是我第一次开发一个android应用程序。 该应用程序是一个源代码编辑器,在这里你可以打开文件,修改它们,并将它们保存回来。该应用程序由4个部分组成: 导航器视图:包含打开文件的ListView和打开文件夹的TreeView。 代码视图容器:它保存包含实际代码的视图。 代码容器:这是一个小视图,包含一个文本视图和一个自定义EditText(由我扩展Edi

  • 问题内容: 我认为我的Android动态壁纸存在内存泄漏。每当我旋转屏幕时,收集的内存垃圾量就会增加50kb,并且不会减少。我认为这可能是由预定的将来引起的,因此我将提出一个方案以查看是否是这种情况。 假设您有一个包含以下成员的类(我们称其为Foo)。 现在您设定了预定的未来 Future拥有对可运行对象的引用,而Runnable拥有对父Foo对象的引用。我不确定是否是这种情况,但是这个事实是否意