课程名称:Java架构师-技术专家
课程章节: 阶段六 · JVM性能调优-理论+工具篇
课程讲师: 慕课讲师团队
课程内容
JVM 内存结构
JVM 内存大致分为了五块区域 ,分别是堆(Heap)、虚拟机栈(Java Stack)、本地方法栈(Native Method Stack)、程序计数器(Program Counter Register)、方法区(Method Area)
所有线程都会共享堆内存和方法区;每个线程都会拥有自己独立的虚拟机栈、本地方法栈、程序计数器。
堆
堆是JVM内存中最大的一块存储空间 ,绝大部分对象都是保存在堆内存中的。
堆内存又做了细分,元空间并不是堆内存的一部分,而是本地内存。
元空间的大小取决于操作系统能够分配的内存大小,这样就解决了持久代空间难以分配的问题。
虚拟机栈
虚拟机栈是线程独享的 ,当创建一个线程的时候就会创建一个虚拟机栈。虚拟机栈由栈帧组成,每一次的方法调用都会创建一个栈帧,然后入栈,当方法返回的时候则对应着栈帧的出栈操作。
方法里面的代码在执行的时候会从局部变量表或者对象实例的字段里面复制变量或者是常量放到操作数栈里 ,当计算的时候会使用一系列的指令往操作数栈里面 放入数据或者取走数据进行计算,操作数栈是用来存放临时数据的地方。
本地方法栈
本地方法栈和虚拟机栈的功能是类似的,虚拟机栈管理 Java 方法 ,本地方法栈管理 Native 方法(本地方法都是由 C 语言去实现的)
程序计数器
程序计数器用来记录各个线程执行的字节码的地址,诸如 分支、循环、跳转、异常、线程恢复等等操作,都需要依赖程序计数器。由于Java 是多线程的语言,当执行的线程数量超过CPU核心的时候,线程之间就会根据时间片去争抢CPU资源,所以需要给每一个线程分配一个程序计数器,用来记录下一条要执行的指令是什么。
方法区
方法区并不是一个物理上的区域,而是一个逻辑上的划分
方法区也是多个线程共享的 ,主要包括四部分,类信息(静态常量池)、运行时常量池、字符串常量池、静态变量,方法区主要用来存放虚拟机加载的类相关的信息
常量池—静态常量池
也叫做class文件常量池,主要存放:
- 字面量:例如文本字符串、final修饰的常量
- 符号引用:例如类和接口的全限定名、字符的名称和描述符、方法的名称和描述符
常量池—运行时常量池
当类加载到内存中后,JVM 就会将静态常量池中的内容存放到运行时的常量池中;运行时常量池里面存储的主要是编译期间生成的字面量、符号引用等等。
常量池—字符串常量池
字符串常量池,可以理解为是运行时常量池中分出来的一部分,类加载到内存的时候,字符串,会存到字符串常量池里面。
方法区和堆之间是存在交集的,静态变量、字符串常量池存储在堆里;而类的相关信息以及运行时常量池存储在元空间里面
课程内容
今天学习了Java 内存结构的组成和各个组成部分的功能和作用。
共同学习,写下你的评论
评论加载中...
作者其他优质文章