本文涉及:Java中的new命令之后发生的事

类加载检查

java虚拟机在遇到一条 new 指令时,首先会检查是否能在常量池中定位到这个类的符号引用,并且是否已被加载过、解析和初始化过。如果没有,那必须先执行类加载过程

类加载的相关知识可参考:JVM的类加载机制

分配内存

在类加载检查通过后,接下来虚拟机将为新生对象分配内存。

分配方式有 指针碰撞 和 空闲列表 两种

  • 指针碰撞:Java堆中的内存是规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,分配内存也就是把指针向空闲空间那边移动一段与内存大小相等的距离。

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

Java 堆内存是否规整,取决于 GC 的垃圾回收算法,在JVM中标记压缩、复制算法的内存是规整的、而标记清除则是不规整的

垃圾回收算法相关知识可参考:JVM垃圾收集算法详解

内存分配并发问题
  • CAS操作:CAS是属于原子性操作,更多关于此内容可参考此内容:Java原子类操作原理剖析

  • TLAB: 为每一个线程预先在Eden区分配一块儿内存,JVM在给线程中的对象分配内存时,首先在TLAB分配,当对象大于TLAB中的剩余内存或TLAB的内存已用尽时,再采用上述的CAS进行内存分配

内存空间初始化

内存分配完成后,虚拟机需要将分配到的内存空间都初始化为零值。这一步操作保证了对象的实例字段在 Java 代码中可以不赋初始值就直接使用,程序能访问到这些字段的数据类型所对应的零值。例如:

1
2
3
4
5
int a=1
long b=2
实际上在这时被赋值为了
a=0
b=0L
设置对象头

内存空间初始化完成之后,虚拟机要在对象头中保存以下必要的信息:

  • 这个对象是那个类的实例

  • 如何才能找到类的元数据信息

  • 对象的哈希码

  • 对象的 GC 分代年龄

  • 等等

执行构造方法

这里才是我们最熟悉的地方

Java虚拟机是怎么new的对象?的更多相关文章

  1. Java虚拟机:如何判定哪些对象可回收?

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 在堆内存中存放着Java程序中几乎所有的对象实例,堆内存的容量是有限的,Java虚拟机会对堆内存进行管理,回收已经"死去&quo ...

  2. 了解java虚拟机—在TALB上分配对象(10)

    由于对象一般会分配在堆上,而堆是全局共享的.因此在同一时间,可能有多个线程在堆上申请空间.每次对象分内都必须要进行同步,因此TLAB这种线程专属的区域来避免多线程冲突.TLAB本身占用了eden区的空 ...

  3. Java虚拟机 - 内存模型

    本文主要介绍Java虚拟机的内存分布以及对象的创建过程. 一.Java虚拟机的内存分布 文章开始前读者需要了解Java虚拟机的运行时数据区是怎样划分的.如下图所示: 1.程序计数器(Program C ...

  4. [转]JAVA虚拟机的生命周期

    JAVA虚拟机体系结构 JAVA虚拟机的生命周期 一个运行时的Java虚拟机实例的天职是:负责运行一个java程序.当启动一个Java程序时,一个虚拟机实例也就诞生了.当该程序关闭退出,这个虚拟机实例 ...

  5. 《深入Java虚拟机学习笔记》- 第9章 垃圾收集

    一.Java内存组成 组成图 堆(Heap) 运行时数据区域,所有类实例和数组的内存均从此处分配.Java虚拟机启动时创建.对象的堆内存由称为垃圾回收器的自动内存管理系统回收. 组成 组成 详解 Yo ...

  6. Java虚拟机体系结构

    转自:http://www.cnblogs.com/java-my-life/archive/2012/08/01/2615221.html JAVA虚拟机的生命周期 一个运行时的Java虚拟机实例的 ...

  7. 读《深入理解Java虚拟机》

    Java虚拟机运行时数据区 对象的创建 Java创建对象,在语言层面上使用new关键字.虚拟机遇到new关键字时,会检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的 ...

  8. JAVA虚拟机体系结构JAVA虚拟机的生命周期

    一个运行时的Java虚拟机实例的天职是:负责运行一个java程序.当启动一个Java程序时,一个虚拟机实例也就诞生了.当该程序关闭退出,这个虚拟机实例也就随之消亡.如果同一台计算机上同时运行三个Jav ...

  9. JAVA虚拟机的生命周期

    一个运行时的Java虚拟机实例的天职是:负责运行一个java程序.当启动一个Java程序时,一个虚拟机实例也就诞生了.当该程序关闭退出,这个虚拟机实例也就随之消亡.如果同一台计算机上同时运行三个Jav ...

随机推荐

  1. sublime text3中Package Control的安装

    手动安装Package Control,亲测有效成功 1.点击https://github.com/wbond/package_control去github下载Package Control安装包下载 ...

  2. LeetCode 568. Maximum Vacation Days

    原题链接在这里:https://leetcode.com/problems/maximum-vacation-days/ 题目: LeetCode wants to give one of its b ...

  3. 图、流程图、ER图怎么画及常见画图工具(流程图文章汇总)

    流程图基本符号 首先要记住图中1.2.3.4.6这几种符号. 图片摘自网络 流程图基本概念及入门 简易流程图 流程图简介(基本符号与绘制工具) 你可能学了假流程图,三步教会你绘制大厂流程图 使用流程图 ...

  4. barbor部署

    harbor 部署介绍: 1.版本信息 系统 :Centos 7.5 版本: harbor-offline-installer-v1.8.1 docker :docker-ce-18.06.2.ce- ...

  5. Kafka Offset Monitor页面显示空白

    下载包:https://github.com/Morningstar/kafka-offset-monitor.git 解决:jar包内\KafkaOffsetMonitor-assembly-0.2 ...

  6. linux的arp表满导致同网段无法ping通

    由于历史原因,有一个网段子网设置非常大10.0.0.0/21,8个C地址段为一个子网. linux内核默认arp表大小为1024,导致一台监控机器arp表溢出,同时导致日志输出速率超出限制,无法输出日 ...

  7. jiagu-工具使用

    比较好的一套处理工具吧,感谢作者,原文地址:https://github.com/ownthink/Jiagu 练习一下使用 """ Funciton: jiagu测试 ...

  8. cad.net 在位编辑的原理猜测及找到在位编辑状态的图元

    在位编辑的时候会产生一个名为 0-RefEdit0 的图层,原因不明.... 在位编辑的本质是一个长事务,长事务是使用编辑库的对象替换源对象,相当于剪辑.不理解没关系,请看下面的聊天记录.... [贵 ...

  9. 基于ELK 7.50搭建elastalert 监控报警和权限控制

    ELK+监控报警全步骤 需求: 公司要求对出在windows服务器上的日志进行日志分析并根据关键字进行报警,并配置kibana权限控制.下面为详细步骤 环境: centos 7.6 elk版本7.50 ...

  10. Jenkins+Docker+Git+Registry

    从0到1体验Jenkins+Docker+Git+Registry实现CI自动化发布   笔者:@拿着保温瓶的年轻人 目录: 一.前言 二.发布流程 三.环境准备 四.部署思路梳理 五.三台机器上操作 ...