深入理解JAVA虚拟机--HotSpot虚拟机对象

对象的创建

虚拟机遇到new指令:   首先先去检查这个指令的参数是否在常量池中定位到一个类的符号引用,

                                      并检查这个符号引用代表的类是否被加载、解析和初始化过。

                                      如果没有,执行相应的类加载;

类加载通过,VM为新生对象分配内存:内存大小在类加载后完全确定。

                                       分配方式:指针碰撞--Java堆内存绝对规整

                                                        空闲列表--ava堆内存不规整

                                       Java堆是否规整由所采用的垃圾收集器是否带有压缩整理功能决定。

                      另一个需要考虑的问题:对象创建行为频繁,仅修改一个指针指向的位置,并发情况下不能保证线程安全?

                      现象:正在给A对象分配内存,指针没来得及修改,B对象同时使用了原来的指针来分配内存。

                     解决方案:

                             第一种:对分配内存空间的动作进行同步处理--VM采用CAS 配上失败重试的方式保证更新操作的原子性;

                             第二种:把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在Java堆中预先分配一小块内                                              存,称为本地线程分配缓冲(TLAB)。

猜你喜欢

转载自blog.csdn.net/qq_40722284/article/details/80670246