Java虚拟机相关知识(2)—对象的创建
2016-04-01 19:15
295 查看
对象的创建
当要new一个对象时,主要执行的步骤有以下几条;定位new后面的参数在常量池定位中是否能够找到该类的符号引用。若找不到,就进行相应的类加载过程。
对要new的对象在堆中分配一定的空间。
在类加载过程中,对象的大小已经确定。
指针碰撞:假设堆中空间是连续的,未分配和已分配的中间用一个指针分隔表示。则将指针向未分配部分移动,则可为其划分空间空闲列表:堆中空间不是连续的,则维护一个空闲列表,记录哪些内存块可用。分配时找一个比较大的空间分配,然后更新列表。
采用哪种方式,主要看垃圾收集器是否实现了压缩功能。
为对象在堆中分配空间的方法主要有两种,指针碰撞和空闲列表法。
考虑对象在虚拟机中是否安全
有可能造成线程不安全。一种是采用CAS+失败重试方法保证更新的原子性,另一种是将堆分成不同的空间上,每个线程在堆上预先分配一小块内存,称为本地线程缓冲(TLAB)。是否开启TLAB由-XX:+/-UseTLAB设定
将分配到的内存空间初始化为零值
保证类中变量可以不赋初值直接使用
对对象进行必要的设置,存放在对象的对象头
如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的GC分代信息等。
执行<init>方法,如构造方法和代码块。
将对象初始化
相关文章推荐
- 你不知道的Spring配置文件
- java的重写、重载、覆盖的差别
- JDK自带XML和java对象相互转换
- Java实现银行卡号的校验
- java volatile变量
- java抽象类
- Intellij IDEA 2015 导入MyEClipse工程
- Java中普通代码块,构造代码块,静态代码块区别及代码示例
- webService——wsdl文件生成java代码
- java swing 中的列表框JList如何在程序中动态的添加和删除元素
- 有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。
- JAVA_JDK新特性查看
- Spring 官方文档第十六章笔记(2):DispatcherServlet
- Java中的堆、栈和常量池
- Java集合类之ArrayList
- Nutch编译及集成eclipse+mysql开发环境的部署总结
- java反射的一些应用,望各大神给予指正
- spring mvc获取请求的参数的几种方式
- java学习第五天
- Java高级之1.5之后atomic包