java对象怎么创建_java对象是如何创建的
当虚拟机遇到一条new指令以后,首先会去检测这个指令的参数能否在常量池中定位到一个类的符号引用,并检测这个类是否被加载、解析、初始化过,没有就先去加载类。
对象创建在堆划分空间可用指针碰撞(使用过的内存放一边未使用的放一边)和空闲列表,划分空间时可能会出现线程不安全的情况#,所以分配内存的时候采用 CAS(Compare and Swap)配上失败重试保证原子性或者采用TLAB(Thread local allocation buffer每个线程在堆中预先分配一块内存),哪个线程需要分配内存,就在该线程的TLAB上分配。
内存分配完后虚拟机需要将内存空间初始化,这样可保证对象被创建以后可以直接使用,比如 new Object() 可直接使用。这里的初始化是指字段置0,并不是赋值
接下来虚拟机会对对象的象头(Object Header)进行设置,比如是哪个类的实例,对象的哈希码,对象的gc分代年龄,如何找到类的元数据信息等。是否启用偏向锁来设置头信息
最后执行init方法,把对象按照程序员的意愿初始化赋值(将对象引用入栈,@暂不确定是init以后入栈还是对象头信息设置完后后入栈)
对象包含三块区域:1、对象头 2、实例数据3、对齐填充
对象头包含两部分信息,一部分是用于存储自身运行时的数据,数据长度可达32或64bit
另外一部分是存储类型指针,即对象指向它的类元数据的指针,虚拟机用它来确定这个对象是哪个类的实例(不是所有虚拟机实现都必须在对象上保留类型指针),如果对象是一个数组,对象头中还必须有一块用于记录数组长度的数据。因为虚拟机可以根据对象所包含的元数据(就是对象包含的所有数据)确定对象需要多大空间,但是无法通过数组的元数据确定数组大小。
实例数据部分是对象真正存储的有效信息,也就是代码中定义的各种类型字段的内容。包括父类继承的和定义的都要记录下来。
java对象怎么创建_java对象是如何创建的相关推荐
- java对象怎么创建_Java对象是怎么创建的(通过对象的创建,了解JVM内存结构)...
在代码层面,我们通过new关键字创建一个对象: Object obj=new Object(); 而虚拟机中,创建一个对象,则经过了许多环节,JVM的内存结构可以通过另一篇文章了解:一个"H ...
- java对象怎么创建_java对象是怎么创建出来的
1.使用new关键字 这是最常见也是最简单的创建对象的方式了.通过这种方式,我们可以调用任意的构造函数(无参的和带参数的). Employee emp1 = new Employee();0: new ...
- java 对象池 实现_Java对象池技术的原理及其实现
看到一片有关于java 对象基础知识,故转载一下,同时学习一下. 摘 要 本文在分析对象池技术基本原理的基础上,给出了对象池技术的两种实现方式.还指出了使用对象池技术时所应注意的问题. 关键词 对象池 ...
- java对象生命周期_Java对象生命周期和类生命周期
原标题:Java对象生命周期和类生命周期 作者:彭空空 链接:https://www.jianshu.com/p/25ea857ba78b 导读 对象的生命周期 类的加载机制 类的生命周期 类加载器 ...
- java对象的类型转换_Java对象的类型转换和属性复制
1. 问题的源由 在J2EE项目开发中,会涉及很多领域模型对象,例如, VO (View Object) 视图对象,也叫展示对象,用于前端页面渲染所需要的数据 DTO (Data Transfer O ...
- java对象内存模型_Java对象的内存模型
众所周知,函数调用在内存中是通过压栈,退栈实现的,而Java的方法调用则是在JVM栈中通过栈帧实现的,且所有的Java对象都只在堆上分配内存.那么一个Java对象在堆内存里到底长啥样呢?实际上,当一个 ...
- java对象持久化技术_Java对象持久化技术Hibernate 一
Hibernate是Java应用和关系数据库之间的桥梁,它负责Java对象和关系数据之间的映射.Hibernate内部封装了通过JDBC访问数据库的操作,向上层应用提供了面向对象的数据访问API.在J ...
- java 对象深度复制_Java深度复制– Java复制对象
java 对象深度复制 Today we will look into Java deep copy. Sometimes we want to get a copy of an Object, bu ...
- java添加窗体中_java中利用JFrame创建窗体 【转】
Java代码 publicclassTest(){ publicstaticvoidmain(String[] args){ JFrame frame = newJFrame(); JPanel pa ...
最新文章
- 动态创建表格给同一个标签创建点击事件并让点击事件操作内容不一样
- js:自动亮起100盏灯
- python决策树id3算法_决策树ID3算法预测隐形眼睛类型--python实现
- linux 删除文件_Linux删除文件夹命令有哪些
- 给自己的网址加上https,添加ssl证书(springboot项目)
- 思科3560交换机端口限速
- c语言中extern关键字
- CSDN - 屏蔽百度广告
- Linux Workqueue
- 全美电影票房排行(截止2010.12.19)
- 不服!女性为何成为科技领域的“隐形人”?讲讲崛起中的“她”力量
- 金士顿U盘被写保护的解决方法(量产)
- 计算机基础——4.1 数字通信入门
- python软件长什么样子图片_使用Python把多个图片拼接成为长图
- 设备驱动中的并发控制-自旋锁
- M*LMM缩略图文件管理模式模块开发(一个含有listview和gridview浏览模式的文件管理器)
- using b tree mysql_浅析MysQL B-Tree 索引
- HashMap中put方法(白话加源码分析)
- 729. 我的日程安排表 I
- db2嵌套查询效率_嵌套查询与连接查询的性能
热门文章
- Java输入年度和月份判断有多少天
- html5 输入用户名和密码登陆网址,192.168.5.1路由器登录入口用户名和密码
- code回归采访哭 ladies_南太铉直播下跪?星船新男团?Mina归队?Kingdom来了?itzy回归?...
- application.properties引用其他文件_企业级SpringBoot应用多个子项目配置文件规划、多环境支持(一)...
- Unreal Engine 4 基于网格的水面模拟实现
- DrawPrimitiveUP And DrawIndexedPrimitiveUP
- Spring Cloud Netflix Zuul 1.0 简化说明
- python课堂笔记之django-day02(7)
- 前端 -- jQuery
- Bzoj1899: [Zjoi2004]Lunch 午餐