Java内存分配介绍
1.方法区:放class文件的
2.栈内存:方法运行时所进入的内存,变量也在这里
3.堆内存:new出来的对象都在堆内存中
4.本地方法栈(暂不做说明)
5.寄存器(暂不做说明)
面向对象涉及的内存机制
1.定义一个类
public class Car {
//成员变量
String name;
double price;
//方法
public void run() {
System.out.println("价格为" + price + "万的" + name + "跑得很快");
}
}
2.调用这个类
public class test1 {
public static void main(String[] args) {
Car c = new Car();
c.price = 56.3;
c.name = "某某品牌轿车";
c.run();
}
}
3.内存图展示
最初的内存
(1)运行test1.class,test1.class会被加载到方法区中,test1中有main方法,虚拟机会将main方法加载到栈内存中执行
public class test1 {
public static void main(String[] args) {
(2)执行main方法的第一行代码,首先会涉及到Car类,于是Car类被加载到方法区中。c为引用型变量,放在栈内存中,并开辟一个空间,用来存放对象在堆内存中的地址。等号右边新建了一个对象,对象会被存放在堆内存中,堆内存会开辟一段空间代表Car的对象,空间里面会存放对象的属性,此时属性为默认值,并且放入成员方法的引用地址,因为成员方法的代码太多,放进去不方便。然后将对象在堆内存中的地址赋给c。
Car c = new Car();
(3)通过c中的地址在堆内存中找到对象,再把对象中的默认值修改
c.price = 56.3;
c.name = "某某品牌轿车";
(4)通过对象地址找到成员方法的引用地址从而找到run方法,把run方法提取到栈空间中运行。因为run()方法是c访问的,所以run()方法也只会访问c所指向的对象信息。
c.run();
(5)最终结果