如你所知,Java是一门面向对象的编程语言。我们平常在写代码的时候也是在不停的操作各种对象,那么当你在写出User user = new User();这样一行代码的时候,JVM都做了些什么呢?
在Hotspot虚拟机中一个对象的内存布局分为三个部分:对象头、实例数据、对齐填充。
Java程序中我们操作一个对象是通过指向这个对象的引用。我们都知道对象存在堆中,这个引用存在虚拟机栈中。那么引用通过什么方式去定位堆中对象的位置呢?
上面介绍了对象的基本信息,现在来讲一讲创建对象的流程:
分配内存有两种方式:
无法找到足够的内存时会触发一次GC
分配内存时并发问题解决方案:
A a = new A();
new一个对象的简单分解动作:
其中2、3两步间会发生指令重排序,导致多线程时如果在初始化之前访问对象则会出现问题,单例模式的双重检测锁模式正是会存在这个问题。可以使用volatile来禁止指令重排序解决问题;