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

    2017-11-09 19:12:03
    Java虚拟机在执行Java程序的过程中会把它所管理内存划分为若干个不同的数据区域。 1.程序计数器:是一块较小内存空间。字节码解释器工作就是通过改变这个计数器值来选择下一条需要执行字节码指令,分支、...

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

    1.程序计数器:是一块较小的内存空间。字节码解释器工作时就是通过改变这个计数器的值来选择下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等。在任何一个确定的时刻,一个处理器都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器。所以程序计数器是“线程私有”的内存区域。

    2.Java虚拟机栈:Java虚拟机栈也是线程私有的。每个方法在执行时,都会创建一个线帧用于储存局部变量表、操作数栈、动态链接、方法出口等信息。每个方法从调用直至执行完成的过程,对应着一个线帧在虚拟机中入栈到出栈的过程。

    3.本地方法栈:与Java虚拟机栈所发挥的作用相似。Java虚拟机栈为虚拟机栈执行Java方法服务,而本地方法栈为Native方法服务。

    4.Java堆:是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块区域,几乎所有的对象实例都在这里分配内存

    5.方法区:它用于储存已被虚拟机加载的类信息、常量、静态变量、编译器编译后的代码等。是线程共享的。

    6.运行时常量池:是方法区的一部分,用于存放编译期生成的各种字面量和符号引用。

         

    举个栗子:

     

    x在包装类型时,初始化赋值为null。在基本数据类型赋值时为0。


    展开全文
  • 一、Java运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理内存划分为多个数据区域,有区域区域随着虚拟机进程启动而一直存在,有些则是随着用近乎线程启动和结束而建立和销毁。 (1)程序...
    一、Java运行时数据区域

    Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为多个数据区域,有的区域区域随着虚拟机进程的启动而一直存在,有些则是随着用近乎线程的启动和结束而建立和销毁。

    (1)程序计数器

    程序计数器可以看作是当前线程所执行的字节码行号指示器,也是程序控制流的指示器,用来完成分支,循环,跳转,异常处理,线程恢复等基础操作,每条线程都有自己独立的程序计数器,所以称它为线程私有。

    异常:该内存区域是唯一一个《Java虚拟机规范》中没有规定任何OutOfMemoryError情况的区域。

    (2)Java虚拟机栈

    Java虚拟机描述的是Java方法执行的线程内存模型:每个方法大被执行的时候,Java虚拟机都会同步创建一个栈帧用于储存局部变量表,操作数栈,动态连接,方法出口等信息。每个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机中入栈出栈的过程。并且它也是线程私有的,生命周期与线程相同。

    异常:

    1 . 线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;
    2 . 如果Java虚拟机栈容量可以动态扩展,当栈扩展是无法申请到足够的内存是会抛出OutOfMemoryError异常;

    (3)本地方法栈

    本地方法栈与虚拟机栈发挥的作用非常的相似,其区别在于虚拟机栈为虚拟机执行的Java方法(字节码)服务,而本地方法栈则是为虚拟机使用到的本地方法(Native)服务,由于《Java虚拟机规范》并没有对本地方法栈中方法使用的语言,使用方式与数据结构进行强制规定,所以虚拟机可以根据需要自由实现它,甚至有些Java虚拟机( HotSpot )可以把本地方法栈和虚拟机栈合二为一。

    异常:

    1 . 线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;
    2 . 如果Java虚拟机栈容量可以动态扩展,当栈扩展是无法申请到足够的内存是会抛出OutOfMemoryError异常;

    (4)Java堆

    Java堆是被所有线程所共享的一块内存区域,用来存放对象实例以及数组的内存区域,是虚拟机所管理的内存最大的一块,并且可以处于物理上不连续的内存空间,但是逻辑上应该是被视为连续的。

    异常:如果在Java堆中没有完成实例分配,并且堆也无法再扩展时,Java虚拟机将会抛出OutOfMemoryError异常。

    (5)方法区

    方法区是各个线程共享的一块区域,它用来储存被虚拟机加载过的类型信息,常量,静态变量,即时编译器编译后的代码缓存等数据。别名为“ 非堆 ”,除了和Java堆一样不需要连续的内存和可以选择固定大小或者可扩展外,甚至还可以选择不进行垃圾回收。

    异常:如果方法去无法满足新的内存分配需求时,将抛出OutOfMemoryError异常;

    (6)运行时常量

    是方法区的一部分,常量池表用来存放编译器生成的各种字面量与符号应用,这部分内容将在类加载后存放到方法区的运行时常量池中。除了保存Class文件中描述的符号引用外还会把由符号引用翻译出来的直接引用也储存在运行时常量池中。

    异常:当常量池中无法申请到内存时会抛出OutOfMemoryError。

    展开全文
  • java虚拟机章执行java程序的过程中会把它所管理内存划分为若干个不同的数据区域,这些区域都有各自用途。 1、程序计数器(线程私有 程序计数器是一块较小 内存区域,它可以看做是当前线程所执行字节码...

    java虚拟机章执行java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途。

    1、程序计数器(线程私有

    程序计数器是一块较小的 内存区域,它可以看做是当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理等基础功能都需要依赖这个计数器来完成。

    因为处理器在一个确定是时刻只会执行一个线程中的指令,线程切换后,是通过计数器来记录执行痕迹的,因而可以看出,程序计数器是每个线程私有的。

     

      如果执行的是java方法,那么记录的是正在执行的虚拟机字节码指令的地址的地址,如果是native方法,计数器的值为

    空(undefined)。

    而且这个区域是java虚拟机规范中唯一一个没有规定任何OutOfMemoryError情况的区域

    2、java虚拟机栈(线程私有,生命周期与线程相同

    虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口灯信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机中入栈到出栈的过程。

    • 局部变量表:
      • 存放编译期可知的各种基本数据类型、对象引用类型和returnAddress类型(指向一条字节码指令的地址:函数返回地址)。
      • 局部变量表所需的内存空间在编译期确定,当进入一个方法时,方法在栈帧中所需要分配的局部变量控件是完全确定的,不可动态改变大小。
      • 异常:线程请求的栈帧深度大于虚拟机所允许的深度---StackOverFlowError,如果虚拟机栈可以动态扩展(大部分虚拟机允许动态扩展,也可以设置固定大小的虚拟机栈),但是无法申请到足够的内存---OutOfMemorError。
    • 操作数栈:

      • 后进先出LIFO,最大深度由编译期确定。栈帧刚建立使,操作数栈为空,执行方法操作时,操作数栈用于存放JVM从局部变量表复制的常量或者变量,提供提取,及结果入栈,也用于存放调用方法需要的参数及接受方法返回的结果。
      • 操作数栈可以存放一个jvm中定义的任意数据类型的值。
      • 在任意时刻,操作数栈都一个固定的栈深度,基本类型除了long、double占用两个深度,其它占用一个深度
    • 动态连接:

            每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接。Class文件的常量池中存在有大量的符号引用,字节码中的方法调用指令就以常量池中指向方法的符号引用为参数。这些符号引用,一部分会在类加载阶段或第一次使用的时候转化为直接引用(如final、static域等),称为静态解析,另一部分将在每一次的运行期间转化为直接引用,这部分称为动态连接。

    • 方法返回地址:
      • 当一个方法被执行后,有两种方式退出该方法:执行引擎遇到了任意一个方法返回的字节码指令或遇到了异常,并且该异常没有在方法体内得到处理。无论采用何种退出方式,在方法退出之后,都需要返回到方法被调用的位置,程序才能继续执行。方法返回时可能需要在栈帧中保存一些信息,用来帮助恢复它的上层方法的执行状态。一般来说,方法正常退出时,调用者的PC计数器的值就可以作为返回地址,栈帧中很可能保存了这个计数器值,而方法异常退出时,返回地址是要通过异常处理器来确定的,栈帧中一般不会保存这部分信息。
      • 方法退出的过程实际上等同于把当前栈帧出栈,因此退出时可能执行的操作有:恢复上层方法的局部变量表和操作数栈,如果有返回值,则把它压入调用者栈帧的操作数栈中,调整PC计数器的值以指向方法调用指令后面的一条指令。  

    3、本地方法栈

    本地方法栈和虚拟机栈的作用非常类似,区别是虚拟机栈执行java方法,本地方法栈执本地方法(Native声明的非java语言的方法)。有的虚拟机(例如Sun HotSpot)将本地方法栈和虚拟机方法栈合二为一。本地方法栈也会抛出StackOverflowError和OutOfMemoryError异常。

    4、java堆(所有线程共享)

    堆是虚拟机所管理的内存中区域最大的一块,在虚拟机启动时创建,此内存区域的唯一目的就是存放实例对象,几乎所有的对象的实例都在这里分配。

    java堆也是垃圾收集器管理的主要区域,因此很多时候也被成为 “GC堆” 。根据java虚拟机规范,堆可以是连续的物理内存,也可以是不连续的物理内存,只要逻辑上连续即可。堆在实现时,既可以是固定大小的,也可以是可扩展的。如果堆中没有足够内存来完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。

    5、方法区(所有线程共享)

    方法区主要用于存储已经被虚拟机加载的类信息、常量、静态变量等数据。在HotSpot虚拟机上又被叫做 “ 永久代 ”,是以为HotSpot虚拟机设计团队把GC分带收集扩展至方法区,或者说是用永久代实现了方法区,这样垃圾收集器可以想管理java堆一样来管理这部分内存。

    同样,当方法区也无法再扩展时,将会抛出OutOfMemoryError异常。

    6、运行时常量池

    运行时常量池,也是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等信息外,还有一个区域是常量池,用于存放编译期间生成的各种字面量和符号的引用,在类加载后,在方法区的常量池存放。

    常量池是方法区的一部分,所以同样,当无法再扩展时,将会抛出OutOfMemoryError异常。

    7、直接内存、

    直接内存并不是虚拟机运行时数据区的一部分,也不是java虚拟机规范中的内存区域。

    在jdk 1.4中引入了NIO(New I/O)一种基于通道和缓冲区(Buffer)的IO方式,它可以使用Native函数库直接分配堆外内存,然后通过一些存储在java堆中的对象作为这块内存区域的引用来进行操作。

    直接内存会受到本机内存的限制,会抛出OutOfMemoryError异常。

    展开全文
  • 每个区域都有各自用途,创建和销毁时间,按照《java虚拟机规范(Java SE 7 版)》规定,虚拟机运行时数据区域主要有以下几种: 1.程序计数器 程序计数器是很小一块内存区域,可以看做是当前线程所执行字节...

    java虚拟机在执行java程序的过程中,会把内存划分为若干个不同的数据区域。每个区域都有各自的用途,创建和销毁时间,按照《java虚拟机规范(Java SE 7 版)》的规定,虚拟机运行时数据区域主要有以下几种:

    1.程序计数器

    程序计数器是很小的一块内存区域,可以看做是当前线程所执行字节码的行号指示器。在虚拟机的概念模型中,字节码解释器工作时就是通过改变程序计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能均依赖于程序计数器。在多线程中,每个线程都有一个独立的程序计数器,每个线程的程序计数器之间互不影响,即“线程私有”。同时,程序计数器是java虚拟机规范中唯一一个没有规定OutOfMemoryError的区域。

    2.java虚拟机栈

      虚拟机栈描述的是java方法执行的内存模型,每个方法在执行时候都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每个方法从被调用执行到执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。虚拟机栈也是线程私有的。在Java虚拟机规范中,虚拟机栈有两种异常状况:

    (1)线程请求的栈深度大于虚拟机栈所允许的深度,将抛出StackOverflowError异常;

    (2)如果虚拟机栈可以动态扩展,但扩展时无法申请到足够的内存,或者在创建新线程时候没有足够的内存去创建虚拟机栈,就会抛出OutOfMemoryError异常。

    3.本地方法栈

    本地方法栈和虚拟机栈的作用类似,区别在于java虚拟机栈支持Java方法执行,而本地方法栈则支持native方法执行。有些虚拟机直接将java虚拟机栈和本地方法栈合二为一,本地方法栈的异常情况与java虚拟机栈的内存一致,即:

    (1)线程请求的栈深度大于本地方法栈所允许的深度,将抛出StackOverflowError异常;

    (2)如果本地方法栈可以动态扩展,但扩展时无法申请到足够的内存,或者在创建新线程时候没有足够的内存去创建本地方法栈,就会抛出OutOfMemoryError异常。

    4.java堆

    java堆是Java虚拟机所管理的内存中最大的一块,它是被所有线程所共享的内存区域,在虚拟机启动时候创建。java堆是供所有类实例和数组分配内存的区域,也是垃圾收集器管理的主要区域,因此很多时候也被称为“GC堆”。从内存回收的角度来看,由于收集器基本都采用分代收集算法,所以Java堆还可以细分为新生代(Young Gen)和老年代(Old Gen)。新生代又可以继续分为Eden空间,From Survivor空间,To Survivor空间。如下图:

    Java堆的大小可以是固定的,也可以是随着程序执行动态扩展,并在不需要过多空间时候自动收缩。且Java堆所使用的内存不需要保证是连续的。如果实际所需的堆超过了自动内存管理系统所能提供的最大容量,java虚拟机将会抛出一个OutOfMemoryError异常。

    Java堆常用调节参数:

    -Xms128M :设置初始堆大小为128M
    -Xmx512M :设置最大堆大小为512M
    -XX:NewSize=n :设置年轻代大小;
    -XX:NewRatio=n :设置年轻代和年老代的比值,如设置为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代的1/4;
     -XX:SurvivorRatio=n :年轻代中Eden区与两个Survivor区的比值(年轻代分成1个Eden Space和2个Suvivor Space),如设置为3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5;

    5.方法区

    方法区和java堆一样,是所有线程共享的内存区域。它存储了每一个类的结构信息,例如运行时常量池,字段和方法数据,构造函数和普通方法的字节码内容,还包括一些在类,实例,接口初始化时用到的特殊方法。由于HotSpot虚拟机设计团队将GC分代扩展到了方法区,或者说使用“永久代”来实现方法区,这样HotSpot的垃圾收集器就可以像管理Java堆那样来管理方法区内存,故很多人将方法区称为永久代,但本质上两者不是等价的(Java8中,HotSpot对于方法区的实现从永久代变更为元空间Metaspace)对于其他虚拟机(如BEA JRockit,IBM J9等)而言是不存在永久代的。按照java虚拟机规范,当方法区不能满足内存分配请求时,java虚拟机将抛出OutOfMemoryError异常。

    方法区常用调节参数:

    java8之前(设置永久代):

    -XX:PermSize=64M  :设置持久代初始大小
    -XX:MaxPermSize=128M  :设置持久代最大允许分配大小。

    java8之后(设置元空间): 

    -XX:MetaspaceSize=8M :设置元空间大小为8M
    -XX:MaxMetaspaceSize=80M :设志元空间最大为80M
    -XX:MinMetaspaceFreeRatio=n :当进行过Metaspace GC之后,会计算当前Metaspace的空闲空间比,如果空闲比小于这个参数,那么虚拟机将增长Metaspace的大小。默认值为40,也就是40%
    -XX:MaxMetasaceFreeRatio=n :当进行过Metaspace GC之后, 会计算当前Metaspace的空闲空间比,如果空闲比大于这个参数,那么虚拟机会释放Metaspace的部分空间。默认值为70,也就是70%
    -XX:MaxMetaspaceExpansion=n :设置Metaspace增长时的最大幅度
    -XX:MinMetaspaceExpansion=n :设置Metaspace增长时的最小幅度

    6.运行时常量池

        运行时常量池是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池表(Constant Pool Table),用于存放编译期生成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。

        运行时常量池相当于Class文件常量池的另外一个重要特征是具备动态性,java语言并不要求常量一定只有编译期才能产生,也就是说,并非预置入Class文件中常量池的内容才能进入方法区运行时常量,运行期间也可以将新的常量放入池中,这种特殊性被开发人员利用得比较多的便是String类的intern()方法。

        如果构造运行时常量池所需要的内存空间超过了方法区所能提供的最大值,Java虚拟机就会抛出一个OutOfMemoryError异常。

    https://www.cnblogs.com/fengweiweicoder/p/10779058.html

     

    展开全文
  • Java虚拟机在执行Java程序的过程中会把它所管理内存划分为若干个不同的数据区域。 一、程序计数器 程序计数器(Program Counter Register)是一块较小内存空间,它可以看作是当前线程所执行字节码行号...
  • 运行时数据区域划分1、程序计数器2、Java 虚拟机栈3、本地方法栈 Java虚拟机在执行Java程序的过程中会把它所管理内存划分为若干个不同数据区域。这些区域都有各自用途,以及创建和销毁时间,有区域随着...
  • 运行时数据区域

    2018-11-06 17:45:05
    Java虚拟机在执行java程序的过程中会把它所管理内存划分为若干个不同的数据区域。如下图所示: 1、程序计数器  程序计数器是一块较小内存空间,它可以看作是当前线程所执行字节码行号指示器。  特点...
  • 1、Java虚拟机在执行java程序过程中,会把它管理【内存】划分为若干个不同数据区域】。 2、主要有以下【数据区域】:【方法区】,【堆】,【虚拟机栈】,【本地方法栈】,【程序计数器】。 3、程序计数器:是...
  • java虚拟机在执行java程序的过程中会把它所管理内存划分成若干个不同的数据区域。jdk8以后,大体内存划分如下。 程序计数器 一块很小内存空间,线程私有,存储当前线程下一条要运行的字节码指令行号 执行...
  • jvm规范在运行java程序的过程会把它管理的区域分为若干区域(度娘图); 程序计数器(线程私有)*:* 是一块较小内存空间,可以看做当前线程所执行字节码行号指示器;字节码解释器作用就是通过改变...
  • JVM之运行时数据区域

    2017-04-29 15:14:16
    Java虚拟机在执行java程序过程中会把它所管理内存划分为若干不同的数据区域。 线程独占区程序计数器 Program Counter Register:空间较小,作用可以看成是当前线程所执行字节码信号指示器。 字节码解释器...
  • 主要包括以下几个运行时数据区域。 1、程序计数器(Program Counter Register) 程序计数器是一块很小内存空间,它可以看作是当前线程所执行字节码行号指示器。在虚拟机概念模型里,字节码解释器工作时就是...
  • Java虚拟机概念中,运行时数据区又被称为Java内存区域。主要由线程私有程序计数器、虚拟机栈和本地方法栈以及线程共享堆和方法区组成。 程序计数器 程序计数器在Java内存中占据空间比较小,是当前线程...
  • Java虚拟机在执行Java程序的过程中会把它所管理内存划分为若干各不同的数据区域。程序计数器:当前线程所执行字节码行号指示器。字节码解释器工作就是通过改变这个计数器值来选取下一条需要执行字节码...
  • Java虚拟机概念中,运行时数据区又被称为Java内存区域。主要由线程私有程序计数器、虚拟机栈和本地方法栈以及线程共享堆和方法区组成。程序计数器程序计数器在Java内存中占据空间比较小,是当前线程正在...
  •  Jvm在执行Java程序过程中会把它所管理内存划分为若干个不同的数据区域,运行时候区域主要包含以下几个方面。 1. 程序计数器   程序计数器(Program Counter Register)是一块较小内存空间,可以看作是当前...
  • JVM运行时数据

    2020-11-29 16:07:30
    Java内存区域与内存溢出异常 C,C++开发中是将内存管理交给程序员,而Java中JVM虚拟机实现类内存自动管理,这使得Java开发 过程中不至于过多关注内存管理,同时对于内存...运行时数据区域 1.程序计数器 程序计
  • JVM运行时内存区域

    2018-07-08 19:40:28
    Java虚拟机在执行Java程序的过程中会把它所管理内存划分为若干个不同的数据区域:程序计数器: 是一块较小内存空间,它可以看做是当前线程所执行字节码行号指示器,字节码解释器工作就是通过改变这个...
  • Java内存区域

    2016-11-02 16:21:26
    Java虚拟机在执行Java程序的过程中会把它所管理内存区域划分为若干个不同数据区域,称为运行时数据区域,包括程序计数器、Java虚拟机栈、本地方法栈、Java堆和方法区,如下图所示。        程序计数器: ...
  • 在JVM运行时,类加载器ClassLoader在加载到类字节码后,交由jvm执行引擎处理, 执行过程中需要空间来存储数据(类似于Cpu及主存),此时这段空间分配和释放过程是 此处需要关心和理解,暂可以称为运行时.....
  • 在JVM运行时,类加载器ClassLoader在加载到类字节码后,交由jvm执行引擎处理, 执行过程中需要空间来存储数据(类似于Cpu及主存),此时这段空间分配和释放过程是 此处需要关心和理解,暂可以称为运行时.....
  • java内存区域

    2020-09-29 10:16:42
    文章目录java内存区域运行时数据区域程序计数器虚拟机栈本地方法栈堆方法区运行时常量池直接内存java对象创建的过程(五步)对象访问定位两种方式(句柄和直接指针两种方式) java内存区域 运行时数据区域 线程...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 129
精华内容 51
关键字:

java运行时数据区域的处理过程

java 订阅