创建对象的方式

简单来讲分为两种,一种是new方式创建出对象。

一种是通过指针的方式来创建对象。

详细点来说里面又有克隆和序列化和普通的new,还有反射。

public class Student implements Cloneable,Serializable{private int id;private String name;@Overrideprotected Object clone() throws CloneNotSupportedException {// TODO Auto-generated method stubreturn super.clone();}@Overridepublic String toString() {return "Student [id=" + id + ", name=" + name + "]";}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}
public static void main(String[] args) throws Exception {Student stu=new Student(); //直接newstu.setId(1);stu.setName("张三");Student stu2 = (Student) stu.clone(); //克隆File file = new File("student.out");  ObjectOutputStream oout = new ObjectOutputStream(new FileOutputStream(file));  oout.writeObject(stu2);  oout.close();  ObjectInputStream oin = new ObjectInputStream(new FileInputStream(file));  Object stu3= oin.readObject(); // 没有强制转换到Student类型  oin.close();  System.out.println(stu2==stu3);System.out.println(stu);System.out.println(stu2);System.out.println(stu3);}

最后打印结果为
false
Student [id=1, name=张三]
Student [id=1, name=张三]
Student [id=1, name=张三]

反射:

使用Class类的newInstance方法:我们也可以使用Class类的newInstance方法创建对象,这个newInstance方法调用无参的构造器创建对象,如:Student student2 = (Student)Class.forName("根路径.Student").newInstance(); 或者:Student stu = Student.class.newInstance();
使用Constructor类的newInstance方法:本方法和Class类的newInstance方法很像,java.lang.relect.Constructor类里也有一个newInstance方法可以创建对象。我们可以通过这个newInstance方法调用有参数的和私有的构造函数。如: Constructor<Student> constructor = Student.class.getInstance(); Student stu = constructor.newInstance(); 这两种newInstance的方法就是大家所说的反射,事实上Class的newInstance方法内部调用Constructor的newInstance方法。这也是众多框架Spring、Hibernate、Struts等使用后者的原因。

实现原理

new创建对象,在创建对象的时候会去检查这个指令的参数是否能在常量池中定位到一个类的符号引用
并且检查这个符号引用代表的类是否已经被加载,解析和初始化过。如果没有,那必须先执行相应的类加载过程。

在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成后便可以确定,为对象分配空间的任务等同于把一块确定大小内存从Java堆中划分出来。

内存算法

指针碰撞

假设Java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那所有分配内存就仅仅是把那个指针向空闲空间那边挪动一段与对象大小相等的距离,这种分配方式称为“指针碰撞”。

空闲列表

如果Java堆中的内存不是规整的,已使用的内存和空闲的内存相互交错,那就没有办法简单的进行指针碰撞了,虚拟机就必须维护一个列表,记录上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录。

内存空间初始化

内存分配完成后,虚拟机需要将分配到内存空间都初始化为零值(不包括对象头),接下来虚拟机要对对象进行必要的设置,例如这个对象是哪个类的实例,如何才能找到类的元数据信息,对象的哈希码,对象的GC分代年龄等信息。这些信息存放在对象的对象头(Object Header)之中。根据虚拟机的运行状态不同,如是否使用偏向锁等,对象头会有不同的设置方式。在上面的工作都完成之后,对象才刚刚创建,init方法还没有执行,执行完<init>方法,把对象按照程序员的意愿进行初始化。

Hotsopt对象探秘相关推荐

  1. Hotspot虚拟机对象探秘

    Hotspot虚拟机对象探秘 对象的创建 java 中提供的几种对象创建方式: 对象的创建主要流程 为对象分配内存 处理并发安全问题 对象的访问定位 句柄访问 直接指针 对象的创建 java 中提供的 ...

  2. JVM中的对象探秘(三)- 对象的实例数据与对齐填充

    引言 上一篇文章我们讲解了JVM对象内存布局的第一部分对象头,今天我们继续来讲讲剩下的两部分实例数据(Instance Data) .对齐填充(Padding). 实例数据与对齐填充 这两部分我们放在 ...

  3. 【深入Java虚拟机JVM 05】HotSpot对象探秘

    说明:文章所有内容均摘自<深入理解Java虚拟机:JVM高级特性与最佳实践(第二版)> 介绍完Java虚拟机的运行时数据区之后,我们大致知道了虚拟机内存的概况,读者了解了内存中放了些什么后 ...

  4. JVM hotspot虚拟机对象探秘

    为什么80%的码农都做不了架构师?>>>    本文全部内容均转述自<深入理解Java虚拟机 JVM高级特性与最佳实践(第二版)>2.3节 下载地址:http://pan ...

  5. java方法区对象类型_浅谈Java内存区域与对象创建过程

    一.java内存区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区域则 ...

  6. [转载] java对象在内存中的结构

    参考链接: 了解Java中的类和对象 今天看到一个不错的PPT:Build Memory-efficient Java Applications,开篇便提出了一个问题,在Hotspot JVM中,32 ...

  7. 【JVM】第二章 JVM类加载、JVM对象

    第二章 JVM类加载.JVM对象 文章目录 第二章 JVM类加载.JVM对象 一.JVM类加载 1.介绍 2.类加载器 3.类加载机制 4.类加载过程 二.JVM对象 1.对象的内存布局 2.对象的访 ...

  8. (六)JVM成神路之GC基础篇:对象存活判定算法、GC算法、STW、GC种类详解

    引言 经过前面五个章节的分析后,对于JVM的大部分子系统都已阐述完毕,在本文中则开始对JVM的GC子系统进行全面阐述,GC机制也是JVM的重中之重,调优.监控.面试都逃不开的JVM话题. 在前面分析J ...

  9. 【深入理解Java虚拟机学习笔记】第二章 Java 内存区域与内存溢出异常

    最近想好好复习一下java虚拟机,我想通过深读 [理解Java虚拟机 jvm 高级特性与最佳实践] (作者 周志明) 并且通过写一些博客总结来将该书读薄读透,这里文章内容仅仅是个人阅读后简短总结,加强 ...

最新文章

  1. 如何合并两个Docker 镜像
  2. 利用Excel VBA批量计算长时间序列植被物候动态阈值(逐像元)
  3. kaggle(01)-泰坦尼克号问题
  4. springBoot的模版引擎
  5. GLEW_ERROR_NO_GL_VERSION的解决方法
  6. 【kafka】kafka log 存储时间 小于 offset 存储时间 offset存在但是消费不到
  7. 欧式墙纸素材高清纹样图案,美观又大气
  8. ios整理(五)小应用-重力感应
  9. C语言根号作用,c语言开根号(开根号编程)
  10. 微型计算机的始祖:Altair 8800 | Linux 中国
  11. 深圳禾正医院自控系统案例|能迪科技canlead中央空调净化系统
  12. 运算放大器---输入偏置电流(IB)
  13. 微信小程序getUserProfile详解
  14. iOS定位从 “始终”定位,改变成“使用期间”定位
  15. 《云计算架构技术与实践》连载(2):1.2 云计算的发展趋势
  16. 【SCIR笔记】Transformer及其变种
  17. python递归函数例题_递归案例python
  18. Java实战之继承与多态
  19. java象棋实验报告_中国象棋java程序设计实验报告.doc
  20. IP网络主动测评系统——X-Vision

热门文章

  1. 基于51单片机的实时多任务操作系统(RTX51)使用教程
  2. 安卓zip解压软件_压缩软件哪家强?
  3. 解决 FFmpeg 执行报错:Too many packets buffered for output stream 0:1
  4. 软件公司/个人道德标准
  5. SQL语句 -非空约束 - 唯一约束 - 主键约束 - 默认约束 -外键约束
  6. 超好用的Mac软件下载网站
  7. linux 提取文件出错,pacman 错误:无法从 ××××获取文件 'core.db'
  8. 5.Metasploit攻击载荷深入理解
  9. HTML第四章 input新表单元素(10个,附带详细代码)
  10. python画微信表情_python画微信表情符的实例代码