Java 对象占用大小

JDK8_64_HotSpot VM
这个环境中的默认配置下,压缩对象指针(UseCompressedOops)和压缩类指针(UseCompressedClassPointers)都是打开的。

java -XX:+PrintCommandLineFlags Test
-XX:InitialHeapSize=268435456 -XX:MaxHeapSize=4294967296 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC

参数说明

-XX:+PrintCommandLineFlags:让 JVM 打印出那些已经被用户或者JVM设置过的XX参数的名称和值。
-XX:+PrintFlagsFinal:"="表示第四列是参数的默认值,而":="表示参数被用户或者 JVM 赋值了。
-XX:+PrintFlagsInitial:让 JVM 打印出 JVM XX 初始值。
于是空对象(java.lang.Object)的大小是16:
mark word:8字节;压缩的Klass*4字节;padding:4字节;
而空数组的大小也是16:
mark word:8字节;压缩的Klass*4字节;length:4字节。
比如 Integer 在未开启指针压缩的情况下:
Integer x = 255;
java -XX:-UseCompressedOops

在这里插入图片描述

hsdb> whatis 0x00000001d1d8dd10
Address 0x00000001d1d8dd10: In unknown section of Java heap 
hsdb> inspect 0x00000001d1d8dd10
instance of Oop for java/lang/Integer @ 0x00000001d1d8dd10 @ 0x00000001d1d8dd10 (size = 24)
_mark: 1
_metadata._klass: InstanceKlass for java/lang/Integer
value: 255
hsdb> mem 0x00000001d1d8dd10 3
0x00000001d1d8dd10: 0x0000000000000001 
0x00000001d1d8dd18: 0x000000011777e570 
0x00000001d1d8dd20: 0x00000000000000ff 

hsdb> inspect 0x000000011777e570
Type is InstanceKlass (size of 440)
juint Klass::_super_check_offset: 56
Klass* Klass::_secondary_super_cache: Klass @ null
Array<Klass*>* Klass::_secondary_supers: Array<Klass*> @ 0x000000011777e558
Klass* Klass::_primary_supers[0]: Klass @ 0x00000001176c6c00
oop Klass::_java_mirror: Oop for java/lang/Class @ 0x00000001d1d05eb8 Oop for java/lang/Class @ 0x00000001d1d05eb8
jint Klass::_modifier_flags: 17
Klass* Klass::_super: Klass @ 0x0000000117775218
Klass* Klass::_subklass: Klass @ null
jint Klass::_layout_helper: 24
Symbol* Klass::_name: Symbol @ 0x000000010bd38340
AccessFlags Klass::_access_flags: 49
markOop Klass::_prototype_header: 5
Klass* Klass::_next_sibling: Klass @ 0x000000011777a850
u8 Klass::_trace_id: 7405568
Klass* InstanceKlass::_array_klasses: Klass @ 0x0000000117869b80
Array<Method*>* InstanceKlass::_methods: Array<Method*> @ 0x000000011777b698
Array<Method*>* InstanceKlass::_default_methods: Array<Method*> @ null
Array<Klass*>* InstanceKlass::_local_interfaces: Array<Klass*> @ 0x000000011777b5f0
Array<Klass*>* InstanceKlass::_transitive_interfaces: Array<Klass*> @ 0x000000011777e558
Array<u2>* InstanceKlass::_fields: Array<u2> @ 0x000000011777b608
u2 InstanceKlass::_java_fields_count: 11
ConstantPool* InstanceKlass::_constants: ConstantPool @ 0x000000011777abd0
ClassLoaderData* InstanceKlass::_class_loader_data: ClassLoaderData @ 0x00007fad2380a980
u2 InstanceKlass::_source_file_name_index: 201
char* InstanceKlass::_source_debug_extension: char @ null
Array<jushort>* InstanceKlass::_inner_classes: Array<jushort> @ 0x000000011777e540
int InstanceKlass::_nonstatic_field_size: 1
int InstanceKlass::_static_field_size: 8
u2 InstanceKlass::_static_oop_field_count: 5
int InstanceKlass::_nonstatic_oop_map_size: 0
bool InstanceKlass::_is_marked_dependent: 0
u2 InstanceKlass::_minor_version: 0
u2 InstanceKlass::_major_version: 52
u1 InstanceKlass::_init_state: 4
Thread* InstanceKlass::_init_thread: Thread @ 0x00007fad24001800
int InstanceKlass::_vtable_len: 11
int InstanceKlass::_itable_len: 5
u1 InstanceKlass::_reference_type: 0
OopMapCache* InstanceKlass::_oop_map_cache: OopMapCache @ null
JNIid* InstanceKlass::_jni_ids: JNIid @ null
nmethod* InstanceKlass::_osr_nmethods_head: nmethod @ null
BreakpointInfo* InstanceKlass::_breakpoints: BreakpointInfo @ null
u2 InstanceKlass::_generic_signature_index: 199
jmethodID* InstanceKlass::_methods_jmethod_ids: jmethodID @ null
u2 InstanceKlass::_idnum_allocated_count: 55
Annotations* InstanceKlass::_annotations: Annotations @ null
nmethodBucket* InstanceKlass::_dependencies: nmethodBucket @ null
Array<int>* InstanceKlass::_method_ordering: Array<int> @ 0x00000001176c5f40
Array<int>* InstanceKlass::_default_vtable_indices: Array<int> @ null
Integer[] arr = new Integer[]{1, 2, 3};

在这里插入图片描述

参考

http://ifeve.com/useful-jvm-flags-part-3-printing-all-xx-flags-and-their-values/
http://xmlandmore.blogspot.com/2014/08/jdk-8-usecompressedclasspointers-vs.html

发布了778 篇原创文章 · 获赞 323 · 访问量 209万+

猜你喜欢

转载自blog.csdn.net/lgh1992314/article/details/104460568