深入理解JVM内存模型:栈、堆、方法区与垃圾回收
需积分: 0 94 浏览量
更新于2024-08-03
收藏 5KB MD 举报
"jvm内存模型个人笔记"
Java虚拟机(JVM)内存模型是Java运行时数据区域的架构,它负责管理和处理程序的运行时数据。以下是对标题和描述中涉及的知识点的详细说明:
1. **JVM内存模型:**
JVM内存模型主要包含五个基本部分:
- **栈(Stack)**:每个线程都有自己的栈,用于存储局部变量表、操作栈、动态链接和方法出口等信息。每次方法调用时,栈帧会入栈,方法结束时出栈。
- **本地方法栈(Native Method Stack)**:类似于栈,但用于执行本地(Native)方法,即非Java语言编写的代码。
- **程序计数器(Program Counter Register)**:记录当前线程执行的字节码的地址,每个线程都有自己的计数器,执行Native方法时计数器为空。
- **堆(Heap)**:是JVM中最大的一块内存,所有线程共享,用于存储对象实例。堆被分为不同的代,如年轻代(Young Generation)、老年代(Old Generation),以适应不同生命周期的对象。如果堆空间不足,会触发OutOfMemoryError(OOM)异常。
- **方法区(Method Area)**:在Java 8之前称为永久代(Permanent Generation),在Java 8及以后版本称为元空间(Metaspace)。它存储已加载的类信息、常量、静态变量和即时编译后的代码。
2. **垃圾收集(GC):**
- **分代回收**:将堆内存划分为不同年代,如年轻代(包括 Eden 和两个Survivor区)和老年代,使用不同的垃圾收集策略。年轻代通常使用复制算法,老年代常用标记-清除或标记-整理算法。
- **回收器实现**:主要有串行回收器、并行回收器、并发标记扫描(CMS)、G1垃圾收集器和ZGC等。这些回收器有不同的性能特性和适用场景。
3. **类加载机制:**
- **双亲委派模型**:类加载器在加载类时,首先将请求传递给其父类加载器,只有当父类加载器无法加载时,子类加载器才会尝试加载。这种机制防止了类的重复加载,并保护了核心API不受篡改。
- **类加载器层次**:Bootstartp类加载器(最顶级)、Extension类加载器、System类加载器(也称应用类加载器)以及自定义类加载器。
4. **Java内存模型(JMM):**
JMM规定了多线程环境下如何访问共享变量,确保线程安全。它提供了以下保证:
- **原子性(Atomicity)**:通过锁或者CAS操作保证,使得一个操作要么全部完成,要么不开始。
- **可见性(Visibility)**:使用volatile关键字可以确保一个线程对变量的修改对其他线程可见。
- **有序性(Ordering)**:通过内存屏障来限制指令重排序,保证特定的顺序执行。
JMM定义了八种操作来控制主内存和工作内存之间的交互:
- lock(锁定)
- unlock(解锁)
- read(读取)
- load(载入)
- use(使用)
- assign(赋值)
- store(存储)
- write(写入)
这些操作保证了线程间的正确通信和同步,防止出现数据不一致的情况。
2018-10-24 上传
2019-03-31 上传
2019-01-03 上传
2018-11-25 上传
点击了解资源详情
2016-06-30 上传
2023-04-24 上传
2011-05-07 上传
ResearchGGQ
- 粉丝: 0
- 资源: 1
最新资源
- SSM Java项目:StudentInfo 数据管理与可视化分析
- pyedgar:Python库简化EDGAR数据交互与文档下载
- Node.js环境下wfdb文件解码与实时数据处理
- phpcms v2.2企业级网站管理系统发布
- 美团饿了么优惠券推广工具-uniapp源码
- 基于红外传感器的会议室实时占用率测量系统
- DenseNet-201预训练模型:图像分类的深度学习工具箱
- Java实现和弦移调工具:Transposer-java
- phpMyFAQ 2.5.1 Beta多国语言版:技术项目源码共享平台
- Python自动化源码实现便捷自动下单功能
- Android天气预报应用:查看多城市详细天气信息
- PHPTML类:简化HTML页面创建的PHP开源工具
- Biovec在蛋白质分析中的应用:预测、结构和可视化
- EfficientNet-b0深度学习工具箱模型在MATLAB中的应用
- 2024年河北省技能大赛数字化设计开发样题解析
- 笔记本USB加湿器:便携式设计解决方案