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

相关推荐
书院门前细致的苹果3 小时前
JVM 全面详解:深入理解 Java 的核心运行机制
java·jvm
稻草人想看远方5 小时前
GC垃圾回收
java·开发语言·jvm
我真的是大笨蛋7 小时前
从源码和设计模式深挖AQS(AbstractQueuedSynchronizer)
java·jvm·设计模式
我真的是大笨蛋9 小时前
G1 垃圾收集器深入解析
java·jvm·笔记·缓存
好多1712 小时前
《JVM如何排查OOM》
开发语言·jvm·python
getdu14 小时前
JVM第一部分
jvm
海梨花15 小时前
字节一面 面经(补充版)
jvm·redis·后端·面试·juc
Mr_Xuhhh19 小时前
项目-sqlite类的实现
java·jvm·sqlite
佛祖让我来巡山1 天前
深入理解Java对象:从创建到内存访问的JVM底层机制
jvm·对象创建过程·对象是如何创建的
用手手打人1 天前
JVM详解(一)--JVM和Java体系结构
jvm