JAVA 对象分配过程

1. 在JAVA中,对象的分配一般使用new关键字。

  当虚拟机遇到new指令时,会先检查该指令所包含的参数在常量池中能否找到一个符号引用,并检查该符号引用所代表的类是否被加载、解析和初始化。

  如果没有,则会先执行类的加载过程。

2. 类加载完成后,会为该对象分配内存空间。一个对象需要多大的内存空间在类加载完成后就确定了。

 分配内存有两种方法,依据内存空间是否规整来确定。

 如果被内存空间是规整的,只要把空闲指针向空闲内存方向挪动即可,这种方法称为“指针碰撞”;

 如果内存空间不是规整的,需要有一个“空闲列表”用于记录哪些内存是可用的,并从可用内存中分配足够大小的内存出来,并修改“空闲列表”;

 在使用Serial、ParNew等算法时是用的指针碰撞;使用Mark-Sweep等算法时,采用空闲列表。

3. 在多线程环境下怎么保证分配内存的动作是线程安全的。

 一种方法是对分配内存的动作进行同步;

 另一种方法是使用“本地线程分配缓存(TLAB)”,每个线程会预先分配到一块内存,申请内存会在各自的TLAB上进行;只有当TLAB不够是,才需要同步分配新的TLAB;

4. 分配好内存后,虚拟机会将除对象头以外的空间初始化为0。这就是为什么JAVA代码中的全局变量可以不用初始化也可以使用的原因。

  此外,虚拟机还会对对象头进行必要的设置,比如对象所属的类,对象的哈希码,对象的GC分代年龄等信息。

5. 上述过程完成或,虚拟机认为一个对象已经创建完毕,但是从程序来看,对象还没有初始化,因此需要根据代码初始化各个变量。

 这一步完成后,一个可用的对象就创建好了。

时间: 2024-08-02 00:55:44

JAVA 对象分配过程的相关文章

Java对象分配内存时的内存图

摘自高琪老师的JAVA教程. Java对象分配内存时的内存图

java对象分配

1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用,这样就会对堆的所有区域进行扫描.而我们的很多对象都是朝生夕死的,如果分代的话,我们把新创建的对象放到某一地方,当GC的时候先把这块存“朝生夕死”对象的区域进行回收,这样就会腾出很大的空间出来. 2.年轻代中的GC     HotSpot JVM把年轻代分为了三部分:1个Eden

Java 对象创建过程

在某些项目中,会使用到静态块,构造器中初始化其他对象...深刻理解了java类初始化过程,这些将不在是问题. 那java对象的步骤是什么呢? 假设现在有People类,未显示继承任何其他类,初始化过程是这样的. 1 java 解释器必须查找类路径,以定位People.class文件.在首次创建对象时(构造器是静态方法),或people类的静态方法/静态域首次被访问时. 2 载入People.class,静态初始化的所有动作都会执行,且静态初始化只在Class对象首次加载的时候进行一次. 3 当使

Java对象创建过程补遗

一.static修饰的东东是属于这个类的,是所有的该类的实例共享的,因此它们的初始化先于实例对象的初始化. 二.Java中没有静态构造方法,但是有静态代码块.当类中同时存在静态代码块和静态成员变量声明语句时,它们谁先执行? 答:按照类中定义的从上到下顺序,谁在前面谁先执行. 三.当类中同时存在非静态代码块和非静态成员变量声明语句时,它们谁先执行? 答:按照类中定义的从上到下顺序,谁在前面谁先执行. 四.含有赋值的非静态成员变量声明语句,如 int v=4,其实这个语句的执行要分成两步进行.首先创

Java对象创建过程

假设有个名为Dog的类 1.当首次创建型为Dog的对象时(构造器可以看成静态方法),或者Dog类的静态方法/静态域首次被访问时,Java解释器必须查找类路径,以定位Dog.class文件. 2.然后载入Dog.class(这将创建一个Class对象),有关静态初始化的动作都会执行.因此,静态初始化只在Class对象首次加载的时候进行一次. 3.当你用new Dog()创建对象的时候,首先将在堆上为Dog对象分配足够的存储空间. 4.这块存储空间会被清零,这就自动地将Dog中的所有基本类型数据设置

什么是 Java 对象分配率

类似“不可持续的内存分配率”和“你需要维持低的内存分配率”这样的短语看起都像是属于 Java 冠军(Java Champions)的专有词汇.复杂.吓人.充满神秘色彩. 这些词语经常出现,但是如果你深入了解这些概念,它的神秘色彩就烟消云散了.这篇文章将试着揭开上面这些术语的神秘面纱. 什么是内存分配率?我们为什么要关心它? 内存分配率是指单位时间内分配内存的总数量,通常用 MB/sec 表示.不过,如果你乐意,也可以用 PB/year 来表示.这就是全部的内容——没那么神秘,仅仅是指 Java

java对象初始化过程

深入理解Java对象的创建过程:类的初始化与实例化

"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 深入理解Java对象的创建过程:类的初始化与实例化 - Rico's Blogs - 博客频道 - CSDN.NET Rico's Blogs 潜心修炼,成为一个更好的人. 目录视图 摘要视图 订阅 [活动]2017 CSDN博客专栏评选 &nbsp [5月书讯]流畅

Java 对象的创建过程

类的初始化与实例化一个 Java 对象的创建过程往往包括类的初始化 和 实例化 两个阶段.Java 规范规定一个对象在可以被使用之前必须要被正确地初始化.在类初始化过程中或初始化完毕后,根据具体情况才会去对类进行实例化.在实例化一个对象时,JVM 首先会检查相关类型是否已经加载并初始化,如果没有,则 JVM 立即进行加载并调用类构造器完成类的初始化.Java 对象的创建方式一个对象在可以被使用之前必须要被正确地实例化.在 Java 程序中,有多种方法可以创建对象,最直接的一种就是使用 new 关