静态变量,它们的生命周期是多久?

17

我在我的应用程序中使用了许多静态变量,我的问题是,当我退出应用程序时,它们是否仍然存在于内存中?如果是,我该如何解决这个问题。谢谢。


3
“signout”指的是登出操作,即退出程序/进程/JVM。 - Thilo
3
你能否给出更多的例子?或者我不相信这个问题会长久存在。 - kommradHomer
3
低质量的问题往往会吸引低质量的回答...这个问题也不例外。投票关闭。 - Jean-François Corbett
2
@Jean-François Corbett 我认为对于这个质量低劣的问题,有很多高质量的答案。 - Rookie
1
这是一个安卓应用程序。 - Rookie
显示剩余6条评论
9个回答

29

静态变量在类被ClassLoader加载时就会被加载,并且会在卸载时被移除。


12

对于这个问题的下一位读者 -

正如其他人在答案中所说,静态变量是类变量。它们会一直保存在内存中,直到该类从JVM中卸载为止。

在Android中,当我们关闭任何应用程序时,它并不完全关闭,它仍然存在于最近使用应用程序堆栈中。你可以通过长按主屏幕键来查看(在大多数设备上)。

 Android itself kicked out those recent apps when the other app needs memory

在Android中,静态变量何时卸载-

 -You force stop your app.
 -Application crashes.
 -You clear your app data.
 -Switch off your Device.
 -Android kicked out recent app  

8

静态变量将随着类在JVM中的加载而存在。当JVM中不再运行该类的实例时,该类将被卸载,静态变量将有资格进行垃圾收集。


10
即使没有实例存在,该类也不会被卸载。 只有当整个类加载器消失时,才会卸载它。 - Thilo

8

除了其他答案之外,还要注意,如果这些静态“变量”实际上是“静态final”基本常量,则它们根本不存在作为单独实体,而是它们的值被编译到使用它们的所有类中(不仅仅是定义它们的那个类)。


4

静态变量与类相关联,只要该类在内存中存在(一旦您的应用程序终止,它就会停止存在),它们就会存在。


4
或者在课程被卸载(这种情况非常罕见)之后。 - Thilo

3
有时,您希望拥有所有对象共同的变量。这可以通过使用static修饰符来实现。在其声明中具有静态修饰符的字段称为静态字段或类变量它们与类相关联,而不是与任何对象相关联。类的每个实例共享一个类变量,该变量位于内存中的一个固定位置。任何对象都可以更改类变量的值,但也可以在不创建类的实例的情况下操作类变量。

当实例不再使用时,垃圾回收器会将其销毁。这意味着您的实例将从内存中擦除。


3

我在我的应用程序中使用了很多静态变量。

静态变量不受自动内存管理的影响,您应该在onDestroy方法(Android)中将它们设置为null。它们肯定属于一个类,这正如@Jigar Joshi所指出的那样。


3
这里没有提到“Android”。 - Kazekage Gaara
2
抱歉,我的错,但在经典的Java中也是一样的,你必须将它们设置为null。 - Simon Dorociak

2

静态变量被称为类变量,在作用域方面,它们在类加载时加载,在类卸载时卸载。例如,像这样的类变量:

private int classinVar;

类在加载时会自动初始化其默认值,同样的概念也适用于注销。当您注销后,该类将与其静态字段一起退出上下文。


2

如果是C/C++,而且您没有收集垃圾,那么您应该使用内存管理程序。如果是Java,请关闭内存中的任何“javaw”程序并关闭JVM。


2
即使在C/C++中,当进程终止(如果这是这个问题的关键),操作系统也会释放所有内存。 - Thilo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接