0
点赞
收藏
分享

微信扫一扫

JVM分为哪几部分?

秀妮_5519 2022-04-19 阅读 46
java后端

JDK1.8之前:
在这里插入图片描述
JDK1.8之后:
在这里插入图片描述
在这里插入图片描述

各个区域的作用:

1.2.2.1 程序计数器
  • 字节码解释器通过改变程序计数器来依次读取指令,从实现代码的流程控制,如:顺序执、选择、循环、异常处理。

  • 在多线程的情况下,程序计数器于记录当前线程执的位置,从当线程被切换回来的时候能够知道该线程上次运到哪了

1.2.2.2 Java虚拟机栈

它的生命周期和线程相同,随着线程的创建而创建,随着线程的死亡而死亡。每次方法调用的数据都是通过栈传递的。

  • Java栈就好比数据结构中的栈,Java栈中保存的是栈帧,每一次函数调用都会有一个对应的栈帧压入Java栈,调用结束后栈帧就会弹出
1.2.2.3 本地方法栈

和Java虚拟机栈相似。区别:虚拟机栈为虚拟机执 Java 法 (也就是字节码)服务,本地法栈则为虚拟机使到的 Native 法服务。

1.2.2.4 堆

Java虚拟机启动的时候创建。用途: 存放对象实例。

几乎所有的对象实例和数组都在堆上面分配内存。但是JDK1.7之后默认开启逃逸分析 (如果某些法中的对象引没有被
返回或者未被外使(也就是未逃逸出去),那么对象可以直接在栈上分配内存)。

在这里插入图片描述

JDK8开始,Hotspot的永久代被彻底移除,取而代之的是元空间

1.2.2.5 方法区

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

1.2.2.6 运行时常量池

Java常量池中存储的对象的引用,实际上对象还是存储在Java堆上的。

1.2.2.7 直接内存

直接内存并不是虚拟机运时数据区的部分,也不是虚拟机规范中定义的内存区域,但是这部分内存也被频繁地使。且也可能导致 OutOfMemoryError 错误出现 。

参考:SnailClimb&JavaGuide

举报

相关推荐

0 条评论