JVM 详解

一. JVM 内存区域的划分

1. 程序计数器

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

注\]: 与CPU的程序计数器不同, 这里的下一条指令不是二进制的机器语言, 而是Java字节码. #### 2. 栈 保存方法中的**局部变量, 方法的形参, 方法之间的调用关系**. 栈又分为 "Java虚拟机栈" 和 "本地方法栈" . * 本地方法(Native Method) 是用 C/C++ 代码编写. 本地方法栈保存的是本地方法的局部变量, 形参和调用关系. * Java方法使用Java编写的. Java虚拟机栈保存的是Java方法的局部变量, 形参和调用关系. #### 3. 堆 堆是JVM中最大的空间. 通过new**新创建的对象 (对象的成员属性和成员方法) 都保存在堆上**. #### 4. 方法区 (元数据区) 方法区, 又叫元数据区. 这块空间保存**类信息, 常量, 静态成员**(静态变量, 静态方法). 在一个Java进程中, **堆和方法区只有一份** ; 而**程序计数器和栈** 的数目是**根据线程数目确定的**. 我们看下面这张图就能明白了\~ ![](https://i-blog.csdnimg.cn/direct/1877c3dd8b794aefb2fcc48ffb66e3cb.png) 仔细想一下, 我们其实不难理解为什么要这样存储. 每一个线程都代表一个"执行流", 当然需要记录自己的指令执行顺序, 自己的函数调用关系. 而常量, 静态成员和类信息 就没有必要记录好多份\~ ### 二. JVM 类加载过程 #### 1.加载 (Loading) JVM会通过类加载器(Class Loader) 读取类的字节码文件(.class文件), 并将其数据转换成方法区中的数据结构,同时在堆中生成一个对应的java.lang.Class对象用于封装类在方法区内的数据结构. #### 2. 链接 (Linking) **(1) 验证 (Verification)** : 确保加载的类信息安全, 准确. **(2) 准备 (Preparation)** : 为类变量分配内存, 并设置默认初始值 (例如: int类型的默认值为0, 对象的默认值为null等) **(3) 解析 (Resolution)** : 将类, 接口, 字段和方法的符号引用转换为直接引用. 这一步可以推迟到真正使用的时候再进行, 也就是所谓的动态链接. #### 3. 初始化 (Initialization) 初始化阶段是执行类构造器()方法的过程,该方法是由编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并产生的。此阶段将为类变量赋予正确的初始值。

相关推荐
helloworldandy7 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
m0_7155753410 小时前
使用PyTorch构建你的第一个神经网络
jvm·数据库·python
Word码11 小时前
[C++语法] 继承 (用法详解)
java·jvm·c++
野犬寒鸦12 小时前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
符哥200817 小时前
C++ 进阶知识点整理
java·开发语言·jvm
夕除17 小时前
js--15
java·jvm·spring
4311媒体网20 小时前
C语言操作符全解析 C语言操作符详解
java·c语言·jvm
猫头虎1 天前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
wgslucky1 天前
jdk17 配置jvm参数中gc的日志及控制日志数量和大小
jvm·gc·-xlog
痴儿哈哈1 天前
自动化机器学习(AutoML)库TPOT使用指南
jvm·数据库·python