Java对象的创建过程
来源:互联网 发布:上瘾 顾海 知乎 编辑:程序博客网 时间:2024/06/08 11:10
JAVA中创建对象直接new创建一个对象,对么对象的创建过程是怎样的呢?
程序运行过程中有许多的对象被创建出来.那么对象是如何创建的呢?
一 对象创建的步骤
1 遇到new指令时,检查这个指令的参数是否能在常量池中找到一个符号引用
2 如果找到符号引用,就检查这个符号引用是否已经被加载,解析和初始化过
3 如果没有加载过,则执行类加载过程
4 为对象分配内存(对象所需的内存在类加载的时候就可以确定)
- 指针碰撞法 : 假设java堆中的内存是规整的,所有用过的内存放在一边,空闲的内存放在另一边中间放着指针作为分界点,那分配内存就是指针向着空闲的那一边移动一段与对象大小相等的距离就行了.
- 空闲列表法 : 如果Java堆中的内存不是规整的,已使用的内存和空闲的内存相互交错存放,那就没有办法用指针碰撞法了,虚拟机就需要维护一个列表,记录哪块内存是可用的,哪块内存是空闲的,在分配内存的时候,从列表中找到一块足够大的内存空间划分为对象实例,并更新列表
5 分配完内存后,虚拟机需要将分配到的内存初始化为0
问题如下:
上面两种内存分配的方法还带来了另外一个问题,即多个线程同时分配内存的情况下的安全问题
例如:
指针碰撞法,指针的指向还没有来得及更改的时候,另一个线程又使用了原来的指针分配内存的情况
解决方法:
- 对分配内存的动作进行同步加锁处理
- 把内存分配的动作在按照线程划分在不同的空间之中进行,即每个线程在Java堆中预先分配一小块内存,称为 本地线程分配缓冲(Thread Local allocation Buffer, TLAB).哪个线程要分配内存,就先在自己的TLAB中进行,只有TLAB用完了之后并分配新的TLAB时,才需要同步锁定.
注:虚拟机是否需要开户TLAB,可以通过参数来设定
阅读全文
0 0
- Java对象的创建过程
- java对象的创建过程
- java对象的创建过程
- java对象的创建过程
- java对象的创建过程
- java对象的创建过程
- Java对象的创建过程
- Java对象的创建过程
- Java对象的创建过程
- Java对象的创建过程
- java对象的创建过程
- Java对象的创建过程
- java对象的创建过程
- Java-对象的创建过程
- Java对象的创建过程
- JAVA对象的创建过程
- java对象的创建过程
- Java创建对象的过程
- 大数据常见问题
- 5.1.1 二叉搜索树
- Lumen 框架路由访问一直报404错误
- 常用Linux命令
- fastjson相互转换
- Java对象的创建过程
- jQuery中keyup与keydown事件的用法
- mfc非模态对话框Child窗口CEdit控件获取不到焦点问题
- 不允许保存更改。您所做的更改要求删除并重新创建以下表。您对无法重新创建的标进行了更改或者启用了“阻止保存要求重新创建表的更改"选项。
- Bug解决方案:org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 8; 不允许有匹配 "[xX][mM][lL]" 的处理指令目标
- jquery inArray() 判断数组是否包含某元素
- 简单定时器开发
- spring-session源码解读2
- VBA word入门 批量绘制指定位置大小的形状