深入理解JVM(二)创建对象
1. 遇到new指令时,检查常量池,检查是否被加载,解析及初始化,没有则执行类加载过程。
2. 类加载检查通过后,分配内存地址,分配方式分为指针碰撞(内存规整,一个接一个)跟空闲列表(维护可用地址),是否规整则根据垃圾回收机制进行确定,标记清除显然属于空闲列表,能进行内存重置的则是指针碰撞
【深入理解JVM(二)创建对象】3. 如何解决并发问题?
方案一:同步处理。通过CAS(内存值,旧值的预期值,要改的值,版本戳)加上失败重试的机制保证原子性。
方案二:把分配内存的动作根据不同线程划分在预分配的空间中进行,分配空间用完之后,进行同步锁定,这块内存被称为TLAB(Thread Local Allocation Buffer 本地线程分配缓存),虚拟机是否使用,采用-XX:+/-UseTLAB 指定
4. 分配内存空间之后,将分配到的内存空间初始化零值,如果是TLAB模式,可以在预分配的时候初始化,这个步骤的目的是保证对象可以不赋值即可使用,程序访问到零值
5. 设置对象基本信息。将对象是那个类的实例,如何找到元信息,对象的哈希码,对象的GC分代年龄信息等放置到对象的头部信息(Object Header)中,对象头后面会进一步阐述。
6. 虚拟机的创建完成,程序进行对象初始化并赋值。
推荐阅读
- 深入理解Go之generate
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- 由浅入深理解AOP
- 逻辑回归的理解与python示例
- 【1057快报】深入机关,走下田间,交通普法,共创文明
- 生发知识,带你深入了解
- 「按键精灵安卓版」关于全分辨率脚本的一些理解(非游戏app)
- 深入理解|深入理解 Android 9.0 Crash 机制(二)
- 不理解句意,你还想做对所有GRE填空题()
- 深入浅出谈一下有关分布式消息技术(Kafka)