本篇文章基于V0.16 JOLSample_17_ArrayLength
这个例子用于演示对象头上的数组长度。数组长度并不是数组类型的一部分,因此虚拟机需要在对象头上有一个额外的位置存储数组长度。
1 2 3 4 5 6 7 8 9 10 11 12 public class JOLSample_17_ArrayLength { public static void main (String[] args) { out.println(VM.current().details()); for (int c = 0 ; c < 8 ; c++) { out.println("**** int[" + c + "]" ); out.println(ClassLayout.parseInstance(new int [c]).toPrintable()); } } }
运行结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 # Running 64 -bit HotSpot VM . # Using compressed oop with 3 -bit shift. # Using compressed klass with 3 -bit shift. # WARNING | Compressed references base/shifts are guessed by the experiment! # WARNING | Therefore , computed addresses are just guesses, and ARE NOT RELIABLE . # WARNING | Make sure to attach Serviceability Agent to get the reliable addresses. # Objects are 8 bytes aligned. # Field sizes by type : 4 , 1 , 1 , 2 , 2 , 4 , 4 , 8 , 8 [bytes] # Array element sizes : 4 , 1 , 1 , 2 , 2 , 4 , 4 , 8 , 8 [bytes] **** int[0 ] [I object internals : OFF SZ TYPE DESCRIPTION VALUE 0 8 (object header : mark) 0x0000000000000001 (non-biasable; age : 0 ) 8 4 (object header : class ) 0xf800016d 12 4 (array length) 0 12 4 (alignment/padding gap) 16 0 int [I.<elements> N/A Instance size : 16 bytesSpace losses : 4 bytes internal + 0 bytes external = 4 bytes total**** int[1 ] [I object internals : OFF SZ TYPE DESCRIPTION VALUE 0 8 (object header : mark) 0x0000000000000001 (non-biasable; age : 0 ) 8 4 (object header : class ) 0xf800016d 12 4 (array length) 1 12 4 (alignment/padding gap) 16 4 int [I.<elements> N/A 20 4 (object alignment gap) Instance size : 24 bytesSpace losses : 4 bytes internal + 4 bytes external = 8 bytes total**** int[2 ] [I object internals : OFF SZ TYPE DESCRIPTION VALUE 0 8 (object header : mark) 0x0000000000000001 (non-biasable; age : 0 ) 8 4 (object header : class ) 0xf800016d 12 4 (array length) 2 12 4 (alignment/padding gap) 16 8 int [I.<elements> N/A Instance size : 24 bytesSpace losses : 4 bytes internal + 0 bytes external = 4 bytes total**** int[3 ] [I object internals : OFF SZ TYPE DESCRIPTION VALUE 0 8 (object header : mark) 0x0000000000000001 (non-biasable; age : 0 ) 8 4 (object header : class ) 0xf800016d 12 4 (array length) 3 12 4 (alignment/padding gap) 16 12 int [I.<elements> N/A 28 4 (object alignment gap) Instance size : 32 bytesSpace losses : 4 bytes internal + 4 bytes external = 8 bytes total**** int[4 ] [I object internals : OFF SZ TYPE DESCRIPTION VALUE 0 8 (object header : mark) 0x0000000000000001 (non-biasable; age : 0 ) 8 4 (object header : class ) 0xf800016d 12 4 (array length) 4 12 4 (alignment/padding gap) 16 16 int [I.<elements> N/A Instance size : 32 bytesSpace losses : 4 bytes internal + 0 bytes external = 4 bytes total**** int[5 ] [I object internals : OFF SZ TYPE DESCRIPTION VALUE 0 8 (object header : mark) 0x0000000000000001 (non-biasable; age : 0 ) 8 4 (object header : class ) 0xf800016d 12 4 (array length) 5 12 4 (alignment/padding gap) 16 20 int [I.<elements> N/A 36 4 (object alignment gap) Instance size : 40 bytesSpace losses : 4 bytes internal + 4 bytes external = 8 bytes total**** int[6 ] [I object internals : OFF SZ TYPE DESCRIPTION VALUE 0 8 (object header : mark) 0x0000000000000001 (non-biasable; age : 0 ) 8 4 (object header : class ) 0xf800016d 12 4 (array length) 6 12 4 (alignment/padding gap) 16 24 int [I.<elements> N/A Instance size : 40 bytesSpace losses : 4 bytes internal + 0 bytes external = 4 bytes total**** int[7 ] [I object internals : OFF SZ TYPE DESCRIPTION VALUE 0 8 (object header : mark) 0x0000000000000001 (non-biasable; age : 0 ) 8 4 (object header : class ) 0xf800016d 12 4 (array length) 7 12 4 (alignment/padding gap) 16 28 int [I.<elements> N/A 44 4 (object alignment gap) Instance size : 48 bytesSpace losses : 4 bytes internal + 4 bytes external = 8 bytes total