Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java静态类生存期_Java_Jsp - Fatal编程技术网

Java静态类生存期

Java静态类生存期,java,jsp,Java,Jsp,如何收集Java静态类垃圾 我有一个静态类,它包含一个静态对象。如果我将对象设置为null,那么它将被垃圾收集。我不理解静态类的生命周期。程序关闭时是否进行垃圾收集?静态类始终是可访问的,因此从不进行垃圾收集 现在,如果您的静态类有一个非静态类的字段和实例,并且该字段和实例被设置为null,那么该内存将被释放,因为该对象不再被引用 比如说 public static StaticClass { public static InstanceClass myInstanceClass; }

如何收集Java静态类垃圾


我有一个静态类,它包含一个静态对象。如果我将对象设置为null,那么它将被垃圾收集。我不理解静态类的生命周期。程序关闭时是否进行垃圾收集?

静态类始终是可访问的,因此从不进行垃圾收集

现在,如果您的静态类有一个非静态类的字段和实例,并且该字段和实例被设置为null,那么该内存将被释放,因为该对象不再被引用

比如说

public static StaticClass
{
    public static InstanceClass myInstanceClass;
}

如果将
myInstanceClass
设置为null,则它将被垃圾收集

静态对象与类定义绑定,而不是与类实例绑定。


它们在类通过类加载器加载后立即生效,只有在类卸载时才会被销毁

-
静态
类只能在类级别而不是包级别,我们可以说
静态内部类
顶级类

-然后类加载器加载
静态

-现在
静态
类将进入内存,直到加载它的加载程序仍在运行,或者除非它没有被加载程序卸载。

请考虑以下方法:

每个对象都有对其类的引用

每个类都有一个对其类装入器的引用

每个类装入器都有一个对它曾经装入的每个类的引用


这整团乱七八糟的东西有可能变成垃圾。这是卸载/重新加载应用程序的基础(在servlet容器中)。但是,如果有一个对象仍然被引用,则类加载器及其所有类都无法卸载,因此实现应用程序卸载并非易事。

取决于“静态类”的含义。所有顶级类的行为也都类似于静态类……谢谢,什么时候卸载类?@w0051977:当您的类脱离上下文时,例如,如果您在单机模式下运行程序,并且程序被终止,或者如果您有一个部署了静态类的web应用程序,并且您取消了该应用程序的部署。总之,当加载上下文本身被破坏时,它被卸载。谢谢,如果它是一个web应用程序,那么我假设“加载上下文”是windows进程?@w0051977:否。每个部署的web应用程序都有自己的类加载器,当应用程序被取消部署时,类加载器及其所有类都被GCed,即使Java进程没有终止,我知道myInstanceClass是如何以及何时被垃圾收集的。我不明白StaticClass什么时候被垃圾收集。一定要从内存中卸载吗?@w0051977当您关闭程序时,它将be@w0051977尝试将静态类设置为null@SamIam:不能将类设置为null。你在胡说八道。我想说的正是这一点。将静态类设置为null甚至没有意义,因此,在程序终止hanks之前对其进行垃圾收集是没有意义的。我想您不知道这在.NET语言中是否相同。我有Java背景,但这些天我在用.NET语言编程。为什么不发布一个.NET问题呢。