本文属于java基础面试系列:
63 int类型在32位和64位有什么不同
我看了题目之后觉得不是很理解,应该是跟操作系统无关的,网上搜了下也是没有好文章专门说明,比较困惑,咨询下题主:是楚楚街面试问的,还是把自己理解思路试着写一下。
**************************************************
题主反馈“有些编译器编译成字节码时就是给这种类型分配的8个字节,对象头大小确实和位数有关,这个是对象的大小,和基本类型声明的引用无关”。既然跟编译器有关,就可
参照之前整理的笔记,
http://bohu83.blog.163.com/blog/static/35417565201623113356903/?newFollowBlog
写个demo验证下:
public static void main(String[] args) {
// TODO Auto-generated method stub
int a =1;
byte[] b = new byte[2];
char c ='a';
System.out.println("object:"+ SizeOfObject.sizeOf(new Object()));
System.out.println( "int"+SizeOfObject.sizeOf(a));
System.out.println( "byte[2]"+SizeOfObject.sizeOf(b));
System.out.println( "char"+SizeOfObject.sizeOf(c));
}
具体操作参照上篇笔记,主要是使用Instrumentation API,它有一个叫做getObjectSize()的方法
其中运行结果如下(我本机是jdk1.7 64:默认开启指针压缩):

对象头: 32位系统上占用8bytes,64位系统上占用16bytes;
下面未开启情况:
下面未开启情况:
new byte[2]
2*1+16+8=26+padding(8)=32,
int 4+16+4 =24
针对开启情况: object header,未压缩前由一个native-sized mark word 8bytes加上一个class word 8bytes组成,共16bytes。采用压缩后,class word缩减为4bytes,现共占用12bytes;
2. reference类型,由8bytes缩减为4bytes;
3. 数组长度,由8bytes缩减为4bytes。
再算下压缩后情况:
new byte[2]
2*1+12+4=18+padding(6)=24
int 4+12=16
********************总结*************************
int与不同位数编译器有关,就上对象存储结构这块,与基本类型声明的引用无关,与操作系统无关。