java笔记JVM(java虚拟机)之JVM的组成部分及运行时数据区
Posted 棉花糖灬
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java笔记JVM(java虚拟机)之JVM的组成部分及运行时数据区相关的知识,希望对你有一定的参考价值。
1. JVM的组成部分及作用
- 类加载器(ClassLoader)
- 运行时数据区(Runtime Data Area)
- 执行引擎(Execution Engine)
- 本地库接口(Native Interface)
首先通过类加载器会把 Java 代码转换成字节码,运行时数据区再把字节码加载到内存中,而字节码文件只是 JVM 的一套指令集规范,并不能直接交个底层操作系统去执行,因此需要特定的命令解析器执行引擎,将字节码翻译成底层系统指令,再交由 CPU 去执行,而这个过程中需要调用其他语言的本地库接口来实现整个程序的功能。
2. 运行时数据区域
- 程序计数器:是当前线程所执行的字节码的行号指示。此内存区域是唯一一个在《Java虚拟机规范》中没有规定任何OutOfMemoryError情况的区域
- Java虚拟机栈:每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧用于存储局部变量表、操作数栈、动态连接、方法出口等信息。如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果Java虚拟机栈容量可以动态扩展,当栈扩展时无法申请到足够的内存会抛出OutOfMemoryError异常
- 本地方法栈:虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地方法服务。本地方法栈也会在栈深度溢出或者栈扩展失败时分别抛出StackOverflowError和OutOfMemoryError异常
- Java堆:Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例。如果在Java堆中没有内存完成实例分配,并且堆也无法再扩展时,Java虚拟机将会抛出OutOfMemoryError异常
- 方法区:是各个线程共享的内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。早期,HotSpot使用永久代来实现方法区,后放弃永久代,逐步改用本地内存来实现方法区,JDK8以后使用元空间来代替永久代。如果方法区无法满足新的内存分配需求时,将抛出OutOfMemoryError异常。
- 运行时常量池:是方法区的一部分,存放常量池表,用于存放编译期生成的各种字面量与符号引用。当常量池无法再申请到内存时会抛出OutOfMemoryError异常
直接内存:并不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域
可以把Java内存区域笼统地划分为堆内存和栈内存
以上是关于java笔记JVM(java虚拟机)之JVM的组成部分及运行时数据区的主要内容,如果未能解决你的问题,请参考以下文章
java笔记JVM(java虚拟机)之垃圾收集与内存分配策略