A:Java虚拟机运行时数据区域(JVM : Java virtual machine)

1. 程序计数器 Program Counter Register
2. 本地方法栈 Native Method Stack
3. 虚拟机栈JVM Stack(方法栈,栈区)
    1. 作用:执行方法
    2. 程序中所有方法若想执行,必须进栈(压栈),方法执行完弹栈
    3. 栈的结构
   1. 栈 : 先进后出  
   2. 队列:先进先出
4. 堆 Heap
    1. 保存实体对象和数组
5. 方法区 Method Area
    1. 加载存储class文件
      

B:类加载过程:jvm虚拟机将class文件从硬盘上加载到方法区中,

可见后面反射的类加载器:

对于非静态变量,不是开辟内存空间,只是将被翻译成为二进制的代码加载到方法区内存中。

对于静态变量,jvm虚拟机会在方法区中给静态变量开辟空间,并且先给默认初始化值,然后在赋值。

启动JVM,加载程序中需要使用的class文件。

  1. 在加载class文件的时候,所有的静态内容(静态成员变量,静态成员函数,静态代码块)都要加载到方法区的静态区中。
  2. 当类中的所有静态加载完成之后,开始给类中的所有静态成员变量默认初始化。
  3. 类中的所有静态成员变量默认初始化完成之后,开始给这些静态成员变量显示赋值。
  4. 所有静态成员变量显示赋值结束之后,开始运行类中的静态代码块。
  5. 当所有的静态代码块执行完成,代表当前这个class文件才彻底被加载结束。

C:new创建一个对象都在内存中做了什么事情?

Student s = new Student();这句代码随着主方法入栈(在栈中生成),只是在堆区中开辟

空间。

 1先将硬盘上指定位置的Person.class文件加载进内存。

2执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然后在main方法的栈区分配了一个变量p。

3使用new关键字创建对象,在栈内存中给对象变量开辟一个空间,在堆内存给对象分配空间。

    4给对象所属类中的所有非静态成员变量分配空间并进行默认初始化。(定义没有直接赋值就会)

    5执行和new对象时传递参数一致的构造方法

          执行构造方法的过程中有隐式三步:

               ①:执行super()语句,找父类的无参构造方法(在这过程中也有隐式三步,执行super()。。。直到超类object类)

               ②:给非静态成员变量进行显示赋值

               ③:运行构造代码块

               ④:执行构造方法中的自己写的代码。

6将首地址赋值给p ,p变量就引用了该实体。(指向了该对象)

D:new关键字为什么能够开辟空间?(JVM 在windows上,JVM调用windows内存c、c++)

 0 . 原理: 子类要能定义成功(能创建对象),必须调用父类的构造方法!(本质调用Object的构造)

           1. Object 是所有类(除了Object本身),数组的顶层父类

           2. Object 有一个本地方法 native void registerNatives(); - 》 Java调用C、C++(JVM底层)

                           1. 申请系统资源(内存),就可以创建对象了

           3. Object的方法在Object类被加载的时候就执行了(最先加载)

           4. Object加载过后,申请到系统资源,对象就可以new了

创建对象申请空间图解:

类加载过程和创建对象做了哪些步骤?_JVM