java虚拟机-------new 对象的机制

1.查找对象基本信息

从永久代里得到该对象的class信息,然后会查看该class是否已经被加载或者创建对象,如果已经被加载了,那么便分配一块堆内存作为对象,并把相关class记录的信息分配到该块内存里。如果还没有被加载,那么还需要加载class信息。

2.分配地址

怎么分配地址,这跟虚拟机的GC策略有关。

如果GC策略是重排压缩,那么在已使用过的内存和未使用过的内存中间有个指针,那么直接分配到下一块内存,指针前移动即可。

如果GC策略是清理,那么需要找到一份足够大(支持new对象)的一块内存,分配给该对象。

此外在多线程中,有可能多个线程同时创建对象,会共同占用某块内存该如何做呢?有三种方法。

1。对内存加锁,但是这样效率要低下一些。

2。cas自旋和重试

3。在一条线程开启时,就立即分配给该线程一大块线程内存,该新建新建对象时,放到线程内存即可,如果出现GC或者某个线程内存满了,那么所有线程重新分配空闲内存。

3.分配内存

给一个对象分配了一块内存,但这块内存严格来说又分为三部分。分别是对象头,实例数据,对齐补充

对象头:

对象头又分为几部分,

一部分时运行时数据,包括哈希值,GC年龄,锁标志等,

一部分放置class元数据信息(有的虚拟机没有)。

如果是数组,对象头里还有个length

实例数据:

属性的值,比如int a; 那么分配一个0, 比如long b =1000L, 那么分配个1000L

对齐补充:

java虚拟机规范规定对象内存大小必须是8字节的倍数,那么如果不够8字节,则需要补充,这块就是补充的,没什么用。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值