前言:要想理解本文,必须先了解JVM的内存结构

一.创建对象的方式

  • new:最常见
  • 反射:Class.newInstance()
  • 使用clone()
  • 反序列化

二.创建对象的步骤(对象在JVM中怎么存储?)

  1. 判断对象的类是否加载,没加载进行加载
  2. 为对象分配内存空间
    • 内存规整:采用指针碰撞,指针就是空闲内存和使用过的内存的一个分界点,每次有新的对象,指针就向后移动相应大小的内存空间。(内存规整说明采用复制算法/标记压缩算法)
    • 内存不规则:空闲列表:JVM维护一个空闲列表,记录哪些内存块可用,有新的对象进入时,,从空闲链表中找到空闲的位置进行分配。
    • 说明:采用哪种方式完全取决于垃圾回收器是否使用内存整理的算法
  3. 处理并发的问题:使用TLAB或者CAS保证原子性
  4. 初始化分配到的空间:给所有的属性赋初始值
  5. 设置对象头
  6. 执行init方法:执行代码层面的构造器,完成初始化。

三.对象的内存布局

下图展示了一个对象分配的全过程:

四.对象的访问定位:

创建对象的目的就是为了使用它,那么JVM是如何通过栈帧中的对象引用访问到其内部的对象实例呢?有2种方式:

句柄访问

直接指针:Hotspot采用

寄语:行动是治愈恐惧的良药,而犹豫、拖延将不断滋养恐惧。

对象到底是怎么new出来的的更多相关文章

  1. 一个Java对象到底占用多大内存?

    最近在读<深入理解Java虚拟机>,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存? 在网上搜到了一篇博客讲的非常好 ...

  2. 一个Java对象到底占用多大内存

    在网上搜到了一篇博客讲的非常好,里面提供的这个类也非常实用: import java.lang.instrument.Instrumentation; import java.lang.reflect ...

  3. 一个Java对象到底占多大内存

    最近在读<深入理解Java虚拟机>,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存? 在网上搜到了一篇博客讲的非常好 ...

  4. 一个Java对象到底占多大内存?(转)

    最近在读<深入理解Java虚拟机>,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存? 在网上搜到了一篇博客讲的非常好 ...

  5. 【转】一个Java对象到底占多大内存?

    最近在读<深入理解Java虚拟机>,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存? 在网上搜到了一篇博客讲的非常好 ...

  6. 一个 Java 对象到底有多大?

    阅读本文大概需要 2.8 分钟. 出处:http://u6.gg/swLPg 编写 Java 代码的时候,大多数情况下,我们很少关注一个 Java 对象究竟有多大(占据多少内存),更多的是关注业务与逻 ...

  7. JQ对象到底是什么

    jQuery对象是什么,举个例子,$('#id') 返回的就是jQuery对象,这个东西是整个jQuery的核心所在,所以我先来分析它. var jQuery = function( selector ...

  8. ASP.NET Cookie对象到底是毛啊?(简单小例子)

    记得刚接触asp.net的时候,就被几个概念搞的头痛不已,比如Request,Response,Session和Cookie.然后还各种在搜索引擎搜,各种问同事的,但是结果就是自己还是很懵的节奏. 那 ...

  9. C#编译器对于dynamic对象到底做了什么

    private static void TestMethod() { //dynamic 仅仅是个占位符而已 dynamic p1 = , Y = }; //对dynamic对象p1的X属性访问通过C ...

  10. C++类和对象到底是什么意思?

    C++ 是一门面向对象的编程语言,理解 C++,首先要理解类(Class)和对象(Object)这两个概念. C++ 中的类(Class)可以看做C语言中结构体(Struct)的升级版.结构体是一种构 ...

随机推荐

  1. spring boot 打包war后 部署到外部 tomcat 的具体正确操作【包括修改端口 与 去除请求路径的工程名】

    1.前言 工程做好了,总不能放在idea运行吧?不然怎么把项目放到云服务器呢?[这一篇随笔不讲解发布的云服务器的操作,在其他随笔有详细记载.] 解决的方案是把springboot 工程 打包成war文 ...

  2. Vue系列教程(三)之vue-cli脚手架的使用

    一.Vue-cli的环境准备 目的:(1)快速管理依赖 (2)确定项目结构 1.安装node.js Node.js是一个可以让前端运行在服务器上的一个工. 下载:https://nodejs.org/ ...

  3. textarea换行符转换

    /** * @description textarea换行符转指定字符 * @param str:要放到textarea的字符串 * @param code:要转换成换行的字符,默认为',' */ e ...

  4. django框架--登录注册功能(ajax)

    注册 实现一个注册功能 编写 html 内容 input 标签 csrf_token ajax 路由 视图: 提供页面 负责处理业务,返回响应 接收到   post   请求传递的参数 写库 返回   ...

  5. PCx安装使用

    PCx安装使用 注意:不要到Mittleman的网页下给的那个网站去下载,版本太老,只能在REDHAT操作系统上编译,且不能运行 mkdir PCx cd PCx/ git clone https:/ ...

  6. HDC2021技术分论坛:组件通信、硬件池化,这些创新技术你get了吗?

    作者:ligang 华为分布式硬件技术专家,sunbinxin 华为应用框架技术专家 HarmonyOS是一款全新的分布式操作系统,为开发者提供了元能力框架.事件通知.分布式硬件等分布式技术,使能开发 ...

  7. 676. Implement Magic Dictionary

    Implement a magic directory with buildDict, and search methods. For the method buildDict, you'll be ...

  8. ant -design vue a-tree 树形控件

    话不多说,先上代码. <a-tree v-if="this.treeData && this.treeData.length > 0" ref=&quo ...

  9. 阿里巴巴基于应用和变更的交付模式|阿里巴巴DevOps实践指南

    编者按:本文源自阿里云云效团队出品的<阿里巴巴DevOps实践指南>,扫描上方二维码或前往:https://developer.aliyun.com/topic/devops,下载完整版电 ...

  10. db2服务器linux的cache过高原因

    在线上db2数据库服务器,使用的linux操作系统(RHEL,centos),当db2数据库运行一段时间之后,操作系统的物理内存就趋近于0,同时系统的cache暴增,但是use却不高,下面是正常使用 ...