原标题:3分钟 快速理解JVM创建对象的步骤!

我们平时创建一个对象只需要new。然而我们知道对象的创建到底经历了哪些呢?实际上只不过仅仅的3步就完成了。先来看看完整的创建过程,再来一步一步的分析。

| 是什么

要创建对象肯定首先要知道是什么、有没有。所以首先就是找到对象的类信息。从上一篇文章中我们知道类信息都是放到方法区的。

从这里看出类信息放到方法区是很有必要的,因为每个线程每个方法都可能需要这些信息。

| 放哪里

都知道对象是放到Java堆中的,同时对象是随时都在创建的,当多个线程运行的时候就有可能把对象放到同一个地方,那么肯定就会有线程拿到不是他想要的对象。

这里有两种解决方案:1、把分配内存空间这个操作给同步,虚拟机采用的CAS失败重试机制保证操作的原子性。2、先为每个现在分配一点内存,叫本地线程分配缓冲(Thread Local Allocation Buffer,TLAB),当用完的时候分配新的的时候在加同步操作。虚拟机是否使用根据-XX:+/-UseTLAB参数设置。

虽然Java堆是线程共享的,但也有可能一些内存实际上是线程独享的。

| 初始化

现在对象的位置知道了,空间也分配了。但是里面还是空荡荡的一块。现在就要创造出内容来。

根据上图分三步:

1、 设置属性的零值

因为在TLAB模式下,初始化属性的零值已经设置过了,所以这里有可能不需要设置。只有设置了值,我们才能在调用的时候才能获取到正确的值。举例如下图:

打印出来分别是0、null、false。我们之所以能打印出来这些,就是因为这里的初始化。如果没有这一步有可能data1打印出来的就不是0。data2打印出来的就更加不知道是什么了。

2、 设置头信息

对象里面要存必要的东西,比如对象类型信息。如果是Java数组还要记录数组的长度。以及一些其他信息如下图:

3、 根据我们自己的意向再次进行配置

这一步就是我们平时的初始化了,比如new的时候调用的构造函数,去初始化设置一些值。

| 找到她

创建好了,那么我们平时是怎么找到的呢?

结合我上一篇文章,Java虚拟机栈来讲更加有连贯性。如下图:

访问方式一共分两种:

1、 通过句柄方式访问。在Java堆中维护一个句柄池。每个句柄包含一个对象实例数据指针和一个对象类型数据指针。然后在Java虚拟机栈的栈帧里面的变量表对对象的引用指向的是句柄。这样做的好处是在Java堆中进行了垃圾回收,对象的地址发生了改变的时候,只需要修改句柄的对象实例数据指针就行。

2、 直接引用:栈中的引用的是对象的实际地址。这样做的好处是访问更快。

| 总结

可以看到JVM创建一个对象经历了不少的流程。不过总结起来和我们平时做很多事情是一样。每个流程都合情合理,不多不少。

每一个步骤都有可能有问题,但同时也解决了这些问题。比如类信息为什么是放到方法区。分配内存对象是并发问题的处理。

流程的梳理和每个地方出现问题的解决方式都值得我们平时开发的时候的学习。

Java程序员日常学习笔记,如理解有误欢迎各位交流讨论!

责任编辑:

