关于静态成员变量存储方法区的疑问

被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) 

 

你可能感兴趣的:(JVM)