我们老大上课里老说Java程序运行的 函数入栈。动态分配入堆。。
请高手详细给小弟介绍一下程序运行时内存分配的情况。
感激中

解决方案 »

  1.   

    调用函数就想入栈,栈是一种先进后出的数据结构
    比如说F()
    {
        S()
    }
    则是F()函数先入栈,然后调用s函数,s再入栈,s函数执行完后,则出栈,然后调用它的F函数就出栈了
      

  2.   

    讲得好,记得给分;没讲好,通知我再讲,同样不样忘了给分.  首先要清楚一个程序运行时在内存中分四个区:数据区\栈区\堆\代码区.
     代码就是存放函数及过程代码的.
     数据区是存放程序中的全局变量\常量\静态变量
     栈区是函数调用时要利用的内存区,数据的出入机制是先进后出(这个我想你知道)这些数据包括
    函数参数变量\局部变量\上一级调用函数的地址等.栈区一般不会太大
     堆区是程序中采用动态分配机制时要用的内存区域,它的大小要发栈区大得多 下面我举例着重说明栈和堆
      
        一个类的方法如下:
        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++程序设计教程(钱能)>,非常非常好的一本书.
      

  3.   

    赞!讲的好 明白了不少又啊 涨知识了!!!我好像知道了jvm到底是怎么工作的了首先装载一个类的时候,jvm检查该类的Class对象是否装载,(编译得到每个.class文件内都有一个Class对象),如果没有装载,则装载,这样就可以创建该类的对象了,当然,这个对象是在堆内分配的,且是动态分配的。然后就可以进行操作了,原理就是楼上的了
      

  4.   

    茶人兄。谢谢你哈我想再麻烦你帮我讲一下C++的。。好像和Java是不完全一样的吧?不过你不回我也会给你分的。。当然。我希望各位老大不是看着这点点分数,而是帮一个初学的兄弟来的
    呵呵。。