java类驻留在内存中的时间

时间:2010-02-23 19:59:17

标签: java classloader

我正在考虑一个类在内存中驻留多少内容,以防它被内存中的其他对象访问?

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

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 ......

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

4 个答案:

答案 0 :(得分:10)

现在,答案是永远的。类定义被放入permanent generation,并保持在那里直到程序终止。

请注意,这是JVM上的动态语言的问题,如JRuby,它可以动态创建类,因为这些类浪费了空间。我相信可以解决这个问题的工作有所改变 - 例如G1 collector

答案 1 :(得分:3)

定义了从类到其类加载器实例,从类加载器实例到它曾经加载的每个类的有效引用。所以一个类只能在类加载器的同时卸载(给出或采取奇怪的终结者复活技巧)。由类加载器加载的每个类都有资格同时收集。

在实践中,类数据存在于“永久代”中(至少在HotSpot中)。这通常比主堆更少地收集垃圾,因为它应该有更少的流失。类加载器“泄漏”的情况并不少见。大多数应用程序的代码都会持续到重新启动进程。开发应用服务器通常会重新加载“应用”,同时维护核心服务器/容器和一些库代码。

IIRC,JDK 1.1卸载个别类,导致问题(Java 2于1998年问世)。

答案 2 :(得分:2)

java文档确实永远地说:http://java.sun.com/docs/books/tutorial/java/javaOO/classvars.html

  

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

答案 3 :(得分:2)

有很多关于类加载的信息。例如,这里有一篇文章:http://www.ibm.com/developerworks/java/library/j-dyn0429/

  

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

这是关于加载的JVM规范。 http://java.sun.com/docs/books/jvms/second_edition/html/ConstantPool.doc.html