在代码层面,我们通过new关键字创建一个对象:

Object obj=new Object();

而虚拟机中,创建一个对象,则经过了许多环节,JVM的内存结构可以通过另一篇文章了解:一个“Hello World”理解JVM运行时数据区 ,本文主要基于JVM的内存结构,聊聊对象在JVM中是怎么创建的:

  1. 虚拟机遇到new指令,首先检查new的参数是否能在方法区中的常量池中定位到一个类的符号引用,并且检查这个类是否已被加载、解析和初始化过,如果没有,则先执行类加载机制;(先check是否需要load class,确保类已加载)
  2. 接着,虚拟机将为对象在堆(Java Heap)中分配一块内存,对象所需内存的大小在类加载(Class Load)完成后已经可以确定。分配的方式主要有2种:指针碰撞(Bump the Pointer)和空闲列表(Free List)
  3. 分配完内存,虚拟机会对这些空间初始化为零值,这步操作保证了对象的实例字段在Java代码中可以不赋初始值就直接使用。
  4. 接着初始化对象头;对象头的信息包括:类的元数据信息、哈希码、GC分代年龄、是否启用偏向锁等
  5. 调用<init>方法

关键字词典:

指针碰撞:假设Java堆中的内存是规整的,所有已分配的内存都在一边,空闲的内存在另一边,指针的位置在两者中间;当需要分配内存时,只需要将指针向空闲内存区域移动与对象大小相同的距离,这种分配方式叫做“指针碰撞”;Serial、ParNew等带Campact过程的收集器采用的就是指针碰撞;

空闲列表:假设Java堆中的内存是不规整的,这些空闲的内存由一个表在维护,当需要分配内存给一个对象时,就会在这张表中查找一个足够的空闲空间出来分配给该对象,并更新记录。基于Mark-Sweep的CMS收集器就是使用空闲列表;

TLAB:内存的分配涉及了并发时线程安全的问题,因此每个线程在Java堆中会预先分配一小块内存作为该线程的“本地缓冲区”(Thread Local Allocation Buffer),那个线程需要分配内存直接在该线程的TLAB上分配,只有TLAB用完需要分配新的TLAB时,才需要同步锁定内存。是否启用TLAB,可以通过-XX:+/-UseTLAB参数设定;第2、第3步都是在TLAB内完成。

Java对象是怎么创建的(通过对象的创建,了解JVM内存结构)的更多相关文章

  1. Java常量,变量,对象(字面量)在JVM内存中的存储位置

    Java常量,变量,对象(字面量)在JVM内存中的存储位置 2019-02-26 18:13:09 HD243608836 阅读数 540  收藏 更多 分类专栏: JAVA jvm   苦苦研究了快 ...

  2. 管中窥豹——从对象的生命周期梳理JVM内存结构、GC调优、类加载、AOP编程及性能监控

    如题,本文的宗旨既是透过对象的生命周期,来梳理JVM内存结构及GC相关知识,并辅以AOP及双亲委派机制原理,学习不仅仅是海绵式的吸收学习,还需要自己去分析why,加深对技术的理解和认知,祝大家早日走上 ...

  3. java的线程安全、单例模式、JVM内存结构等知识学习和整理

    知其然,不知其所以然 !在技术的海洋里,前路漫漫,我一直在迷失着自我. 欢迎访问我的csdn博客,我们一同成长! "不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!" 博 ...

  4. jvm内存结构及对象漫谈(较全)

    最近想整理一下GC相关的知识和经验,在整理之前先整理一下jvm的内存结构,后续会持续更新. jvm内存结构重要由两部分组成:线程共享区域与线程私有区域,如下图所示: 其中方法区和堆为线程共享区域,栈与 ...

  5. 【JVM】JVM内存结构 VS Java内存模型 VS Java对象模型

    原文:JVM内存结构 VS Java内存模型 VS Java对象模型 Java作为一种面向对象的,跨平台语言,其对象.内存等一直是比较难的知识点.而且很多概念的名称看起来又那么相似,很多人会傻傻分不清 ...

  6. 【转】JVM内存结构 VS Java内存模型 VS Java对象模型

    JVM内存结构 我们都知道,Java代码是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途. 其中有些区域随着虚拟机进程的启动而 ...

  7. 简单说说 Java 的 JVM 内存结构

    问:简单说说 Java 的 JVM 内存结构分为哪几个部分? 答:JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分,分别解释如下.虚拟机栈:线程私有的,每个方法在执行时会创建一个 ...

  8. Java虚拟机(一):JVM内存结构

    所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能问题,那么这些问 ...

  9. 【Java】JMM内存模型和JVM内存结构

    JMM内存模型和JVM内存结构 JAVA内存模型(Java Memory Model) Java内存模型,一般指的是JDK 5 开始使用的新的内存模型,主要由JSR-133: JavaTM Memor ...

  10. Java 内存模型和 JVM 内存结构真不是一回事

    这两个概念估计有不少人会混淆,它们都可以说是 JVM 规范的一部分,但真不是一回事!它们描述和解决的是不同问题,简单来说, Java 内存模型,描述的是多线程允许的行为 JVM 内存结构,描述的是线程 ...

随机推荐

  1. MYSQL之B+TREE索引原理

    1.什么是索引? 索引:加速查询的数据结构. 2.索引常见数据结构 顺序查找: 最基本的查询算法-复杂度O(n),大数据量此算法效率糟糕. 二叉树查找:(binary tree search): O( ...

  2. window下载安装maven

    Maven官网下载地址:https://maven.apache.org/download.cgi,这里我们下载zip包即可  解压到安装目录下  新建环境变量MAVEN_HOME,复制Maven安装 ...

  3. SqlServer DbHelper

    /// <summary> /// 数据库通用操作类 /// </summary> public abstract class DbHelper { #region " ...

  4. 谈谈你对HTML语义化的理解。

    1.什么是HTML语义化? 基本上都是围绕着几个主要的标签,像标题(h1-h6),列表(li),强调(strong em)等. 根据内容的语义化(内容结构化),选择合适的标签(代码语义化),便于开发者 ...

  5. android 解决 多品牌手机拍照问题,尤其是小米手机

    先上个图吧 .点击头像弹出下面对话框,然后直接上代码. 头像是自定义控件实现的圆形头像,当然就目前而言 想要实现 圆形头像的资料太多了,随便找个就行 <com.kuibu.jucai.widge ...

  6. response向客户端写入数据

    1.写入文字: protected void doGet(HttpServletRequest request, HttpServletResponse response) throws Servle ...

  7. IBM DB2 SQL error code list

    SQL return codes that are preceded by a minus sign (-) indicate that the SQL statement execution was ...

  8. python语言程序设计部分习题

    第二章 python程序实例解析 程序练习题 2.1   实例1的修改,采用eval(input(<提示内容>))替换现有输入部分,并使输出的温度值为整数. vv 2.2 汇率兑换程序.按 ...

  9. Docker在IDEA中的使用以及如何部署到服务器

    IDEA中实现一键部署到服务器 点击运行自动部署到服务器: 服务器上安装docker 1,添加yum源 # yum install epel-release –y# yum clean all# yu ...

  10. linux常见报错

    零.目录 一. 文件和目录类 File exist 文件已经存在 No such file or directory 没有这个文件或目录(这个东西不存在) command not found 命令找不 ...