在了解Java new关键字之前,要先了解内存区域的几点知识。
运行时内存区域
- 程序计数器
- 解释:一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。它是程序控制流的指示器,分支、循环、跳转、异常处理、线程回复等基础功能都需要依赖这个指数器来完成。
- 线程私有:由于Java虚拟机的多线程是通过线程轮流切换、分配处理器执行时间来完成的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的命令。因此,为了线程切换之后能够恢复到正常的执行位置,每个线程都需要一个独立的程序计数器。
- Java虚拟机栈(在大多数情况下,“栈”指的就是这个)
- 解释:虚拟机栈描述的是Java方法执行的线程内存模型:每一个方法被执行的时候,JVM都会同步创建一个栈帧(用于支持虚拟机进行方法调用和方法执行的数据结构),用于储存局部变量表,操作数帧、动态连接、方法出口等信息。一个方法从被调用到执行完毕的过程,都是一个栈桢入栈和出栈的过程。
- 本地方法栈
- 略。
- 堆
- 唯一目的:存放对象实例。
- 线程共享。
- 方法区(特殊的堆)
- 解释:用于存放已被虚拟机加载的类型信息、常量、静态变量、运行时常量池、即时编译器编译后的代码缓存数据。
- 线程共享。
- 运行时常量池:用于存放编译期生成的各种字面量和符号引用。
new关键字所做的事
- 在堆中开辟一块内存。
- 调用该类的构造方法实例化对象。
- 返回堆内存的地址。
一般情况下,我们会声明一个该类的引用,并将new返回的地址赋给引用。引用即可代表对象了,