我正在考虑一个类在内存中驻留多少内容,以防它被内存中的其他对象访问?
例如,假设我有一些这样的类: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 ......
所以,我的问题是这个方法返回初始值的概率是多少,它应该返回序列值?
答案 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