zoukankan      html  css  js  c++  java
  • JVM的栈内存

      每当启动一个新线程时,Java虚拟机都会为它分配一个Java栈。Java栈以帧为单位保存线程的运行状态。虚拟机只会直接对Java栈执行两种操作:以帧为单位的压栈和出栈。

      某个线程正在执行的方法被称为该线程的当前方法,当前方法使用的栈帧称为当前帧,当前方法所属的类称为当前类,当前类的常量池称为当前常量池。在线程执行一个方法时,它会跟踪当前类和当前常量池。此外,当虚拟机遇到栈内操作指令时,它对当前帧内数据执行操作。

      每当线程调用一个Java方法时,虚拟机都会在该线程的Java栈中压入一个新帧。而这个新帧自然就成为了当前帧。在执行这个方法时,它使用这个帧来存储参数、局部变量、中间运算结果等数据。

      Java方法可以以两种方式完成。一种通过return返回的,称为正常返回;一种是通过抛出异常而异常终止的。不管以哪种方式返回,虚拟机都会将当前帧弹出Java栈然后释放掉,这样上一个方法的帧就成为当前帧了。

      Java帧上的所有数据都是此线程私有的。任何线程都不能访问另一个线程的栈数据,因此我们不需要考虑多线程情况下栈数据的访问同步问题。当一个线程调用一个方法时,方法的的局部变量保存在调用线程Java栈的帧中。只有一个线程能总是访问那些局部变量,即调用方法的线程。

    JVM栈之局部变量表:包含参数和局部变量

    局部变量表存放了基本数据类型、对象引用和returnAddress类型(指向一条字节码指令的地址)。其中64位长度的long和double类型的数据会占用2个局部变量空间(slot)(下图1到3的原因),其余数据类型只占用1个。局部变量表所需的内存空间在编译期间完成分配。每个方法都对应一个栈帧。

    public class StackDemo {
        
        //静态方法
        public static int runStatic(int i, long l, float f, Object o, byte b) {
            return 0;
        }
    
        //实例方法
        public int runInstance(char c, short s, boolean b) {
            return 0;
        }
    
    }

    其对应的局部变量表如下:

    上方表格中,静态方法和实例方法对应的局部变量表基本类似。但有以下区别:实例方法的表中,第一个位置存放的是当前对象的引用。

    JVM栈之操作数栈

    Java没有寄存器,所有参数传递都是使用操作数栈。

    public static int add(int a,int b){
            int c=0;
            c=a+b;
            return c;
        }

    压栈的步骤如下:

      0:   iconst_0 // 0压栈

      1:   istore_2 // 弹出int,存放于局部变量2

      2:   iload_0  // 把局部变量0压栈

      3:   iload_1 // 局部变量1压栈

      4:   iadd      //弹出2个变量,求和,结果压栈

      5:   istore_2 //弹出结果,放于局部变量2

      6:   iload_2  //局部变量2压栈

      7:   ireturn   //返回

    如果计算100+98的值,那么操作数栈的变化如下图所示:

    35721707-fff7-4516-86a7-dda30320dc06

    JVM栈之栈上分配(动态链连接)

    小对象(一般几十个bytes),在没有逃逸的情况下,可以直接分配在栈上
    
    直接分配在栈上,可以自动回收,减轻GC压力
    
    大对象或者逃逸对象无法栈上分配

  • 相关阅读:
    如何:为 Silverlight 客户端生成双工服务
    Microsoft Sync Framework 2.1 软件开发包 (SDK)
    Windows 下的安装phpMoAdmin
    asp.net安全检测工具 Padding Oracle 检测
    HTTP Basic Authentication for RESTFul Service
    Windows系统性能分析
    Windows Server AppFabric Management Pack for Operations Manager 2007
    Mongo Database 性能优化
    服务器未能识别 HTTP 标头 SOAPAction 的值
    TCP WAIT状态及其对繁忙的服务器的影响
  • 原文地址:https://www.cnblogs.com/wade-luffy/p/5753057.html
Copyright © 2011-2022 走看看