对象在堆上的创建问题
2015-12-12 10:35
288 查看
当虚拟机遇到一条new指令时,会去检查方法区检查是否已经在此类的数据(类已经被加载解析和初始化),不存在则 加载类数据。然后再堆上创建对象。这时,对象的创建一定会有多线程的问题,因为我们不知道某块内存地址,是否会同时有多个对象的创建。这时候一定是需要进行同步处理的。
下面说下对象创建的两种方式。
1:指针碰撞
假设堆内存是整齐有序的,指针一侧是已使用内存,另一侧是未使用内存,直接将指针移动对象的大小即可。(适用于有标记整理垃圾回收算法的JVM)
2:空闲列表
记录堆内存的空闲情况,并在合适的内存上创建对象,然后将此内存标记为已使用。(适用于CMS等基于mark-sweep的收集器)
关于同步:
1.使用cas+失败重试
2.使用TLAB,类似于ThreadLocal的思想,在堆上分配线程分配缓冲区(TLAB),每个线程都在自己的TLAB上分配对象,不存在冲突的情况,只有当TLAB用完时,才使用锁定。
下面说下对象创建的两种方式。
1:指针碰撞
假设堆内存是整齐有序的,指针一侧是已使用内存,另一侧是未使用内存,直接将指针移动对象的大小即可。(适用于有标记整理垃圾回收算法的JVM)
2:空闲列表
记录堆内存的空闲情况,并在合适的内存上创建对象,然后将此内存标记为已使用。(适用于CMS等基于mark-sweep的收集器)
关于同步:
1.使用cas+失败重试
2.使用TLAB,类似于ThreadLocal的思想,在堆上分配线程分配缓冲区(TLAB),每个线程都在自己的TLAB上分配对象,不存在冲突的情况,只有当TLAB用完时,才使用锁定。
相关文章推荐
- Unity3D在一建筑GL材料可以改变颜色和显示样本
- (eden)eggs
- jdbc调用sparksql
- PAT 1048. 数字加密
- jdbc调用sparksql
- resumable_timeout 参数说明
- LeetCode 242 Valid Anagram
- TLD视觉跟踪算法
- 高性能必须有 多活塞卡钳
- Unity Shader学习总结(基础篇)
- java初始化技巧
- 将JSON转化为NSArray或者NSDictionary
- eclipse中(代码块)[注释][缩进]和(相关名称)[重命名],Python[编码规范]
- 优化MySQL的21个建议
- Ubuntu下的gcc降级
- Android编程实现TextView部分颜色变动的方法
- PHP环境(apache,PHP,Mysql)详细配置方法
- Python中使用中文
- 关于uitableviewcell的accessoryType属性
- ABP理论学习之模块系统