被static修饰的静态成员变量网上说是存储在方法区中,那么我用测试代码测试了一下:
/**
* -Xms10m -Xmx20m -XX:NewSize=5m -XX:+PrintGCDetails
*/
public class GCTest {
static byte[] a1 = new byte[1024 * 1024];
static byte[] a2 = new byte[1024 * 1024];
static byte[] a3 = new byte[1024 * 1024];
static byte[] a4 = new byte[1024 * 1024];
public static void main(String[] args) {
}
}
这里就有个现象,既然是存储在方法区,为什么却是在堆区内分配内存?我不知道是不是可以这么理解,就是被static修饰的成员变量存储在方法区内的只是一个引用,而实际的值,如果是原始类型就存储在栈区(原始类型的成员变量存储在堆区中的实例数据中),而引用类型就存储在堆区,只是方法区中存储一个全局意义上的引用而已?
打印的GC日志如下:
[GC [DefNew: 3726K->387K(4608K), 0.0044174 secs] 3726K->3459K(9728K), 0.0044796 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
Heap
def new generation total 4608K, used 1622K [0x327b0000, 0x32cb0000, 0x32e50000)
eden space 4096K, 30% used [0x327b0000, 0x328e4d60, 0x32bb0000)
from space 512K, 75% used [0x32c30000, 0x32c90c50, 0x32cb0000)
to space 512K, 0% used [0x32bb0000, 0x32bb0000, 0x32c30000)
tenured generation total 5120K, used 3072K [0x32e50000, 0x33350000, 0x33bb0000)
the space 5120K, 60% used [0x32e50000, 0x33150030, 0x33150200, 0x33350000)
compacting perm gen total 12288K, used 148K [0x33bb0000, 0x347b0000, 0x37bb0000)
the space 12288K, 1% used [0x33bb0000, 0x33bd52f0, 0x33bd5400, 0x347b0000)
ro space 10240K, 45% used [0x37bb0000, 0x38037290, 0x38037400, 0x385b0000)
rw space 12288K, 54% used [0x385b0000, 0x38c3ace8, 0x38c3ae00, 0x391b0000)