当前位置: 首页 > article >正文

JVM 详解

一. JVM 内存区域的划分

1. 程序计数器

程序计数器是JVM中一块比较小的空间, 它保存下一条要执行的指令的地址

[注]: 与CPU的程序计数器不同, 这里的下一条指令不是二进制的机器语言, 而是Java字节码.

2. 栈

保存方法中的局部变量, 方法的形参, 方法之间的调用关系.

栈又分为 "Java虚拟机栈" 和 "本地方法栈" .

  • 本地方法(Native Method) 是用 C/C++ 代码编写. 本地方法栈保存的是本地方法的局部变量, 形参和调用关系.
  • Java方法使用Java编写的. Java虚拟机栈保存的是Java方法的局部变量, 形参和调用关系.

3. 堆

堆是JVM中最大的空间. 通过new新创建的对象 (对象的成员属性和成员方法) 都保存在堆上.

4. 方法区 (元数据区) 

方法区, 又叫元数据区. 这块空间保存类信息, 常量, 静态成员(静态变量, 静态方法).

在一个Java进程中, 堆和方法区只有一份; 而程序计数器和栈的数目是根据线程数目确定的. 我们看下面这张图就能明白了~

仔细想一下, 我们其实不难理解为什么要这样存储. 每一个线程都代表一个"执行流", 当然需要记录自己的指令执行顺序, 自己的函数调用关系. 而常量, 静态成员和类信息 就没有必要记录好多份~

二. JVM 类加载过程

1.加载 (Loading)

JVM会通过类加载器(Class Loader) 读取类的字节码文件(.class文件), 并将其数据转换成方法区中的数据结构,同时在堆中生成一个对应的java.lang.Class对象用于封装类在方法区内的数据结构.

2. 链接 (Linking)

(1) 验证 (Verification) : 确保加载的类信息安全, 准确.

(2) 准备 (Preparation) : 为类变量分配内存, 并设置默认初始值 (例如: int类型的默认值为0, 对象的默认值为null等) 

(3) 解析 (Resolution) : 将类, 接口, 字段和方法的符号引用转换为直接引用. 这一步可以推迟到真正使用的时候再进行, 也就是所谓的动态链接.

3. 初始化 (Initialization)

初始化阶段是执行类构造器()方法的过程,该方法是由编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并产生的。此阶段将为类变量赋予正确的初始值。


http://www.kler.cn/a/445898.html

相关文章:

  • 解决docker环境下aspose-words转换word成pdf后乱码问题
  • 【计算机网络】期末考试预习复习|中
  • run postinstall error, please remove node_modules before retry!
  • SpringBoot项目Jar包使用systemctl运行
  • Eureka学习笔记-服务端
  • 探索 Bokeh:轻松创建交互式数据可视化的强大工具
  • 大数据-252 离线数仓 - Airflow 任务调度 Crontab简介 任务集成部署 入门案例
  • 中间件 redis安装
  • 洛谷 B3644 【模板】拓扑排序 / 家谱树 C语言
  • git部分命令的使用
  • Hmsc包开展群落数据联合物种分布模型分析通用流程(Pipelines)
  • 如何快速构建Jmeter脚本
  • oracle AES CBC,128位密钥加解密方法
  • 【C++ DFS 图论】1519. 子树中标签相同的节点数|1808
  • 解决 Ubuntu 20.04 上因 postmaster.pid 文件残留导致的 PostgreSQL 启动失败问题
  • L24.【LeetCode笔记】 杨辉三角
  • 如何彻底删除电脑数据以防止隐私泄露
  • 【mac 终端美化】oh my zsh
  • GTID详解
  • 【从零开始入门unity游戏开发之——C#篇21】C#面向对象的封装——`this`扩展方法、运算符重载、内部类、`partial` 定义分部类
  • 【Verilog】实验九 存储器设计与IP调用
  • 【论文复现】找出图像中物体的角点
  • 热更新解决方案4——xLua热补丁
  • [react] 优雅解决typescript动态获取redux仓库的类型问题
  • ES倒排索引
  • 全链路触达,Klaviyo 助力跨境电商打造数据驱动的智能化营销体验