`

Java虚拟机是怎么new的对象?

    博客分类:
  • JVM
阅读更多

本文涉及: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 分代年龄

  • 等等

执行构造方法

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

推荐阅读

  1. SpringCloud学习系列汇总
  2. 为什么一线大厂面试必问redis,有啥好问的?
  3. 多线程面试必备基础知识汇总
  4. Java集合源码分析汇总-JDK1.8
  5. Linux常用命令速查-汇总篇

博客所有文章首发于公众号《Java学习录》转载请保留
扫码关注公众号即可领取2000GJava学习资源

1

0
0
分享到:
评论

相关推荐

    java虚拟机(jvm)介绍以及相关参数设置与调优

    在本文中,我们将深入探讨Java虚拟机的体系结构、垃圾回收机制、Java对象的生命周期和分代,以及相关的参数设置与调优。 Java虚拟机体系结构 Java虚拟机由三个主要组件组成:类加载器、运行时数据区和执行引擎。类...

    Java虚拟机内存管理总结

    Java虚拟机(JVM)中的内存管理是指Java语言中对象的分配和释放问题。Java中的内存管理可以分为两部分:对象的分配和释放。 对象的分配是由程序完成的,程序员需要通过关键字new为每个对象申请内存空间(基本类型...

    java虚拟机1.6版本

    Java虚拟机(JVM)是Java编程语言的核心组成部分,它为Java程序提供了运行环境。Java虚拟机1.6版本,也被称为JDK 1.6,是Sun Microsystems(后被Oracle收购)在2009年发布的一个重要版本。这个版本以安全性和稳定性...

    深入理解Java 虚拟机内存模型.rar

    Java虚拟机(JVM)内存模型是Java编程语言的核心组成部分,它定义了程序运行时的数据区域和内存管理方式。深入理解这一模型对于优化Java应用程序性能、避免内存泄漏以及理解线程安全至关重要。以下是对Java虚拟机...

    Java虚拟机面向对象原理及应用

    ### Java虚拟机面向对象原理及应用 #### 一、引言 随着计算机技术的发展,Java作为一种跨平台、安全可靠的编程语言,在软件开发领域占据了一席之地。Java的强大之处在于其面向对象的特性,这一特性使得Java能够更...

    java虚拟机JVM详解ppt

    Java堆是Java虚拟机所管理的最大内存区域,也是对象实例和数组的存储空间。每个Java应用启动时都会创建一个Java堆,它的大小可以在启动时通过参数设置。 ##### 4.3 Java虚拟机栈(Java Virtual Machine Stack) Java...

    Java虚拟机规范(Java SE 7)(中英文版)

    5. 文件系统API:NIO.2(New IO 2.0)在Java SE 7中引入,提供了更加面向对象的文件系统操作,支持异步I/O和文件属性查询。 6. 编程语言特性:Java SE 7引入了钻石操作符()简化泛型实例化,`try-with-resources`...

    Java虚拟机class文件原理

    Java虚拟机(JVM)的Class文件原理是Java程序运行的基础。Java中的所有类都必须先被装载到JVM中才能被执行,这个过程由JVM内的类装载器(ClassLoader)来完成。类装载器的工作是将类文件从硬盘读取到内存中,使得JVM...

    java jdk6.0源码+深入java虚拟机第二版

    Java JDK 6.0源码分析与《深入Java虚拟机》第二版详解 Java JDK(Java Development Kit)是Java编程语言的核心开发工具包,包含了Java运行环境、编译器、调试器和其他工具。JDK 6.0是Oracle公司发布的一个重要版本...

    java中的栈(深层了解java虚拟机对对象的内存分布)

    ### 深层解析Java虚拟机中的栈与堆:对象的内存分布 #### 核心概念:栈与堆的本质及作用 在Java编程语言中,理解栈(stack)和堆(heap)的概念及其工作原理对于深入掌握Java虚拟机(JVM)如何管理内存至关重要。栈和堆...

    Java虚拟机----类的加载过程.docx

    Java虚拟机(JVM)的类加载过程是Java程序运行的基础,它涉及到类加载器、类的生命周期和一系列复杂的步骤。在这个过程中,类加载器主要任务是根据类的全限定名加载二进制字节流并转化为`java.lang.Class`对象。整个...

    学习笔记之java虚拟机

    ### 学习笔记之Java虚拟机详解 #### 运行时数据区域概览 Java虚拟机(JVM)运行时数据区域主要包括以下几部分:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区以及运行时常量池。 1. **程序计数器**: -...

    java虚拟机规范SE7

    Java虚拟机(JVM)是Java编程语言的核心组成部分,它为Java程序提供了运行环境。《Java虚拟机规范SE7》是一本深入解析JVM工作原理和技术细节的重要书籍,旨在帮助开发者理解和优化Java程序的性能。这本书包含了Java ...

    Java虚拟机JVM面试题目

    "Java虚拟机JVM面试题目" Java虚拟机(JVM)是Java程序的运行环境,它负责编译、加载、执行Java字节码,并提供了垃圾回收、内存管理、安全机制等功能。下面是JVM面试题目相关的知识点: 一、JVM架构 JVM包含两个...

    Java虚拟机规范(Java_SE_7)

    Java虚拟机规范(Java SE 7)是Java开发的关键组成部分,它定义了Java程序如何在各种平台上运行的规范。这份规范详细阐述了Java虚拟机(JVM)的内部工作原理,包括类加载、字节码执行、内存模型、垃圾收集以及多线程...

    JAVA虚拟机内存分配机制

    JAVA虚拟机内存分配机制是Java程序执行过程中内存管理的核心部分,它涉及到程序的性能和效率。Java虚拟机(JVM)内存主要分为两大部分:栈内存和堆内存。 栈内存主要存储程序运行过程中的局部变量,包括基本类型...

    JAVA-虚拟机JDK1.5

    Java虚拟机(JVM)是Java语言的核心组成部分,它是Java程序得以运行的平台。JDK(Java Development Kit)则是开发和运行Java应用程序的完整工具集,包含了JVM、Java编译器、调试器、文档和其他必要的工具。在JDK1.5...

    Java虚拟机讲解笔记.docx

    ### Java虚拟机(JVM)详解 #### 一、Java虚拟机概述与基本概念 Java虚拟机(JVM)是运行Java字节码的虚拟环境,它位于操作系统之上,硬件之下,提供了一层软件抽象,使得Java程序可以在多种平台上运行而无需重新...

Global site tag (gtag.js) - Google Analytics