Java程序运行内存机制
栈内存包留调用方法、变量的区域,堆内存是new对象的区域,方法区为保存class文件的区域。
程序刚开始时,先加载类文件相应的数据到方法区,然后就从main()
方法开始执行。执行main()
方法,main()
方法入栈,执行phone one = new Phone()
,首先Phone one
声明一个变量并入栈,然后new Phone()
在堆内存申请一块空间,此时,申请的堆内存中保留着类文件中的那些变量;然后,申请区域中的方法则是一快存储着方法地址的区域。然后堆中申请的区域的地址就被赋予给栈内存中声明的变量进行初始化。然后就继续执行one.brand = "苹果";one.price = "8838.0";one.color = "黑色";
对声明变量所指向的堆内存中的一些变量进行初始化(更新)。当调用one.call("乔布斯");
时,就会去寻找变量one中的方法区域去找相应的方法的地址然后就去方法区里去寻找相应的方法,然后就将one.call()
方法进行入栈,并执行。当执行完了后one.call()
就从栈空间中弹出栈。然后就继续执行one.sendMessage()
,原理类似。当运行到main()
方法的结尾大括号时,main函数就执行完成,main函数也弹出栈,程序就执行完成。
下图为当声明一个对象时的调用情况:
下图为声明2个对象时的调用情况:
当声明第二个对象时,与前面说的一样,会在先在栈内存中进行变量的入栈,然后new Phone()
会在堆内存内申请一块内存。方法区还是跟原来一样。
下图是将一个对象的值赋给另一个对象的调用情况:
当将两个对象的值赋值给其他对象时,会把该对象在栈内存中申请的内存的地址赋值给新对象,新对象也同时指向该区域,且一个对象对该区域的内容进行更改时,另一个对象也会察觉到。