A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

当一个程序开始运行的时候,先要找到入口也就是main函数,所以在栈内存开辟空间来存放main函数,当main函数中需要调用某一类中的某一函数时,方法区会开辟这个类的函数的空间,但是为什么在调用的时候还会在栈内存中开辟放这个函数的空间呢?

4 个回复

倒序浏览
这个,想要完全明白,你需要学习计算机组成原理,了解一点汇编知识。我打个比方吧,能明白最好,看不明白也没关系,初学者没必要太深究细节。

比如你买了主板、CPU、硬盘、内存条、显卡、键盘、鼠标、电源等等,想组装一台电脑。电脑城的人给你写了一份步骤说明,告诉你第一步做什么,第二步做什么。。。你回到家,开始按照说明操作,这个过程中,你需要腾出些地方来暂时摆放各个部件和那些包装盒吧,还得用到螺丝刀等辅助工具吧。组装完成之后你开始使用电脑,这时候螺丝刀不需要了吧,刚才摊了一地的空间可以用来放其他东西了吧,那些包装盒可以扔了吧。

在上面的场景中,电脑城的人给你写的组装步骤说明就相当于存在方法区的代码指令。摆放部件和包装盒的空间、用到的螺丝钉就相当于栈。可见,栈中的东西和方法区的东西是不一样的。栈是用来存放你执行方法代码时需要临时存放的中间结果。方法执行完毕,返回值已经返回,那么栈里的东西就不需要了,这时候刚才开辟的栈空间就可以回收了
回复 使用道具 举报
fantacyleo 发表于 2014-7-28 18:40
这个,想要完全明白,你需要学习计算机组成原理,了解一点汇编知识。我打个比方吧,能明白最好,看不明白也 ...

哦,你的意思是栈只是临时存储中间的结果,一旦函数执行完了就会释放,而方法区里的会持续存在?直到该类运行完?
回复 使用道具 举报
面向对象 发表于 2014-7-28 18:51
哦,你的意思是栈只是临时存储中间的结果,一旦函数执行完了就会释放,而方法区里的会持续存在?直到该类 ...

嗯,差不多。方法区的信息一般是JVM启动时加载,直到程序运行完毕,JVM退出才销毁
回复 使用道具 举报
fantacyleo 发表于 2014-7-28 19:57
嗯,差不多。方法区的信息一般是JVM启动时加载,直到程序运行完毕,JVM退出才销毁 ...

明白了,谢谢阿
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马