28

Java程序运行内存机制

 3 years ago
source link: http://www.cnblogs.com/JonnyJiang-zh/p/13735141.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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函数也弹出栈,程序就执行完成。

下图为当声明一个对象时的调用情况:

MbyMfyA.png!mobile

下图为声明2个对象时的调用情况:

YVR3iei.png!mobile

当声明第二个对象时,与前面说的一样,会在先在栈内存中进行变量的入栈,然后 new Phone() 会在堆内存内申请一块内存。方法区还是跟原来一样。

下图是将一个对象的值赋给另一个对象的调用情况:

uQrENb.png!mobile

当将两个对象的值赋值给其他对象时,会把该对象在栈内存中申请的内存的地址赋值给新对象,新对象也同时指向该区域,且一个对象对该区域的内容进行更改时,另一个对象也会察觉到。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK