java对象是如何创建的

当虚拟机遇到一条new指令以后,首先会去检测这个指令的参数能否在常量池中定位到一个类的符号引用,并检测这个类是否被加载、解析、初始化过,没有就先去加载类。

对象创建在堆划分空间可用指针碰撞(使用过的内存放一边未使用的放一边)和空闲列表,划分空间时可能会出现线程不安全的情况#,所以分配内存的时候采用  CAS(Compare and Swap)配上失败重试保证原子性或者采用TLAB(Thread local allocation buffer每个线程在堆中预先分配一块内存),哪个线程需要分配内存,就在该线程的TLAB上分配。

内存分配完后虚拟机需要将内存空间初始化,这样可保证对象被创建以后可以直接使用,比如 new Object() 可直接使用。这里的初始化是指字段置0,并不是赋值

接下来虚拟机会对对象的象头(Object Header)进行设置,比如是哪个类的实例,对象的哈希码,对象的gc分代年龄,如何找到类的元数据信息等。是否启用偏向锁来设置头信息

最后执行init方法,把对象按照程序员的意愿初始化赋值(将对象引用入栈,@暂不确定是init以后入栈还是对象头信息设置完后后入栈)

对象包含三块区域:1、对象头 2、实例数据3、对齐填充

对象头包含两部分信息,一部分是用于存储自身运行时的数据,数据长度可达32或64bit

另外一部分是存储类型指针,即对象指向它的类元数据的指针,虚拟机用它来确定这个对象是哪个类的实例(不是所有虚拟机实现都必须在对象上保留类型指针),如果对象是一个数组,对象头中还必须有一块用于记录数组长度的数据。因为虚拟机可以根据对象所包含的元数据(就是对象包含的所有数据)确定对象需要多大空间,但是无法通过数组的元数据确定数组大小。

实例数据部分是对象真正存储的有效信息,也就是代码中定义的各种类型字段的内容。包括父类继承的和定义的都要记录下来。

时间: 2024-12-23 04:46:42

java对象是如何创建的的相关文章

[Java][Android][Process] Process 创建+控制+分析 经验浅谈

不管是Android亦或者Java中或多或少须要调用底层的一些命令.运行一些參数: 此时我们须要用到Java的Process来创建一个子进程.之所以是子进程是由于此进程依赖于发起创建请求的进程,假设发起者被Kill那个子进程也将Kill. 对于Process相信使用过的朋友一定不会陌生,它具有例如以下特点: 1.创建简单 2.控制难 3.easy导致无法创建子进程 4.假设是多线程那么非常有可能造成内存溢出 以上现象假设你仅仅是偶尔使用一次,创建一个进程也许你什么都没有感觉到,可是假设你使用了多

Effective Java 读书笔记(2创建和销毁对象)

第一章是引言,所以这里不做笔记,总结一下书中第一章的主要内容是向我们解释了这本书所做的事情:指导Java程序员如何编写出清晰.正确.可用.健壮.灵活和可维护的程序. 2.1考虑用静态工厂方法代替构造器 静态工厂方法与构造器相比有四大优势: (1)静态工厂方法有名称,具有适当名称的静态工厂方法易于使用.易于阅读: (2)不必每次在调用它们的时候都创建一个新的对象: (3)可以返回原返回类型的任何子类型的对象: (4)在创建参数化类型实例的时候,它们使代码变得更加简洁. 同时静态工厂方法也有两大缺点

JAVA card 应用开发 创建第一个APPLET

本文讲述在Eclipse环境下,如何创建一个Java卡的项目,新建一个APPLET,运行在Java卡片上. 在建立项目前,必须安装好环境:先下载一个Eclipse,然后安装JCOP即可.(JCOP的下载,需要与NXP签订协议才能拿到安装文件,当然网上可能找到别的版本,这里不讨论).安装次序:安装好Eclipse,然后安装JCOP,然后导入JCOP的授权文件.也可以参考下面这篇文章: 环境搭建:http://blog.csdn.net/menghnhhuan/article/details/761

java用Thread方式创建多线程

进程:一个正在执行的程序,每一个进程都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元.线程:进程中一个独立的控制单元.线程控制着进程的执行.一个进程中至少有一个线程. java VM中至少有一个线程负责java程序的执行.而且这个线程运行的代码存在于main方法中.该线程为主线程. 扩展,jvm启动了两个线程,一个主线程,一个垃圾回收机制的线程. 1.怎样创建一个多线程?第一种方法:通过继承Thread类的方法 1.继承Thread类 2.重写Thread类的run()方法 目的:将自

Java 反射Array动态创建数组

Java 反射Array动态创建数组 @author ixenos 注:java.lang.reflect.Array 是个反射工具包,全是静态方法,创建数组以多维数组为基准,一维数组只是特殊实现 创建一个具有指定的组件类型和长度的新数组(一维数组) newInstance public static Object newInstance(Class<?> componentType, int length) throws NegativeArraySizeException 创建一个具有指定

JAVA 图形界面swing 创建按钮、文本域

package org.rui.swin; import java.awt.FlowLayout; import javax.swing.JButton; import javax.swing.JFrame; import org.rui.utils.SwingConsole; public class Button1 extends JFrame{ private JButton button1=new JButton("button1"), button2=new JButton(

java中内部类的创建四种情况,三种方式,及内部数据访问权限

内部类和外部类的关系,及内部静态类的数据访问权限,声明方式. 第一种,在外部类内部声明使用内部类,内部类的类型为static和非 static类型,内部类数据类型为private,protected,public 类型的访问权限.外部类为非静态声明和权限如下: package com; public class Test1 { //@author 张春蕾 private class Name{ private int i =1; public int s = 2; protected int m

Java调用AE实现创建泰森多边形(voronoi图)

在网上搜索 AE 创建泰森多边形,都是基于VB或者C#的, 鉴于C#和Java相近,就将C#的代码翻译成Java, 但修改后的程序运行无结果, 经多次尝试,设置了addFromFeatureClass方法的第三个参数,终于获得了泰森多边形. 现把代码共享,如下: public void CreatVoronoi(IFeatureClass pointFeaCls,IFeatureClass voronoiFeaCls,IPolygon clippingPolygon){ try { if (po

Java中通过类名创建一个类的实例

Java中通过类名创建类的实例,此类必须是默认的构造方法,不能自己写构造方法. 方法1: UserDao userDao=null; Properties prop=new Properties();    InputStream inStream=DaoFactory.class.getClassLoader().getResourceAsStream("daoconfig.properties");    prop.load(inStream);    String userDao