zoukankan      html  css  js  c++  java
  • JVM运行时数据区(一)

    1、名词解释:

      栈帧:栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的栈元素。

    2、程序计数器:

      程序计数器是一块比较小的内存空间,可以将它看作是当前线程所执行的字节码的行号指示器。

      由于Java是支持多线程的语言,当运行的线程数超过CPU数量时,线程之间根据CPU时间片轮询抢夺CPU资源,在任意一个时刻,一个处理器(例如一个单核的CPU)都只能执行一条线程中的指令,其他线程都必须被切换出去。因此为了保证每一个线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,各个线程之间,程序计数器独立工作,互不影响;所以程序计数器是线程的私有空间。

      如果当前线程正在执行一个Java方法,则程序计数器记录正在执行的Java字节码地址,如果当前线程正在执行一个Native方法,则程序计数器为空。在Java虚拟机规范中,该区域是没有规定任何OOM(OutOfMemoryError在以后的文章中都将使用OOM来表示OutOfMemoryError)的区域。

    3、Java虚拟机栈

      Java虚拟机栈与程序计数器一样也是线程私有的内存空间,它随着线程的创建而创建,随着线程的消失而消失;它主要用于存储方法的局部变量、操作数栈、动态链接方法和返回地址等信息。

      虚拟机在运行时使用一种叫栈帧的数据结构保存上下文数据。在栈帧中,存放了方法的局部变量表、操作数栈、动态链接方法和返回地址等信息。每一个方法的调用都伴随着栈帧的入栈操作;相同地,方法的返回则伴随着栈帧的出栈操作(这就是传说中的入栈、出栈)。由于局部变量表中存储的是基本数据类型(boolean、byte、int、short、char、float、double、long)、对象的引用(可以理解为一个指针,指向堆内存中的对象)和返回值地址,所以当一个方法的参数和局部变量相对较多时,那么栈帧中的局部变量表就会比较大,栈帧会膨胀以满足方法调用所需传递的信息。在Java虚拟机栈中与性能调优关系最为密切的部分就是局部变量表。局部变量表用于存放方法的参数和局部变量。其中long与double占用8个字节(64位),int和float占用4个字节,short和char占用2个字节,byte占用1个字节,boolean占用1位(虚拟机按1个字节进行处理)。在方法执行时,虚拟机使用局部变量表完成方法的传递,对于非static方法还会将当前对象this作为参数通过局部变量表传递给当前方法。

      Java虚拟机规范允许,Java栈的大小是动态的或者固定的。在java虚拟机规范中,对该区域定义了两种异常:StackOverflowError和OOM。如果线程在计算过程中,请求的栈深度大于最大可用的栈深度,则抛出StackOverflowError;如果Java栈可以动态扩展,而在扩展栈的过程中,没有足够的内存空间来支持栈的扩展,则抛出OOM。

      在Java虚拟机中,可以使用-Xss参数来设置栈的大小。栈的大小直接决定了函数调用的可达深度。

  • 相关阅读:
    UVA12125 March of the Penguins (最大流+拆点)
    UVA 1317 Concert Hall Scheduling(最小费用最大流)
    UVA10249 The Grand Dinner(最大流)
    UVA1349 Optimal Bus Route Design(KM最佳完美匹配)
    UVA1212 Duopoly(最大流最小割)
    UVA1395 Slim Span(kruskal)
    UVA1045 The Great Wall Game(二分图最佳匹配)
    UVA12168 Cat vs. Dog( 二分图最大独立集)
    hdu3488Tour(KM最佳完美匹配)
    UVA1345 Jamie's Contact Groups(最大流+二分)
  • 原文地址:https://www.cnblogs.com/tester-hqser/p/9321001.html
Copyright © 2011-2022 走看看