Java快速创建大量对象_3分钟 快速理解JVM创建对象的步骤!相关推荐

  1. 使用编辑工具快速创建实体对象的方法

    快速创建java类 (\w+)\s+(.+) /** $2 */\nprivate String $1; search Mode 为 Reqular expression 转载于:https://ww ...

  2. js获取对象数组中指定属性值对象_3分钟学会操作JavaScript内置对象,快来试试吧...

    1 - 内置对象 1.1 内置对象 JavaScript 中的对象分为3种:自定义对象 .内置对象. 浏览器对象. 前面两种对象是JS 基础 内容,属于 ECMAScript: 第三个浏览器对象属于 ...

  3. java动态创建代理对象

    代理模式在开发过程中有着众多好处,现在我先给大家首先介绍什么是代理模式,以及java的中代理模式的使用,最后再看代理模式的概念作用等自然就会明白了 1.动态创建代理对象 >>>> ...

  4. Android studio插件GsonFormat,返回json快速创建实体对象

    1. 下载安装GsonFormat插件 如果下载失败,请 1.https://plugins.jetbrains.com/plugin/7654-gsonformat 手动下载GsonFormat 2 ...

  5. java解析json数组对象_JAVA中快速解析JSON对象里包含的JSON数组

    例如现在有这样一个Json String Value =  {"data":[{"school_name":"西北农林科技大学"," ...

  6. 如何快速创建程序组_如何快速开发小程序

    随着小程序发展的越来越火,越来越多的企业.商家都开发了自己的小程序.在小程序开发的过程中,一部分客户会提出希望加快开发进度的要求.那么,如何快速开发小程序?下面不妨一起来了解一下. 选择成熟的小程序开 ...

  7. java的创建管理员对象_java--更改管理员密码,请列位帮忙看看有没有更好的实现方式...

    需求说明:输入旧的用户名和密码,如果正确,方有权限更新,从键盘获取新密码,进行更新 实现思路:1.创建管理员类的对象:2.利用while实现循环执行 import java.util.Scanner; ...

  8. [升级版][Java作业]创建PC对象展示cpu速度和硬盘容量

    //注意:本篇既包含了实现题目要求,但又运用了swing组件将显示内容做了升级,简单几个操作让你在同学间脱颖而出.但是基本逻辑代码还是一样的. 题目如图: 本题主要考察由UML图创建类及基本调用,让新 ...

  9. javaScript 对象添加属性和创建js对象的方式(以及理解:“无法给构造函数添加新的属性“)

    1.javaScript 对象想要添加属性,非常简单 (1)直接添加,使用语法:objectName.propertyName 添加属性. 举例: var person = new Object(); ...

最新文章

  1. HDU 2896 病毒侵袭 AC自己主动机题解
  2. multi-mono-sf:自监督多帧单目场景流估计
  3. 使用Kotlin打造Android路由框架-KRouter
  4. vasp安装包_【问题集锦】VASPamp;MedeA 第十一期
  5. 树莓派镜像源切换之旅.md
  6. ASP.NET2.0 XML系列(6): 使用XmlReaderSettings配置XmlReader的输出
  7. DRD:线程错误检测器
  8. PRML-系列一之1.5.5~1.5.6
  9. GOF23设计模式之单例模式
  10. 你已经是一个成熟的码农了,这些思维习惯你要有!
  11. Linux 部署 Nexus (下载、安装、使用)
  12. ios游戏开发 Sprite Kit教程:初学者 1
  13. gitl clone 拉去代码失败?
  14. flink不等于符号问题
  15. yolov5ds-yolov5做分割(尝试ing)
  16. 服务器主板信息花屏,清空BIOS设置,造成花屏问题的解决
  17. gcc: buildin函数: __builtin_unreachable __builtin_constant_p;__atomic_load_n
  18. 怎样优化cocos2d/x程序的内存使用和程序大小
  19. 帝国cms7.5漏洞复现
  20. cookie属性及有效期的设置

热门文章

  1. cannot find package “github.com/json-iterator/go“cannot find package “github.com/modern-go/reflect2“
  2. 最好用的修改docker镜像源的方式
  3. MLIR: 编译器基础架构重定义
  4. 机器学习PAL产品优势
  5. 适用于CUDA GPU的Numba例子
  6. 激光雷达Lidar与毫米波雷达Radar:自动驾驶的利弊
  7. 2021年大数据常用语言Scala(二十五):函数式编程 排序
  8. 2021年大数据Flink(四十二):​​​​​​​BroadcastState
  9. 2021年大数据Spark(四十九):Structured Streaming 整合 Kafka
  10. python3生成二维码中间带logo,有底图,可自定义文字