在了解程序的运行过程之前,必须要先了解java的数据类型,这是为了让你了解不同类型的数据会被存放在那个内存区中
数据分配
引用数据类型:
①在栈内存的栈帧中存放的是一个引用,这个引用的内容就是堆内存中对象的地址(就像是下段代码中的存放于栈内存中的user是指向堆内存中的user的引用)
②在堆内存的对象中存放的是一个引用,这个引用的内容就是堆内存中另一个对象的地址(就像是下段代码中的存放于user中的addr是指向堆内存中的addr的引用)
public class Test {
public static void main(String[] args) {
User user =new User();
user.id=10;
user.s="abcd";
user.addr.s1="abcd";
}
}
class User {
int id;
String s;
Address addr;
}
class Address{
String s1;
}
基本数据类型:比较灵活,既可以在栈内存又可以在堆内存中
new运算符:用于在jvm的堆内存中开辟一块空间
方法区内存:用于存放代码片段,字节码文件
栈内存:用于方法区代码片段在执行时会给该区域分配内存,在栈内存中压栈,局部变量在栈内存中存储
堆内存:new出的的对象在堆内存中存储
程序运行的过程
首先计算机会进行编译,这样才能使计算机看懂你的代码。即计算机启动jdk中的jvm来将你写的代码(.java文件)编译成存储类的结构信息的字节码文件(.class文件),字节码文件包含了类的字段、方法信息、方法
然后jvm执行.class文件(首先将.class文件存入jvm的方法区内存(包含代码片段,静态变量)中,然后jvm根据方法区中的代码片段在栈内存中(包含局部变量,方法的相关参数)开辟一个用来执行main方法的空间,用来存储main方法的数据和变量
最后按照方法区内存中的字节码进行其他操作,同时按照GC机制(堆内存垃圾回收机制)将后续代码逻辑中存在于堆内存中不再引用的数据地址释放
public class Test {
public static void main(String[] args) {
int a =10;
User user =new User();
user.id=a;
user.s="abcd";
user.addr = new Address();
addr.s1 = "abcd";
}
}
class User {
int id;
String s;
Address addr;
}
class Address{
String s1;
}
上述代码在jvm的实际存储情况如图所示