在代码层面,我们通过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. Vue中如何使用less

    最近发现好多小伙伴在面试的过程中会问到vue如何使用less和scss,所以我绝对更新.复习一下less:废话不多说直接进主题: 依赖下载 1.首先使用npm下载依赖: npm install --s ...

  2. MD5字符串加密

    MD5字符串加密 Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.该算法的文件号为RFC 132 ...

  3. 一次写文,多平台直接粘贴&打造最流畅的写作流程

    文字爱好者的痛点 这一段可以跳过,解决办法在后面.因为大家既然痛过,也就懂了. 对于很多文字爱好者来说,都希望写一篇文章后,可以实现多平台发布. 国内的很多平台都开始支持 Markdown,除了微信公 ...

  4. 关于Oracle12c中无scott用户的问题

    我目前预习是通过视频,学到此处视频里的老师要登录scott用户,而我无法登陆,显示用户不存在,虽然在Oracle文件中也可以找到scott.sql文件,但经过网上教程创建用户后我觉得很麻烦而且没有成功 ...

  5. 4、链栈的实现(java代码)

    1.链节点 public class Node<T> { public T data; public Node next; } 2.实现代码 public class Stack<T ...

  6. centos7上部署dubbo管理控制台dubbo-admin

    centos7上部署dubbo管理控制台dubbo-admin 1 准备工作 服务器:系统centos7, 内存4G, 存储60G, ip 192.168.159.128 软件环境: 安装有jdk1. ...

  7. DBCP

    DBCP(DataBase Connection Pool)数据库连接池,由Apache公司开发.连接池的运用避免了反复建立连接造成的资源浪费,预先建立一些连接放在数据库连接池中,需要时取出,不需要时 ...

  8. AD 域服务简介(二)- Java 获取 AD 域用户

    博客地址:http://www.moonxy.com 关于AD 域服务器搭建及其使用,请参阅:AD 域服务简介(一) - 基于 LDAP 的 AD 域服务器搭建及其使用 一.前言 先简单简单回顾上一篇 ...

  9. DirectX12 3D 游戏开发与实战第二章内容

    矩阵代数 学习目标 理解矩阵及其相关运算的定义 探究为何能把向量和矩阵的乘法视为一种线性组合 学习单位矩阵.转置矩阵.行列式以及矩阵的逆等概念 逐步熟悉DirectXMath库中提供的关于矩阵计算的类 ...

  10. Day20 磁盘管理2之RAID卡

    1.磁盘的基本分区Gdisk 前面我们已经了解到fdisk分区,但fdisk不支持给高于2TB的磁盘进行分区.如果有单块盘高于2TB,建议使用Gdisk进行分区. 1.使用gdisk进行磁盘分区 1. ...