Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.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_Classloader - Fatal编程技术网

一个java类在内存中驻留多长时间

一个java类在内存中驻留多长时间,java,classloader,Java,Classloader,我在想,如果一个类没有被内存中的其他对象访问,它在内存中驻留了多少 例如,假设我有这样的类: public class OrderNumber { private static long counter = 0; public static long getOrderNumber(){ if (counter >= 100) { return counter = 1; } return ++count

我在想,如果一个类没有被内存中的其他对象访问,它在内存中驻留了多少

例如,假设我有这样的类:

public class OrderNumber {
 private static long counter = 0;

 public static long getOrderNumber(){
          if (counter >= 100) {
            return counter = 1;
          }
          return ++counter;
 }
}
我从另一个类调用它的静态方法:

long number = OrderNumber.getOrderNumber(); 
每次我调用它,它都会返回一个递增的数字,1,2,3,4


所以,我的问题是,这个方法返回初始值的概率是多少,它应该返回序列值???

现在,答案是永远。类定义被放入,并一直保留到程序终止


注意,对于JVM上的动态语言(如JRuby)来说,这是一个问题,它会动态创建类,因为这些类会浪费空间。我相信在工作中会有一些改变来解决这个问题-例如,java文档确实说了永远:

它们与类相关联,而不是与任何对象相关联。类的每个实例共享一个类变量,该变量位于内存中的一个固定位置


有很多关于类加载的信息。例如,这里有一篇文章:

加载类的规则如下 在JVM中详细说明 规范。基本原则是 只有在 需要(或至少看起来需要) 以这种方式加载--JVM有一些 实际负载的灵活性,但 必须保持一个固定的顺序 类初始化)。每个班级 加载的对象可能有其他类 这取决于,所以装载 这个过程是递归的


下面是加载时的JVM规范

定义为从类到其类加载器实例,从类加载器实例到其加载过的每个类都有一个有效的强引用。因此,一个类只能与一个类装入器同时卸载(要么采用奇怪的终结者复活技巧)。由类加载器加载的每个类都可以同时被收集

实际上,类数据生活在“永久的一代”(至少在热点中)。这通常是垃圾收集的频率低于主堆,因为它应该具有较少的搅动。类装入器“泄漏”的情况也很常见。大多数应用程序的代码持续到进程重新启动。开发应用程序服务器通常会重新加载“应用程序”,同时维护核心服务器/容器和一些库代码


IIRC、JDK1.1卸载了单个类,这导致了问题(Java2于1998年问世)。

您是在询问类加载器吗?我不确定你的第三段是否正确。即使一个
对象引用了
类加载器
,如果没有其他引用它,它也应该有资格被收集,对吗?好吧,
ClassLoader
并不强烈引用
对象本身,因此它们没有被收集的唯一原因是它们被添加到了永久生成中,正如daveb所指出的。我只是阅读了您链接到的文档,其中没有“永远”一词。它得到的最接近的是您引用的位,它没有说明类的保存时间,只是当
对象存在时,由它创建的任何对象都将引用相同的“内存中的固定位置”——即相同的
对象。