zoukankan      html  css  js  c++  java
  • JVM 之栈结构

    JVM中三块主要的内存就是:栈内存,堆内存,方法区内存
    方法区最先有数据:方法区中存放的是代码片段,存放class字节码
    栈内存:方法调用的时候,该方法需要的内存空间在栈中分配,并且调用时就是压栈。方法不调用是不会再栈中分配空间的,,方法执行结束后,该方法所需要的空间就会释放,此时发生弹栈动作。
    方法调用叫做:压栈,分配空间
    方法结束叫做:弹栈,出栈,释放空间
    栈中存储什么?方法运行过程中需要的内存,以及栈中会存储方法的局部变量

    栈的形状是露出一边,从露出的这一边进去,也是从这一边出来。所以说,栈的特点是“先进后出”或者“后进先出”。

    如下图:

    栈帧永远指向的是栈顶元素,栈顶元素具有活跃权。

    数据data1先进入栈低,然后数据data2再进入,数据data3最后进去。

    出的时候数据data3先出,然后数据data2再出,数据data1最后出栈。

    public class Stack {
        public static void main(String[] args) {
            System.out.println("main begin");
            int x = 100;
            m1(x);
            System.out.println("main over");
    
        }
    
        public static void m1(int i){
            System.out.println("m1 begin");
            m2(i);
            System.out.println("m1 over");
        }
    
        public static void m2(int i){
            System.out.println("m2 begin");
            m3(i);
            System.out.println("m2 over");
        }
    
        public static void m3(int i){
            System.out.println("m3 begin");
            System.out.println(i);
            System.out.println("m3 over");
        }
    }
    结果:
    main begin m1 begin m2 begin m3 begin
    100 m3 over m2 over m1 over main over

    运行是占用内存情况:1.首先main方法进栈,在main里面调用m1,运行到m1那行代码就停止,然后给m1方法分配内存空间.。因为在m1方法中调用了m2方法,运行至调用m2方法时停止,然后给m2方法分配内存空间,因为在m2方法中调用了m3方法,那么运行至m3方法时给m3方法分配内存空间。如下图所示:这时m3方法是栈帧,执行完over时,整个方法运行结束,m3方法出栈。接下来栈帧指向m2方法,m2输出over,运行完,出栈。然后栈帧指向m1方法,m1输出over,运行完,m1出栈。栈帧指向main方法,然后输出over,main方法出栈,此时程序运行完。

     

     

     

  • 相关阅读:
    改变,必须改变
    厦门四日
    再谈兴趣的重要性,人的差别及如何认识自我
    xcode svn checkout的项目无法真机运行解决办法
    [转]c的fopen()打开文件的模式,第二个参数
    cocos2dx 横板游戏触屏人物和背景移动 方法1
    简单的小球移动隐含的bug
    使用CCHttpRequest后要记得release(),否则内存泄漏
    资源路径问题 (ios平台)
    cocos2dx 横板游戏触屏人物和背景移动 方法2
  • 原文地址:https://www.cnblogs.com/peiminer/p/13589146.html
Copyright © 2011-2022 走看看