当编写一句int a = 1;时,计算机内部到底发生了什么?
首先我们编写的Java源文件,如Test.java是存储在硬盘中的,负责持久化的保存文件,当然,我们需要在一个类中编写代码,还需要一个main方法
class Test{
public static void main(String[] args){
int a = 1;
System.out.print(a);
}
}
但Java源文件计算机不可识别,需要通过javac命令将.java文件编译成计算机可识别的字节码文件Test.class。Java程序的执行,需要在计算机的另一片空间,内存中,JVM在整个计算机的内存中开辟了一片空间来执行Java程序。
在一般的Java开发中,基本只涉及JVM中的三块区域:栈内存、堆内存、方法区(元空间)
栈内存存储了:
变量空间
计算时的临时副本空间
方法执行的临时空间
机制:用完即回收,FILO(first in last out),空间相对较小
堆内存:
new关键字申请的内存空间(数组/对象) ,反射中的newInstance也可以
机制:GC(garbage collection)垃圾回收
方法区:
存储只有一份的内容,如类模板(Class对象)
静态元素、常量、字符串对象
了解了Java虚拟机的内存空间后,我们再回来思考开始的那个问题。
在经过javac指令编译后,大多数人通常会有一个疑问,为什么执行程序时,输入java Test而不是java Test.class?
![](https://img-blog.csdnimg.cn/img_convert/d1270e0354aaa4286f13d2ada5cc3ee2.png)
其实java指令,执行的是已经加载到内存中的Test类,所以不需要加.class。
显而易见,执行了一条java指令,背后应该有两道程序,先被动的将class文件加载到JVM的方法区中,再执行程序,也就是Java虚拟机会寻找类模板中的main方法入口,将其压栈到栈内存中。
int a = 1;这条语句=的左侧,a是一个小盒子,也就是开辟的一个变量空间,名称叫做a,同时Java是强类型语言,int规定了变量空间存储内容的类型只能为int整数,=右边的1是常量,以32bit的二进制存储在常量池中,这样的过程称为等号赋值。
![](https://img-blog.csdnimg.cn/img_convert/5ee577a48dd02c1d0c00e2603b38cf3a.png)