JVM内存结构解析

文章目录

  • 1 JVM体系结构
    • 1.1 JVM 分为三个子系统
        • 1.1.1 类加载子系统
        • 1.1.2 运行时数据区(内存结构)
        • 1.1.3 执行引擎
  • 2 程序计数器
  • 3 虚拟机栈
      • 3.2 栈帧
    • 3.3栈内存的溢出
  • 4 本地方法栈
  • 5 堆 Heap
      • 5.2 堆内存回收
  • 6 方法区

1 JVM体系结构

Jvm 简介

Java Virtual Machine 
有自己指令集  运行时内存区域
JVM只能运行.class文件  Scala也可以由JVM编译执行

JC日志

解决Java崩溃
内存溢出等

1.1 JVM 分为三个子系统

1.1.1 类加载子系统

JVM内存结构解析_第1张图片

1 加载
	将.calss从磁盘读到内存
2.链接
	2.1 验证 : 验证字节码文件正确
	2.2 准备 给类的静态变量分配内存 赋予默认值
	2.3 解析 装入类里面用到的类(静态链接)
3 初始化
	类的静态变量赋予值, 上述准备阶段为静态变量赋予的是虚拟机默认的初始值 ,此处赋予的才是java写的真正的初始值 执行静态代码块

JVM内存结构解析_第2张图片

1.1.2 运行时数据区(内存结构)

1.1.3 执行引擎

2 程序计数器

作用:保存当前执行指令的地址,一旦指令执行,更新到吓一条指令

3 虚拟机栈

可以理解为线程的内存空间 私有的
每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存
每个线程只能有一个栈帧,对应当前正在执行的那个方法

3.2 栈帧

  • 局部变量表
存放局部变量的列表

一个局部变量可以保存类型为boolean、byte、char、short、float、reference、returnAddress的数据
两个局部变量可以保存一个类型为long和double的数据

局部变量使用索引来进行定位,第一个局部变量的索引值为0
  • 操作数栈
线程实际的操作台

后进先出的栈
当一个方法开始执行,数栈是空的,随着方法执行和字节码指令的执行
会从局部变量表或对象对象实例的地段中复制常量或变量写入到操作数栈,再随着计算的进行将栈中的元素出栈到局部变量表
或者返回给方法的调用者,也就是出栈
一个完整的方法执行期间包含多个入栈出栈操作
  • 动态链接
指向运行时常量池的引用

在class文件里卖弄,描述了一个方法调用了其他方法,或者访问成员变量是通过符号引用过来的
动态链接的作用就是将这些符号引用所表示的方法转换为实际方法的直接引用
  • 方法返回地址
包括正常返回和异常返回

无论何种方式,推出后都需要返回到方法被调用的位置,程序才能继续执行,方法返回时可能在当前栈帧中保存一些信息,用来恢复上层方法执行状态

3.3栈内存的溢出

  • 栈帧过大
  • 栈帧过多
-Xss size 调整栈内存大小

4 本地方法栈

被native修饰的方法

本地方法栈的功能特点类似于虚拟机栈,也是线程私有的
不同点:本地方法栈服务的对象是JVM执行的native方法,虚拟机栈服务的是JVM的Java方法
堆的区域是用来存放对象实例的,也是垃圾收集器管理的主要区域

5 堆 Heap

堆是JVM内存最大的一块
存放内存的区域,所有线程共享的一块区域 在JVM启动时建立

存放对象实例的内存区域 也是垃圾收集器管理的主要区域

堆在逻辑上分为:
	1 新生代
		Eden
		ServiviorFrom
		ServivorTo
	2 老年代
	

5.2 堆内存回收

6 方法区

JVM内存结构解析_第3张图片
作用:存储每个类的作用

运行时常量池 字段和方法数据 
方法和构造函数的代码
用于类和实例的初始化以及接口初始化的特殊方法

JVM内存结构解析_第4张图片

你可能感兴趣的:(java)