java 对象的创建过程如下:
1, 类加载检查, 当虚拟机遇到 new 关键字的时候虚拟机会检查指定的类是否存在, 以及该类是否已经加载, 解析, 初始化过, 如果没有则进行加载, 解析.
2, 分配内存, 当类加载解析完成后就可以知道类的对象需要占用的内存大小, 这时就会为对象分配连续且大小固定的内存.
1, 查找合适的内存区域的过程如下:
1, 如果 gc 采用的时 serial,parnew 算法, 采用指针碰撞的方式找. 因为这两种算法是清除再整理的方式回收垃圾
2, 如果 gc 采用的是 cms 算法, 采用空闲列表的方式找. 因为 cms 采用的是标记清楚的方式回收垃圾
2, 找到合适的内存区域后分配内存的过程中可能因为有大量的对象在创建而导致冲突, 虚拟机处理冲突的方式如下:
1, 采用 cas + 失败重试的方式进行分配, 知道分配成功
2, 先在新生代区域为每个线程分配一个区域, 如果区域大小不够了就采用 cas + 失败重试的方式获取足够的内存
3, 内存初始化, 将除了存放对象头的区域以外的内存初始化为零值
4, 设置对象头, 存储一些对象的信息, 例如, 对象属于哪个类, 类的元数据, 在 gc 中属于哪个代, 对象的 hashcode 等信息
5, 执行初始化方法, 包括静态代码块, 代码块, 构造函数
来源: http://www.bubuko.com/infodetail-2968594.html