静的メンバー変数格納メソッド領域に関する質問
1741 ワード
staticで修飾された静的メンバー変数は、メソッド領域に格納されているとネット上で言われていますが、テストコードでテストしてみました.
メソッド領域に格納されている以上、なぜスタック領域にメモリを割り当てるのかという現象があります.staticで修飾されたメンバー変数がメソッド領域に格納されているのは1つの参照であり、実際の値は、元のタイプであればスタック領域(元のタイプのメンバー変数がスタック領域のインスタンスデータに格納されている)に格納され、参照タイプであればスタック領域に格納され、メソッド領域にグローバルな意味での参照が格納されているだけであると理解できるかどうか分かりません.
印刷されたGCログは次のとおりです.
/**
* -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で修飾されたメンバー変数がメソッド領域に格納されているのは1つの参照であり、実際の値は、元のタイプであればスタック領域(元のタイプのメンバー変数がスタック領域のインスタンスデータに格納されている)に格納され、参照タイプであればスタック領域に格納され、メソッド領域にグローバルな意味での参照が格納されているだけであると理解できるかどうか分かりません.
印刷された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)