课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
随着互联网的不断发展,越来越多的人都在通过自学或者参加达内培训来学习Java编程开发的相关技术知识等内容,而本文我们就通过案例分析来简单了解一下,Java编程对象的应用方法分享。
一、如何定位一个对象
1、直接定位也就是指针定位(hotspot使用方式),直接定位到实例对象内存地址。这种方式的好处是速度快(对比句柄访问,减少一次指针开销);缺点是GC的时候需要改变指针的指向
2、句柄定位,在堆中划分出一块内存区域作为句柄池,变量都指向句柄池内的地址,再句柄池内指向实例对象以及Class。好处是在GC的时候只需要改变句柄池中的地址。缺点就是查找慢,毕竟多了一次指针开销
二、对象在内存中的布局
总的来说对象在内存中布局总共分为三部分对象头(markWorld、klasspointer)、实例数据、对齐。
1、markworld:锁信息、hashCode、gc信息
synchronized加锁之后,我们可以明显看到markword内信息发生变化
gc信息包含gc年龄、颜色标记等信息
2、klasspointer:我这里关闭了指针压缩所以看到的klasspointer是8个字节,jdk8默认是开启指针压缩的在内存小于32G的时候klasspointer是4个字节。这部分内容主要是指向当前对象的类型也就是class对象
3、实例数据:这部分主要看类中到底有哪些成员变量,如成员变量int,所以占4个字节
4、对齐填充:这部分是可有可无的,对象的大小是8的整数倍,如果无法被8整除,就需要补充对齐,如上述对象需要补充4字节对齐
三、对象是在内存中是如何分配的
简单来说对象分配的流程(当然其中有很多细节,对象分配也与使用的gc有关)
1、判断对象是否可以在栈上分配(逃逸分析、标量替换)
2、判断对象的大小如果过大直接分配到老年代(-XX:PretenureSizeThreshold)
3、否则分配到eden区,经过gc后,存活的对象移动到fromSurvivor区;再次经过gc存活的对象移动到Tosurvivor区同时两个survivor互换身份(eden、survivor比例参数-XX:SurvivorRatio)
4、gc年龄达到阈值,对象移动到老年代(-XX:MaxTenuringThreshold指定移动到老年代gc年龄)
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。