深入理解JVM:内存模型与垃圾收集
需积分: 10 88 浏览量
更新于2024-09-03
收藏 815KB PDF 举报
"该资源是关于JVM面试的专题PDF,涵盖了JVM内存模型、堆内存分区、对象创建与内存分配、垃圾收集机制以及引用判定方法等核心知识点。"
1. JVM内存模型与分区:
- **方法区**:存储类信息,包括常量池(包含static常量和static变量)、元数据以及编译后的字节码。在Java 8之后,方法区被Metaspace取代,用于存储类元数据。
- **堆内存**:用于存储所有对象实例和数组,分为新生代(Young Generation)和老年代(Tenured Generation)。新生代包括Eden区和两个Survivor区(From和To),对象首先在Eden区创建,经历垃圾回收后存活的对象移至Survivor区,多次GC后仍存活的则进入老年代。
- **栈内存**:每个线程都有自己的独立栈,用于存储方法调用时的局部变量表、操作数栈、动态链接和方法返回地址等信息。栈内存中的数据生命周期与方法同步,方法结束时,对应的栈帧会被销毁。
- **本地方法栈**:为Java Native Interface (JNI)中的本地方法提供服务,与栈类似,但用于存储本地方法调用的信息。
- **程序计数器**:记录当前线程正在执行的字节码指令的行号,用于控制程序的执行流程。
2. 堆内存分区特点:
- **新生代**:Eden区是大多数对象的诞生地,Survivor区用于在每次垃圾收集时复制存活对象,减少内存碎片。两个Survivor区交替作为From和To,以避免连续两次GC在同一区进行。
- **老年代**:存放长期存活的对象,当新生代对象经过多次GC后仍然存活,将被晋升至老年代。当老年代空间不足时,会触发Full GC。
3. 对象创建与内存分配:
- 使用`new`关键字创建对象时,JVM会根据对象大小选择在堆内存的适当区域分配空间。对于大对象,可能会直接分配在老年代,以避免频繁的内存复制。
4. 垃圾收集(GC)判定方法:
- 引用计数法:简单但无法处理循环引用问题,JVM未采用。
- 引用链法(可达性分析):从GC Roots出发,遍历引用链,无法到达的对象被视为可回收。GC Roots包括静态变量、活动线程栈中的局部变量、JNI引用等。
5. SafePoint:
- 在执行Java代码的过程中,会有一些特定的位置(如方法调用、循环边界等)称为SafePoints,这些点允许GC暂停线程进行垃圾收集。在执行到SafePoint时,JVM可以确保所有线程的状态是可预测的,从而安全地执行垃圾收集。
这些知识点是JVM面试中常见的问题,深入理解它们有助于优化Java应用程序的性能并解决内存相关的问题。
2021-10-01 上传
2021-09-23 上传
2023-06-15 上传
2023-03-15 上传
2020-03-28 上传
2020-03-29 上传
2022-02-28 上传
2022-07-14 上传
2020-03-28 上传
萧曵丶
- 粉丝: 2614
- 资源: 264
最新资源
- IEEE 14总线系统Simulink模型开发指南与案例研究
- STLinkV2.J16.S4固件更新与应用指南
- Java并发处理的实用示例分析
- Linux下简化部署与日志查看的Shell脚本工具
- Maven增量编译技术详解及应用示例
- MyEclipse 2021.5.24a最新版本发布
- Indore探索前端代码库使用指南与开发环境搭建
- 电子技术基础数字部分PPT课件第六版康华光
- MySQL 8.0.25版本可视化安装包详细介绍
- 易语言实现主流搜索引擎快速集成
- 使用asyncio-sse包装器实现服务器事件推送简易指南
- Java高级开发工程师面试要点总结
- R语言项目ClearningData-Proj1的数据处理
- VFP成本费用计算系统源码及论文全面解析
- Qt5与C++打造书籍管理系统教程
- React 应用入门:开发、测试及生产部署教程