静态方法(实际上是所有方法)和静态变量是反射数据的一部分,因此存储在PermGen部分中。 这是依赖于类而不是实例的数据。
需要澄清的最新情况:
请注意,只有变量及其技术值(参见原语或)存储在PermGen空间中。
如果静态变量是对对象的引用,则对象本身存储在堆的常规部分(年轻/年老层代或幸存者空间)。 这些对象不会存储在PermGen空间中,除非它们是内部对象,如类。
示例:静态Inti=1; //the value1isstoredinthepermgensectionstaticobjecto=new some object (; //the参考(pointer/memory address ) isstoredinthePermGensection,theobjectitselfisnot。
关于垃圾收集的话:
不要依赖finalize ()。 因为不一定跑。 这完全取决于JVM何时运行垃圾收集器以及收集什么,即使一个对象满足垃圾收集条件也是如此。
当然,也可以将静态变量设置为NULL以删除对堆中对象的引用,但这不意味着垃圾收集器会收集它们(即使没有更多的引用)。
此外,finalize ()只运行一次,因此必须避免引发异常或收集对象。 如果由于某些异常而停止退出,则不会在同一对象上再次调用finalize ()。
最后一个注意事项代码、运行时数据等的存储方法因使用的JVM而异。 也就是说,HotSpot可能与JRockit不同,同一JVM的不同版本之间也可能不同。 以上内容基于HotsforJava 5和6。 这些基本上一样。 回答的时候,我想很多人都在使用这些JVM。 由于Java 8对内存模型进行了重大更改,因此上述语句可能不适用于Java8hotspot。 另外,由于没有检查Java 7 HotSpot的变更,所以上述版本也是正确的,但这里不确定。