
class Student{
int stuNum;
String name;
int age;
void show(){
System.out.println("学号:"+stuNum+" 姓名:"+name+" 年龄:"+age);
}
Student(){}
}
public class Stu {
public static void main(String[] args) {
Student s1=new Student();
s1.age=18;
s1.stuNum=1;
s1.name="嘿嘿";
s1.show();
Student s2=new Student();
s2.age=18;
s2.stuNum=2;
s2.name="嘻嘻";
s2.show();
}
}
近期学习Java300集总结而来,有何不对欢迎私信。
JVM中有虚拟机栈,堆,方法区。由于jdk的版本不同,方法区的定义可能会有所不同。
先浅谈一下什么是虚拟机栈,堆,方法区。
虚拟机栈 1. 栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)。 2. JVM 为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等) 3. 栈属于线程私有,不能实现线程间的共享! 4. 栈的存储特性是“先进后出,后进先出”。 5. 栈是由系统自动分配,速度快!栈是一个连续的内存空间! 堆 1. 堆用于存储创建好的对象和数组(数组也是对象) 2. JVM 只有一个堆,被所有线程共享 3. 堆是一个不连续的内存空间,分配灵活,速度慢! 4. 堆被所有的线程所共享,在堆上的区域,会被垃圾回收器做进一步划分,例如新生 代、老年代的划分。 方法区 1. 方法区是 JAVA 虚拟机规范,可以有不同的实现。 (1). JDK7 以前是“永久代” (2). JDK7 部分去除“永久代”,静态变量、字符串常量池都挪到了堆内存中 (3). JDK8 是“元数据空间”和堆结合起来。 2. JVM 只有一个方法区,被所有线程共享! 3. 方法区实际也是堆,只是用于存储类、常量相关的信息! 4. 用来存放程序中永远是不变或唯一的内容。 5. 常量池主要存放常量:如文本字符串、final 常量值。 程序执行过程1.程序从main方法开始,加载里面的变量,
2.当程序执行到 Student s1=new Student();中的Student时,方法区会加载Student类,加载一些这个类的方法和引用数据类型的变量,并为其模块编写地址。
3.接着执行这句代码,该执行s1时,会在main的栈帧中添加s1变量,如下图所示
4.当程序执行到new关键字时,会在堆里面开辟空间和在虚拟机栈中创建Student的栈帧,并按照方法区里面的模板来进行创建。并且给s1赋值。其中String类型的变量和方法采用引用地址的方式。
5.Student s1=new Student();执行完之后虚拟机栈中Student的栈帧释放,并执行对对象中的变量进行赋值语句。如图所示:
6.当执行到s1.show();时,会在虚拟机栈中创建show的栈帧。虽然此方法看似没有传参数,但是会传隐式参数this,以便于获得学号、姓名和年龄的值。
7.执行完之后,虚拟机栈中show的栈帧释放。如下图所示:
8,创建第二个对象s2的过程重复步骤3到7。
9. 执行完之后,虚拟机栈中main的栈帧释放。程序结束。