请问各位专家,目前在java中,静态方法和静态变量分别储存在内存中哪里呀?有内存讲解图吗?有的说方法区有的说永久区,有的说永久区现在被淘汰了,人都晕了
在JDK7以前,静态方法以及静态变量都存储在堆的PermGen部分中
从 Java 8 开始,废除了PermGen,将它们存储在了元空间Metaspace中,并且根据 JEP 122,它只保存元数据,而静态字段存储在堆中
JDK7:字符串字面量和类的静态变量首先被从永久代被移出到Java堆中;避免因为字符串字面量大量存储到字符串常量池中而导致的永久代内存溢出。
JDK8:JVM彻底移除了永久代,同时引入元空间(Metaspace)来管理原来的元数据,这些元数据被分配到本地内存中进行管理。元空间默认上限是本地内存大小,所以降低了元空间OOM的可能性。
静态方法(实际上所有方法)以及静态变量都存储在PermGen部分,因为它们是反射数据的一部分(类相关数据,而不是与实例相关的)。只有变量及其技术值(原语或引用)存储在PermGen空间中。如果静态变量是对象的引用,则该对象本身存储在堆的正常部分。这些对象(除非它们是类等内部对象)是不存储在PermGen空间。
在JDK7以前:字符串字面量和类的静态变量首先被从永久代被移出到Java堆中;避免因为字符串字面量大量存储到字符串常量池中而导致的永久代内存溢出。
从JDK8开始:JVM彻底移除了永久代,同时引入元空间(Metaspace)来管理原来的元数据,这些元数据被分配到本地内存中进行管理。元空间默认上限是本地内存大小,所以降低了元空间OOM的可能性。
JDK8之前是有永久代的,但是现在没有了。目前大部分公司用的是JDK8,也就是从这一版本开始,用元空间代替了永久代。
静态方法、变量之前是存储在永久代,没有了永久代之后,被移到了堆中。