java普通对象的创建过程
2016-01-22 15:16
337 查看
在java中创建对象通常是用一个new关键字,那么此时java虚拟机都做了什么呢?今天简单的看了一下,这里的对象指普通java对象,不包括数组和Class对象。
当虚拟机遇到一条new 指令时,会执行一下操作:
首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否已经被加载、解析和初始化过,如果没有,那么必须先执行相应的类加载过程。
在类加载检查通过后,接下来虚拟机将为新生对象分配内存,对象所需内存的大小在类加载完成后便可以完全确定。
接下来虚拟机要对对象进行必要的设置,例如这个对象是哪个类的实例、对象的哈希码、对象的GC分代年龄等信息,这些信息存放在对象的对象头之中。
在上面工作都完成之后,从虚拟机的角度看,一个新的对象已经产生了,但从java程序的角度看,对象创建刚刚开始,还没有执行init方法,所有的字段都还为零。一般情况下执行完执行完new指令之后会接着执行init方法,把对象按照程序员的意愿进行初始化,这样一个真正可用的对象才算完全产生出来。
当虚拟机遇到一条new 指令时,会执行一下操作:
首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否已经被加载、解析和初始化过,如果没有,那么必须先执行相应的类加载过程。
在类加载检查通过后,接下来虚拟机将为新生对象分配内存,对象所需内存的大小在类加载完成后便可以完全确定。
接下来虚拟机要对对象进行必要的设置,例如这个对象是哪个类的实例、对象的哈希码、对象的GC分代年龄等信息,这些信息存放在对象的对象头之中。
在上面工作都完成之后,从虚拟机的角度看,一个新的对象已经产生了,但从java程序的角度看,对象创建刚刚开始,还没有执行init方法,所有的字段都还为零。一般情况下执行完执行完new指令之后会接着执行init方法,把对象按照程序员的意愿进行初始化,这样一个真正可用的对象才算完全产生出来。
相关文章推荐
- Python动态类型的学习---引用的理解
- XP下使用虚拟机安装配置Solaris[多图]
- VirtualBox虚拟机XP与宿主机Ubuntu互访共享文件夹
- Linux下三大免费桌面虚拟机评测
- 用 GNOME Boxes 下载一个操作系统镜像
- 土人系列AS入门教程 -- 对象篇
- C#托管堆对象实例包含内容分析
- C#实现获取不同对象中名称相同属性的方法
- javascript asp教程第十一课--Application 对象
- PowerShell中使用Out-String命令把对象转换成字符串输出的例子
- VBS教程:对象-正则表达式(RegExp)对象
- C#检查指定对象是否存在于ArrayList集合中的方法
- sql2008启动代理未将对象应用到实例解决方案
- C#编程自学之类和对象
- C++中对象的常引用、动态建立和释放相关知识讲解
- php中将一个对象保存到Session中的方法
- android 使用虚拟机安装apk(图文教程)
- php对象和数组相互转换的方法
- PHP中把对象转换为关联数组代码分享
- C#写入对象或集合类型数据到xml文件的方法