微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JVM从入门到静态-对象实例化内存

对象的实例化

1.创建对象的几种方式

创建对象

1.new 方式;

单例模式:调用XXX的静态方法(构造方法私有化了)

XxxBuilder/XxxFactory的静态方法

2.Class的newInstance():

反射的方式,只能调用空参的构造器,权限必须是public;

JDK9中已经废弃;

3.Constructor的newInstance(Xxx):

反射的方式,可以调用空参、带参的构造器,权限没有要求;

JDK9后替代Class的newInstance()

4.使用clone():浅复制

调用任何构造器,当前类需要实现Cloneable接口,实现clone()

5.使用反序列化:从文件中,从网络中获取一个对象的二进制流

6.第三方库Objenesis;使用字节码创建对象 

2.创建对象的步骤

1.判断对象对应的类是否加载、链接、初始化

2.为对象分配内存

若内存规整:指针碰撞-- 标记整理算法

若内存不规整:虚拟机需要维护一张表--标记压缩算法

空闲列表分配

3.处理并发安全问题

4.初始化分配到的空间

所有属性设置初始化值,保证对象实例字段在不赋值时可以直接使用;

5.设置对象的对象头;

6.执行init方法间初始化;

调用类的构造器

 

new相当于创建对象,但未初始化;执行完初始化后,属性就会赋值上认值;

 

3.对象内存布局

对象头:两部分运行时元数据、类型指针;

运行时元数据:哈希值、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳

 

主线程的VMS(虚拟机栈):

局部变量表:参数args,变量cust;(因为是静态函数所以没有this,非静态函数要有this)

局部变量表cust执行堆空间的对象头(运行时元数据、类型指针);

类型指针指向方法区的类元信息(元空间);

字符串常量池:放在堆空间中;

 

4.对象访问定位

 

对象访问方式主要两种:句柄访问、直接指针(Hotspot采用)

句柄访问

指针直接引用

句柄访问和指针直接引用对比

句柄访问需要单独开辟句柄池;访问时先在句柄池中找到句柄,然后再通过句柄在实例池中找到对象实例;

而指针直接引用无需开辟额外空间,可直接指向找到方法区中的对象类型数据;

句柄访问的优点:

 

 

 

 

 

 

 

大厂面试题:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