一个类的方法如下: public void demo() { ClassA ca = new ClassA(); int c = 9; } public static void main() { int i = 1; demo(); } 当JVM调用一个程序的main运行程序时栈的情况是这样的:第7个进栈:变量c的值 第6个进栈:对象ca的在地址值(这个值肯定是堆内存中的某个内存地址,因为对象ca是动态分配的) 第5个进栈:demo()方法的返回地址值 第4个进栈:main()函数运行状态 第3个进栈:变量的i值 第2个进栈:main的返回地址值(对于main的返回地址是JvM指定的) 第1个进栈:操作系统运行状态这个过程就是所谓的函数进栈,当demo()执行完后,立刻以相反的顺序退栈,退栈是JvM自己控制的. 在退栈过程中局部对象ca的地址也会被释放掉,但是因为它是动态分配的,对象所占用的内存是在堆内存,所以这时虽然这时我们没有办法再使用对象ca但是对象ca还是占用着堆内存,并不会在函数退栈调用后立即释放,那怎么办呢,这就是JVM中垃圾收集器的任务了,所以在JAVA中写程序当一个对象(JAVA中的对象都是动态分配的,不象C++可以在栈中为对象分配内存)用完后不用记着写代码去释放它(C++中动态分配的内存,要求程序员必须在用完后自己写代码释放)。
比如说F()
{
S()
}
则是F()函数先入栈,然后调用s函数,s再入栈,s函数执行完后,则出栈,然后调用它的F函数就出栈了
代码就是存放函数及过程代码的.
数据区是存放程序中的全局变量\常量\静态变量
栈区是函数调用时要利用的内存区,数据的出入机制是先进后出(这个我想你知道)这些数据包括
函数参数变量\局部变量\上一级调用函数的地址等.栈区一般不会太大
堆区是程序中采用动态分配机制时要用的内存区域,它的大小要发栈区大得多 下面我举例着重说明栈和堆
一个类的方法如下:
public void demo()
{
ClassA ca = new ClassA();
int c = 9;
} public static void main()
{
int i = 1;
demo();
} 当JVM调用一个程序的main运行程序时栈的情况是这样的:第7个进栈:变量c的值
第6个进栈:对象ca的在地址值(这个值肯定是堆内存中的某个内存地址,因为对象ca是动态分配的)
第5个进栈:demo()方法的返回地址值
第4个进栈:main()函数运行状态
第3个进栈:变量的i值
第2个进栈:main的返回地址值(对于main的返回地址是JvM指定的)
第1个进栈:操作系统运行状态这个过程就是所谓的函数进栈,当demo()执行完后,立刻以相反的顺序退栈,退栈是JvM自己控制的.
在退栈过程中局部对象ca的地址也会被释放掉,但是因为它是动态分配的,对象所占用的内存是在堆内存,所以这时虽然这时我们没有办法再使用对象ca但是对象ca还是占用着堆内存,并不会在函数退栈调用后立即释放,那怎么办呢,这就是JVM中垃圾收集器的任务了,所以在JAVA中写程序当一个对象(JAVA中的对象都是动态分配的,不象C++可以在栈中为对象分配内存)用完后不用记着写代码去释放它(C++中动态分配的内存,要求程序员必须在用完后自己写代码释放)。
不知道你明白一些一没有.
没太多时间写.建议你去看一下这本书<C++程序设计教程(钱能)>,非常非常好的一本书.
呵呵。。