精华内容
下载资源
问答
  • Java运行时数据区域

    2019-10-06 19:01:03
    两个名词的对比 java内存模型 定义了线程和主内存之间的抽象关系,即Jvm在计算机内存中的工作方式,控制线程之间的通信...Java运行时数据区域主要可以分为五个区域: 1.程序计数器 2.Java虚拟机栈 3.本地方法栈 4....

    两个名词的对比

    • java内存模型

    定义了线程和主内存之间的抽象关系,即Jvm在计算机内存中的工作方式,控制线程之间的通信。

    • java内存区域

    内存区域是指 Jvm 运行时将数据分区域存储,强调对内存空间的划分。

    今天主要总结一下Java运行时的数据区域

    Java运行时数据区域

    Java运行时数据区域主要可以分为五个区域:
    1.程序计数器
    2.Java虚拟机栈
    3.本地方法栈
    4.堆
    5.方法区

    程序计数器

    • 作用

    用来记录线程正在执行的虚拟机字节码指令的地址,如果正在执行的是 Native 方法,这个计数器值则为空(Undefined)。

    • 共享性

    每一个线程都有自己独立的程序计数器,各条线程之间计数器互不影响。

    • 大小

    是一块较小的内存空间,而且此内存区域是唯一一个在 Java 虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域。

    Java虚拟机栈

    • 作用

    一个方法在执行的同时,会创建一个栈帧用于存储该方法的局部变量、方法出口、操作数栈、动态链接等信息。方法从执行到结束,对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

    • 共享性

    线程私有的,它的生命周期与线程相同。

    本地方法栈

    • 作用

    和Java虚拟机栈作用相似,区别在于Java虚拟机栈执行的式java方法,而本地方法栈执行的是虚拟机使用到的Native方法

    Java堆

    • 作用

    就是存放对象实例,几乎所有的对象实例都在这里分配内存

    • 大小

    是 Java 虚拟机所管理的内存中最大的一块

    • 共享性

    被所有线程共享的一块内存区域

    方法区

    • 作用

    存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

    • 共享性

    与 Java 堆一样,是各个线程共享的内存区域

    问题

    1. 从堆和栈的功能以及作用来比较,堆和栈有什么不同?

    堆主要用来存放对象,栈主要是用来执行程序的。相较于堆,栈的存取速度更快,但栈的大小和生存周期必须确定,因此缺乏一定的灵活性。而堆却可以在运行时动态的分配内存,生存期不用提前告诉编译器,但这也导致了其存取速度的缓慢。

    2. 不同线程调用方法为什么是线程安全的?

    任何方法每次被线程调用,都会在栈中开辟新的空间。同一方法的不同线程执行,方法与方法之间互不影响。全局变量因为是存在堆区的对象中,所以会互相干扰。
    3. 成员变量存储在哪儿?

    静态成员变量存储在方法区,非静态成员变量存储在堆区。
    4. 为什么局部变量不能够static修饰?

    局部变量存储在栈区,在方法调用时不能够自动初始化必须由程序员手动初始化,否则会报错,归根结底是由于static变量和局部变量存储的位置不一样。

    下一节介绍Java内存模型。
    参考:
    Java内存区域划分
    Java内存区域(运行时数据区域)和内存模型(JMM)

    转载于:https://www.cnblogs.com/xxyxt/p/11370293.html

    展开全文
  • java运行时数据区域

    2020-12-28 16:26:30
    java运行时数据区域 程序计数器 内存空间小,线程私有。字节码解释器工作是就是通过改变这个计数器的值来选取下一条需 要执行指令的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖 计数器...

    java运行时数据区域

    在这里插入图片描述
    程序计数器

    内存空间小,线程私有。字节码解释器工作是就是通过改变这个计数器的值来选取下一条需
    要执行指令的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖
    计数器完成
    如果线程正在执行一个 Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地
    址;如果正在执行的是 Native 方法,这个计数器的值则为 (Undefined)。此内存区域是唯一
    一个在 Java 虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域。

    Java 虚拟机栈
    线程私有,生命周期和线程一致。描述的是 Java 方法执行的内存模型:每个方法在执行时
    都会床创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等
    信息。每一个方法从调用直至执行结束,就对应着一个栈帧从虚拟机栈中入栈到出栈的过程。
    局部变量表:存放了编译期可知的各种基本类型(boolean、byte、char、short、int、float、long、
    double)、对象引用(reference 类型)和 returnAddress 类型(指向了一条字节码指令的地址)
    StackOverflowError:线程请求的栈深度大于虚拟机所允许的深度。
    OutOfMemoryError:如果虚拟机栈可以动态扩展,而扩展时无法申请到足够的内存。

    本地方法栈
    区别于 Java 虚拟机栈的是,Java 虚拟机栈为虚拟机执行 Java 方法(也就是字节码)服务,
    而本地方法栈则为虚拟机使用到的 Native 方法服务。也会有 StackOverflowError 和
    OutOfMemoryError 异常。

    Java 堆
    对于绝大多数应用来说,这块区域是 JVM 所管理的内存中最大的一块。线程共享,主要是
    存放对象实例和数组。内部会划分出多个线程私有的分配缓冲区(Thread Local Allocation
    Buffer, TLAB)。可以位于物理上不连续的空间,但是逻辑上要连续。
    OutOfMemoryError:如果堆中没有内存完成实例分配,并且堆也无法再扩展时,抛出该异常。

    方法区
    属于共享内存区域,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的
    代码等数据。

    上一张全的图:
    在这里插入图片描述

    展开全文
  • JAVA运行时数据区域

    2017-04-12 20:22:53
    JAVA运行时数据区域分为:①、方法区(Method Area);②、虚拟机栈(VM Stack);③、本地方法栈(Native Method Stack);④、堆(Heap);⑤、程序计数器(Program Counter Register);  其中,虚拟机栈、本地...
      
       JAVA运行时数据区域分为:①、方法区(Method Area);②、虚拟机栈(VM Stack);③、本地方法栈(Native Method Stack);④、堆(Heap);⑤、程序计数器(Program Counter Register);
         其中,虚拟机栈、本地方法栈、程序计数器是线程隔离的数据区,方法去和堆是由所有线程共享的数据区
         
         ①、方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。Java虚拟机把方法区描述为堆的一个逻辑部分,但它的另一别名是Non-Heap,目的是与Java堆区分开来。        
                运行时常量池是方法区的一部分,Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容在类加载后进入方法区的运行时常量池中存放。
     
         ②、虚拟机栈:虚拟机栈是线程私有的,它的生命周期与线程的相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行时都会创建一个栈帧(Stack Frame),用于存储局部变量表、操作数栈、动态链接、方法出口等信息。一个方法从调用到执行完成,就对应一个栈帧在虚拟机栈中从入栈到出栈。
               局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、long、float、double)、对象引用(reference类型,注意,它不等同于对象本身,可能是一个指向对象起始地址的指针,也可能是指向一个代表此对象的句柄或者其他与此对象相关的位置)和returnAddress类型(指向了一条字节码指令地址)

         ③、本地方法栈:与虚拟机栈很相似,只不过虚拟机栈是为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈是为虚拟机使用到的Native方法服务。

         ④、堆:堆是Java虚拟机所管理的内存中最大的一块。是被所有线程共享的一个内存区域,在虚拟机启动时创建。唯一目的就是存放对象实例,几乎所有的对象都在这里分配内存。Java堆是垃圾收集器管理的主要区域,因此很多时候堆也被称作“GC堆”。

         ⑤、程序计数器:是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选择下一条需要执行的字节码指令。每一个线程都有一个程序计数器,互不干扰。
    展开全文
  • Java运行时数据区域划分JavaJVM内存堆栈1、 概述对于Java程序员来说,在虚拟机自动内存管理机制下,不容易出现内存泄漏和内存溢出现象。但如果不了解虚拟机是如何使用内存的,一旦出现了内存泄漏和溢出方面的问题,...

    Java运行时数据区域划分

    Java

    JVM

    内存

    1、 概述

    对于Java程序员来说,在虚拟机自动内存管理机制下,不容易出现内存泄漏和内存溢出现象。但如果不了解虚拟机是如何使用内存的,一旦出现了内存泄漏和溢出方面的问题,那么排错就无从下手了。

    2、 运行时数据区域

    Java虚拟机在执行Java程序的过程中会将它所管理的内存划分为若干个不同的数据区域,如下图所示。

    cd1bb3ee87d0a571162f90efe8f0a255.png

    2.1、 程序计数器

    程序计数器(Program Counter Register):是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。(虚拟机的概念模型中,字节码解释器依靠程序计数器的值来选择下一条需要执行的字节码指令)

    为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各线程之间计数器互不影响独立储存。由上图也可知程序计数器为线程隔离的数据区。

    若线程执行Java方法: 程序计数器记录的是正在执行的虚拟机字节码指令的地址。

    若执行Native方法: 计数器值为空

    2.2、 Java虚拟机栈

    与程序计数器一样Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同。

    Java虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行时都会创建一个栈帧(Stack Frame)。每个方法从调用直至执行完成的过程中,就对应一个栈帧从Java虚拟机栈中入栈到出栈的过程。

    栈帧(Stack Frame):用于储存局部变量表,操作数栈,动态链接,方法出口等信息。

    局部变量表:局部变量表中存放了编译器可知的各种基本数据类型(boolean,byte,int...etc)、对象引用和 returnAddress 类型。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在栈中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。

    在Java虚拟机规范中对Java虚拟机栈区域规定了二种异常:

    若线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常。

    如果当前Java虚拟机栈可以动态扩展,如果扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。

    2.3、 本地方法栈

    本地方法栈(Native Method Stack)与Java虚拟机栈作用相似。Java虚拟机栈为Java方法(也就是字节码)服务。本地方法栈则为虚拟机使用到的Native方法服务。

    在虚拟机规范中对本地方法栈中方法使用的语言、使用方式、数据结构并没有强制规定,因此具体的虚拟机可以自由实现它。例如:Sun HotSpot虚拟机直接就把虚拟机栈与本地方法栈合二为一。

    抛出的异常同Java虚拟机栈一样。

    2.4、 Java堆

    一般来说Java堆是Java虚拟机所管理的内存中最大的一块。Java堆(Java Heap)是被所有线程共享的一块内存区域,在虚拟机启动时创建。

    Java虚拟机规范对Java堆的描述是:

    所有的对象及数组都要在堆上分配内存(随着技术的发展这一点也不那么“绝对”了)。

    Java堆可以处在物理上不连续的内存空间中,只要逻辑上是连续的即可。

    当前主流的虚拟机对Java堆都是按照可扩展来实现的,如果在堆中没有内存可供实例完成分配,并且堆也无法在扩展时,将会抛出OutOfMemoryError异常。

    2.5、 方法区

    方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,用于储存已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

    Java虚拟机规范对堆的描述为:

    方法区是堆的一个逻辑部分,有一个别名Non-Heap(非堆),目的应该是与Java堆区分开来。

    方法区和堆一样不需要连续的内存和可扩展外,还可以不实现垃圾收集。

    当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。

    2.6、 运行时常量池

    运行时常量池(Runtime Constant Poll)是方法区的一部分。

    Class文件中包含了类的版本、字段、方法、接口等描述信息外还包含常量池(Costant Pool Table)——用来存放在编译期间生成的各种字面量和符号引用。这部分内容将在类加载后再进入方法区的运行时常量池中存放。

    Java虚拟机对Class文件的每一部分(包括常量池)的格式都有严格的规定,必须符合规范才能被虚拟机认可、装载和执行。但对于运行时常量池,Java虚拟机规范没有做任何细节要求,不同的虚拟机可以有不同的实现,但一般来说,除了保存Class文件中的符号引用外,还会把翻译出来的直接引用也保存在运行时常量池中。

    运行时常量池相对于Class文件常量池来说具有一个重要特征——动态性,并非只有预置入Class文件常量池的内容才能进入运行时常量池,运行期间也可以将新的常量放入运行时常量池中。(这种特性运用比如String类的intern()方法)

    运行时常量池是方法区的一部分,所以受到方法区内存的限制,当常量池无法再申请到内存时将抛出OutOfMemoryError异常。

    展开全文
  • java 运行时数据区域

    2020-06-12 14:52:36
    程序计数器, 虚拟机栈, 本地方法栈, java堆, 方法区(运行时常量池),直接内存 程序计数器: (jvm内存区域中唯一不会OOM) 指向当前线程正在执行的字节码指令单地址 虚拟机栈: 局部变量表 操作数栈 动态连接 ...
  • Java 运行时数据区域

    2018-12-08 18:46:00
    1 概述 对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题。...2 运行时数据区域 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,494
精华内容 3,397
关键字:

java运行时数据区域

java 订阅