JVM运行时数据区

 JVM运行时数据区

运行时数据区:程序计数器,java虚拟机栈,本地方法栈,java堆,方法区

其中红色为线程隔离的数据区,蓝色为线程共享的数据区。方法区还包括:运行时常量池。

虚拟机内存模型:程序计数器,java虚拟机栈,本地方法栈,java堆,方法区,运行时常量池,直接内存

直接内存不属于运行时数据区。

程序计数器

内存空间小,字节码解释器工作时通过改变这个计数值可以选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理和线程恢复等功能都需要依赖这个计数器完成。

由于java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,所以,为了线程切换后能恢复到正确的执行 位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,所以我们说,它是线程私有的. 

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

该内存区域是唯一一个java虚拟机规范没有规定任何 OutOfMemoryError情况的区域。

虚拟机栈

线程私有,生命周期和线程一致。虚拟机栈也就是我们平常所称的栈内存,它为java方法服务,每个方法在执行的时候都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接和方法出口等信息。 

在编译程序代码的时候,栈帧中需要多大的局部变量表,多深的操作数栈都已经完全确定了,因此一个栈帧需要分配多少内存,不会 受程序运行时期变量数据的影响。

局部变量表: 局部变量表是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量,

操作数栈:操作数栈的作用主要用来存储运算结果以及运算的操作数,它不同于局部变量表通过索
引来访问,而是压栈和出栈的方式

每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接.动态链接就是将常量池中的符号引用在运行期转化为直接引用。 

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

本地方法栈

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

java堆是所有线程所共享的一块内存,在虚拟机启动时创建,几乎所有的对象实例都在这里创建,因此该区域经常发生垃圾回收操作。对于绝大多数应用来说,这块区域是 JVM 所管理的内存中最大的一块。

堆空间可以细分为:新生代(年轻代),老年代(年老代).再细致一点,新生代可以分为Eden空间,From Survivor 空间, To Survivor 空间。

jdk<=7字符串常量池已经在堆中了。

方法区

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

垃圾收集行为在这个区域是比较少出现的,但并非数据进入了方法区就如永久代的名字一样“永久” 存在了。这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载。

无法满足内存分配需求时也会抛出OutOfMemoryError。

HotSpot使用永久代实现方法区,又叫Perm区,jdk8中已经彻底移除了永久带,jdk8中引入了一个新的内存区域叫metaspace(元空间)。永久带或者是metaspace是对方法区的不同实现,方法区是JVM规范。元空间使用的是本地内存,永久代使用的是jvm内存。

运行时常量池:运行时常量池属于方法区的一部分,用于存放静态编译产生的字面量和符号引用。该常量具有动态性,也就是说常量并不一定是编译时确定,运行时生成的常量也会存在这个常量池中。 

直接内存

非虚拟机运行时数据区的部分. 在 JDK 1.4 中新加入 NIO (New Input/Output) 类,引入了一种基于通道(Channel)和缓存(Buffer)的 I/O 方式,它可以使用 Native 函数库直接分配堆外内存,然后通过一个存储在 Java 堆中的 DirectByteBuffer 对象作为这块内存的引用进行操作。可以避免 在 Java 堆和 Native 堆中来回的数据耗时操作。

本机直接内存的分配不会受到java堆大小的限制,但是,既然是内存,肯定还是会受到本机总内存大小的限制.所以我们在配置虚拟 机参数时,不要忽略直接内存,否则可能因为动态扩展导致出现OutOfMemoryError。

直接内存申请空间耗费更高的性能。

直接内存IO读写的性能要优于普通的堆内存。比较参考https://www.cnblogs.com/xing901022/p/5243657.html


 

 


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值