精华内容
下载资源
问答
  • java对象创建过程

    2018-11-22 21:31:38
    java对象创建过程 我们作为程序员觉得java创建对象比较简单,只需要new一下就ok,然后用这个对象来操作,不用管垃圾回收等工作。 其实我们用的东西越方便,底层实现的东西就会越多。这就好比开发网站,我们不用...

                                                java对象创建过程

    我们作为程序员觉得java创建对象比较简单,只需要new一下就ok,然后用这个对象来操作,不用管垃圾回收等工作。

    其实我们用的东西越方便,底层实现的东西就会越多。这就好比开发网站,我们不用框架,纯手写,自己导入java包,

    自己写servlet。自己新建bean对象很麻烦。这时候框架出现了。maven帮助我们管理jar包。ssm框架帮我们简化servlet

    用controller取而代之。通过注解帮助我们新建对象等。但是我们有了框架之后是不是感觉运行的时候变慢了,就比如

    tomcat的启动速度。java也是如此,帮助我们实现对象创建,垃圾回收等工作。还提供给了我们现成的函数来用,所以

    java的速度相比于c语言,c++等运行上还是有一定的差异。闲话扯到这里。

    到底java对象是怎么分配到内存并且被回收的呢?我们来了解下。

    1:当虚拟机碰见new关键字时,会先去常量池查看是否能定位new的这条指令的符号引用。比如Test a=new Test();

    会先去看看能否在常量池中找到符号引用,这个符号引用记录了这个类的加载,解析,初始化。如果没有,就会先

    执行类的加载过程。

    2:类的加载检查确定后,会对新生成的对象分配内存。分配的大小是在类加载的时候就确定好的。为什么对象的大

    小会被确定呢?加入我们的类有int,long,integer,string内存。int,long类型是有上限的,jvm直接给你分配那么

    大的内存,而integer又可以拆箱为int,大小也是有上限的。string类型是无限制的,但是string储存的是string的地

    址。大小确定之后,这时候有两种为对象分配内存的方式:

    指针碰撞:有一个指针作为分界点,用过的内存在一边,没用过的内存在另一边。当需要分配内存的时候,需要

    移动指针到固定大小的距离即可。这种方式分配内存的方式是线程不安全的。比如线程1的对象a需要分配内存,

    线程2的对象b也用到这个指针,这时候就会出错。一种方案是对分配对象内存就行同步处理,虚拟机采用了CAS

    和失败重试的方式保证了分配的原子性。另一种是对每个线程都有一个独立的堆内存(TLAB)上篇博客有介绍。

    空闲列表:如果已使用的内存和未使用的内存交错着,就无法简单的通过移动指针来分配内存,这时候虚拟机会

    有一个列表,记录哪些内存是可用的。然后在列表中划分给实例来使用。当对象实例消亡之后就会收回内存,重新

    更新这个列表。

    具体使用哪种分配方式由堆的内存是否规整决定的,而内存是否规整又是否gc回收的算法是否有压缩整理决定的。

    有压缩整理的算法有Seria,ParNew等算法。

    3:jvm完成上述步骤之后会对对象进行一些必要的设置,这个对象是那个类的实例,如何找到类的元数据信息,

    对象的哈希码等都存在对象的信息头中。

    4:执行<init>方法,对对象进行一定的初始化过程。使这个对象成为能够被我们所用的对象。

    展开全文
  • Java对象创建过程

    2020-05-21 21:21:02
    对象创建过程 以前只知道当new一个对象时,会自动调用该对象的构造方法来初始化对象,但是对于类成员变量的初始化,以及初始化与构造方法调用的先后关系都不清楚,在阅读完本章以后对一个对象的整个创建过程有了更...

    对象的创建过程

    以前只知道当new一个对象时,会自动调用该对象的构造方法来初始化对象,但是对于类成员变量的初始化,以及初始化与构造方法调用的先后关系都不清楚,在阅读完本章以后对一个对象的整个创建过程有了更清晰的认知。
    总结一下对象的创建过程,假设有一个名为dog的类:
    1、虽然没有关键字声明,但构造方法也算是一个静态方法,因此当首次new一个dog类的对象时,或调用了dog类的静态方法,或访问了静态成员变量,Java解释器都会查找类的路径,以定位Dog.class文件。
    2、然后载入Dog.class,有关静态初始化的所有动作都会执行。因此静态初始化会在Class对象加载的时候进行一次,并且只进行这一次。
    3、当用new Dog()创建对象时,会在堆上为Dog对象分配足够的存储空间,这块空间会被清零,自动将Dog对象中的基本类型数据设置成默认值,引用设置成null。
    4、再执行非静态成员变量的初始化动作。
    5、最后执行构造方法。
    综上类成员变量的初始化发生在构造方法之前,静态的类成员变量的初始化又在非静态的类成员变量的初始化之前。

    class Window {
        Window(int marker) {
            System.out.println("Window(" + marker + ")");
        }
    }
    
    class House {
        Window w1 = new Window(1);
        House() {
            System.out.println("House()");
            w3 = new Window(33);
        }
        Window w2 = new Window(2);
        void f() { System.out.println("f()"); }
        Window w3 = new Window(3);
        static Window w4 = new Window(4);
    }
    
    public class Initialization {
        public static void main(String[] args) {
            House h = new House();
            h.f();
        }
    }
    /*output
    Window(4)
    Window(1)
    Window(2)
    Window(3)
    House()
    Window(33)
    f()
    */
    

    当代码执行到new House(),会先加载House.class,然后初始化成员变量,在4个成员变量中由于w4是静态的因此先被初始化,然后按顺序初始化w1、w2、w3,成员变量初始化完成后再执行构造方法,w3这个引用又指向了新的对象,所以第一次指向的对象会被丢弃,并作为垃圾回收。

    展开全文
  • java 对象创建过程

    2021-05-17 09:27:37
    一个对象创建过程包含两个过程:初始化<clinit>和实例化<init> 我们在使用一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类构造器完成类的初始化。 在...

    一、基本知识

    一个对象的创建过程包含两个过程:初始化<clinit>和实例化<init>

    我们在使用一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类构造器完成类的初始化。

    在类初始化过程中或初始化完毕后,根据具体情况才会去对类进行实例化。

    实例化时候,java虚拟机就会为其分配内存来存放自己及其从父类继承过来的实例变量。在为这些实例变量分配内存的同时,这些实例变量先会被赋予默认值(零值)。在内存分配完成之后,Java虚拟机才会对新创建的对象赋予我们程序员给定的值。

    小结:创建一个对象包含下面两个过程:

    1、类构造器完成类初始化(分配内存、赋予默认值、静态属性赋值、执行静态代码块)

    2、类实例化(根据指定的构造方法赋予给定值)

     

     

     

    https://baijiahao.baidu.com/s?id=1637836912223474691&wfr=spider&for=pc

    展开全文
  • Java 对象创建过程

    2019-09-04 10:10:40
    对象创建 在语言层面,创建一个对象通常仅一个new关键字就可以解决了,但是在虚拟机中,对象的创建要经过一个复杂的过程。 方法区中的常量池 当虚拟机遇到一个new关键字时,首先去方法区中的常量池中找有没有这个...

    对象创建

    在语言层面,创建一个对象通常仅一个new关键字就可以解决了,但是在虚拟机中,对象的创建要经过一个复杂的过程。

    方法区中的常量池

    当虚拟机遇到一个new关键字时,首先去方法区中的常量池中找有没有这个类的符号引用,并检查这个符号代表的类是否已经被加载、解析和初始化过,如果没有先执行类的加载过程。

    堆内存

    类加载完成后,接下来在虚拟机中的堆上划分出一块内存,存储类的对象(大小在类加载完成后,根据其内部的变量类型与引用就可以确定类需要的空间大小)。由于GC的机制不同,所以在分配时可能存在两种机制。

    空闲列表法

    如果垃圾回收机制为标记清除法那么虚拟机必须维护一个列表,记录着哪一块内存可用,再分配时找到一块足够大的空间,划分给类对象实例。

    指针碰撞法

    如果垃圾回收机制为复制算法标记整理法,那么在分配内存时,直接将指针向空闲区域移动一段与对象大小相等的距离即可。

    在内存分配时,解决多线程同步的问题,有两种方案:一种是对分配内从空间的动作做同步处理;另一种是把内存分配按照线程划分,即每个线程在Java堆中预先分配一小块内存,成为本地线程分配缓冲。

    内存分配完成后,虚拟机将分配到的内存空间都初始化为零,这一步操作保证了对象中成员对象的初始化。

    对象在内存中的存储结构

    对象在内存中的存储结构可以分为对象头,实例数据,对齐填充。

    对象头

    对象头中存储了两部分信息,一部分存储对象自身运行时数据,如HashCode,GC分代年龄,锁状态标志等。对象头的另外一部分存储着类型指针,指向对象类元数据,虚拟机通过这部分信息确定对象是哪一个类的实例。

    如果对象为数组,对象头中还应该记录数组的长度。因为不同对象可以通过类的元数据确定对象的大小,但是通过数组的元数据无法得知数组的长度。

    实例数据

    实例数据部分存储着对象的有效信息,主要是成员变量。无论是从父类继承的,还是在子类中定义的都要记录下来。存储的顺序主要受虚拟机分配策略的影响。

    HotSpot中的分配策略为:long/double,int,short/char,byte/boolean,opps(Ordinary Object Pointers)。相同宽度的字段总是被放到一起,在满足这个条件的情况下,父类中定义的变量总是放到子类之前。

    对齐填充

    主要因为HotSpot自动内存管理系统要求对象起始地址必须是8字节的整数倍。

    展开全文
  • JAVA 对象创建过程

    2015-08-05 14:21:28
    以前一直认为自己对JAVA创建对象过程掌握的十分不错,最近同事小黄给我拿来一道面试题 我竟然答错了,最近正好工作调整,不太忙,决定好好整理一下JAVA基础知识点。就从这道题开始。
  • Java 对象创建过程详解 在java中 对于一个初始化一个对象的代码为 Date d = new Date() 但是,在底层中的实现,是怎么执行的呢?又分为哪些步骤呢? 例如我们拥有一个这样的类 public class Test { int x= 1; ...
  • Java 对象创建过程 (涉及到组合和继承的情况下 - 成员初始化顺序 对 Java 对象的创建过程成员初始化顺序尤其是涉及到组合和继承的情况下作一下梳 理总结 java 编程思想书中第 4 章初始化与清理中对 Java 对象的创建...
  • Java对象创建过程中的内存分配 1、一般情况下通过new指令来创建对象,当虚拟机遇到一条new指令的时候,会去检查这个指令的参数是否能在常量池中定位到某个类的符号引用,并且检查这个符号引用代表的类是否已经被加载...
  • java对象创建过程 引用:java面试通过手册工资号图片 1:类加载检查: 对象引用是否被加载,使用过,是否合法。 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号...
  • java对象创建过程解析

    2018-06-15 16:21:16
    了解对象创建过程,内存布局对于性能上的一些优化,理解很多原理是很有帮助的。 对象的创建: 对象的创建包含3个步骤:为对象分配内存空间、初始化对象、将对象的内存地址赋给引用。 分配内存空间 创建...
  • Java对象创建过程分析

    2019-04-29 19:50:43
    Java中,创建一个对象方法之一是使用new关键字,如下为创建一个对象的案例: class ObjectDemo { public int id; @Override public String toString() { return "id:" + id; } } public class Object.....
  • Java创建对象过程 image.png 类加载检查 虚拟机遇到new指令时,会去常量池定位整个类的符号引用,并且检查类是否被加载过,解析和初始化过,如果没有就执行相应的加载过程 分配内存 分配空间的大小在类...
  • JAVA对象创建过程内存图解

    千次阅读 多人点赞 2019-06-09 11:40:34
    1、类与对象 类是现实事物的抽象,将现实事物描述成对应的类,类中封装了成员变量、构造方法、成员方法、set/get方法。 比如说人,人都有哪些属性?姓名,年龄,性别...等等这些都属于人的属性,可以将其封装为类...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,405
精华内容 5,762
关键字:

java对象创建过程

java 订阅