JVM—运行时数据区域

目录

1.运行时数据区域概述

2.具体内容

2.1 线程共享的数据区

 2.1.1 方法区

  2.1.1.1 运行时常量池

 2.1.2 堆

2.2 线程独享的数据区

 2.2.1 程序计数器

 2.2.2 虚拟机栈

 2.2.3 本地方法栈


1.运行时数据区域概述

      Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域。
这些区域 有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是 依赖用户线程的启动和结束而建立和销毁。

2.具体内容

Java虚拟机所管理的内存将会包括以下几个运行时数据区域
JVM—运行时数据区域_第1张图片

2.1 线程共享的数据区

 2.1.1 方法区

存储已被虚拟机加载 的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。
与“永久代”并不等价
到了JDK 7 HotSpot ,已经把原本放在永久代的字符串常量池、静态变量等移出,而到了
JDK 8 ,终于完全废弃了永久代的概念,改用与 JRockit J9 一样在本地内存中实现的元空间( Meta- space)来代替,把 JDK 7 中永久代还剩余的内容(主要是类型信息)全部移到元空间中。

  2.1.1.1 运行时常量池

 运行时常量池是方法区的一部分。

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

具有动态性,可自动申请空间。

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

运行时常量池是方法区的一部分,自然也受到方法区的内存限制,当常量池无法再申请到内存空间是会抛出OutOfMemoryErro异常。

 2.1.2 堆

Java 堆是被所 有线程共享的一块内存区域
存放对象实例, Java 世界里“ 几乎 所有的对象实例都在这里分配内存。(有一些对象可能被分配到栈上)
java堆是垃圾收集器管理的内存区域。
从分配内存的角度看,所有的线程共享的Java堆中可以划分出多个线程私有发分配缓冲区,将Java堆细分的目的只是为了更好的回收内存,或者更快的分配内存

也会内存移除

物理上不连续,逻辑上连续

2.2 线程独享的数据区(不会有垃圾回收)

 2.2.1 程序计数器

是一块较小的内存空间,程序运行过程中指向下一行该运行谁了,

它是程序控制流的指示器,分支、循环、跳转、异常处 理、线程恢复等基础功能都需要依赖这个计数器来完成。

单核cpu多线程中为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器。相互之间不影响,独立内存。

 2.2.2 虚拟机栈

伴随java程序执行的产物,

每个方法被执行的时候, Java 虚拟机都 会同步创建一个栈帧 (Stack Frame)用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程
可以存放所有基本类型数据,对象引用(reference类型)和returnAddress类型(指向了一条字节码指令的地址)。
java虚拟机栈可以动态扩展,向内存进行申请。如果申请不到就会抛出StackOverflowError异常(HotSpot 虚拟机的栈容量是不可以动态扩展的,其他的可以)

 2.2.3 本地方法栈

本地方法栈为虚拟机使用到的本地(Native ) 方法服务。

你可能感兴趣的:(java虚拟机:JVM,java,开发语言)