黑马程序员技术交流社区
标题:
主函数内存的疑惑
[打印本页]
作者:
高鑫
时间:
2012-5-5 15:38
标题:
主函数内存的疑惑
请问,为什么主函数存在于栈内存中,而对象中的函数在方法区?
作者:
崔仁军
时间:
2012-5-5 17:41
呵呵 我也想知道
作者:
黄燕京
时间:
2012-5-5 17:44
规则就是这样的吧
作者:
江杰
时间:
2012-5-5 17:55
我觉得是操作系统分配的吧, 呵呵,还有根据堆栈的内存方式,堆是先进先出,栈是先进后出。 仅供参考。。
作者:
黑马张立国
时间:
2012-5-5 18:15
小弟是这样理解的
栈区( stack ) 由jvm自动分配释放 ,存放函数的参数值,局部变量的值,栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限(网上搜的)。
方法区 存放二进制方法(网上)
因为主函数是唯一的,又被jvm所调用,所以放到了栈区。
而对象中函数可能有许多,又不需要高效,所以放到了方法区。
作者:
黑马任雪刚
时间:
2012-5-5 18:25
java 虚拟机提供了程序运行时环境,其中,运行时环境中最重要的一个资源是运行时数据区。运行时数据区是操作系统为java虚拟进程分配的内存区域,java虚拟机操作着这块区域。
运行时数据区又划分为几个子区:
1.堆区:存放对象。
2.方法区:存放类的类型信息(静态变量和方法信息)
3.java栈区。
以一个小程序为例:
public class Amain
{
public static void main(String[] arr)
{
Sa s = new Sa("ren");
s.printName();
}
}
class Sa
{
String name;
Sa(String name)
{
this.name = name;
}
void printName()
{
System.out.println(name);
}
}
Sal类的类信息包括Sa类中的printName()还有Amain类的信息(包括main方法)方法在方法区内。
栈内存中存放着执行main()方法的主线程的方法掉用栈。
此程java虚拟机的运行过程为:首先在程序加载的时候找classpath文件中找到Amain.class类把它中的信息加载到方法区内,然后java虚拟机定位Amain中的main方法的字节码开始执行它的命令,加载Sa类信息到方法区,创建对象,并定位printName的字节码,执行printName()命令。
作者:
廖理
时间:
2012-5-5 19:07
本帖最后由 廖理 于 2012-5-5 19:16 编辑
类的方法是类的对象所共有的,所以类的方法在对象创建时被加载进了内存中的方法区,这些方法代码块就可以被所有创建的此类对象共有,共同使用,而不用每个对象中都保存一份代码块,节省了内存空间。当类的对象调用的到该方法时,Jvm会自动在方法中找到对应的方法,然后再将该方法加载到栈中,执行该行法。
方法在调用时都要被加载如Static才能运行,Main方法是程序的入口,由JVm直接调用,而且他是一个静态方法,但主函数比较特殊,主方法会在构造器之前,static变量初始化之后调用,这是由于Java的惰性初始化,在main方法被调用之前无法知道是否存在主类的实例。所以他是先于对象而存在的,所以调用他之后,才会创建对象, ,当对象调用方法时,Jvm就自动将对应方法加载到Stack中运行,此方法完成后自动从Stack内存中消失,但是方法区方法代码依然存在。main方法完成后也会从Stack中消失,即整个程序结束了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2