JVM内存结构与对象生命周期
版权申诉
13 浏览量
更新于2024-09-09
收藏 686KB PDF 举报
"JVM面试专题.pdf 是一份深入探讨Java虚拟机(JVM)相关知识的文档,适合面试准备和学习。文档详细介绍了JVM的内存模型、对象创建与分配、垃圾收集机制以及相关的判断标准。"
在JVM内存模型中,主要分为以下几个区域:
1. 方法区(Method Area):存储类信息,包括常量池(包含static常量和static变量)、编译后的字节码等数据。在Java 8中,方法区被替换为元空间(Metaspace),用于存储类元数据。
2. 堆(Heap):用于存储所有对象实例和数组,无论是初始化的对象还是成员变量(非static)。堆内存分为新生代和老年代,新生代又细分为Eden区和两个Survivor区(From和To)。新生代对象首先在Eden区分配,经历垃圾收集后,存活的对象会被复制到Survivor区,多次幸存后则晋升到老年代。
3. 栈(Stack):每个线程都有自己的程序计数器、虚拟机栈和本地方法栈。栈主要用于存储局部变量表、操作数栈、方法返回地址等信息,每执行一个方法,就会在栈上创建一个新的栈帧。
4. 本地方法栈(Native Method Stack):为Java方法以外的本地(Native)方法提供服务。
5. 程序计数器(PC Register):记录当前线程正在执行的字节码指令的地址,便于下一条指令的执行。
在堆内存中,新生代采用复制算法进行垃圾收集,当Eden区满时,存活对象会被复制到Survivor区之一,然后清空Eden。如果Survivor区不足以容纳所有存活对象,部分对象将直接进入老年代。老年代通常使用标记-清除或标记-压缩算法进行垃圾收集,以应对大对象和长期存活的对象。
对于对象创建,Java中最常见的方式是使用`new`关键字。对象的内存分配通常在堆上进行,访问定位则涉及对象头和句柄等概念,具体实现方式有直接指针、句柄和偏向锁等。
垃圾收集(GC)的判定方法主要有两种:
1. 引用计数法:跟踪对象的引用次数,但无法处理循环引用问题,因此JVM并未采用此方法。
2. 可达性分析(引用链法):通过GC Roots(如静态变量、系统运行时栈帧中的局部变量、方法区中的常量引用等)来判断对象是否可达。如果一个对象从任何GC Roots都无法通过引用链到达,那么它被认为是不可达的,可进行垃圾回收。
SafePoint是垃圾收集过程中的特定点,JVM在执行到这些点时,所有线程都将处于可中断状态,以便进行垃圾收集工作。这通常发生在方法调用、循环边界等位置,确保GC能安全地暂停程序执行。
2021-10-01 上传
2021-09-23 上传
2023-01-17 上传
2023-03-15 上传
2020-03-28 上传
2020-03-29 上传
2022-02-28 上传
2022-07-14 上传
2020-03-28 上传
java李杨勇
- 粉丝: 36w+
- 资源: 3180
最新资源
- 前端协作项目:发布猜图游戏功能与待修复事项
- Spring框架REST服务开发实践指南
- ALU课设实现基础与高级运算功能
- 深入了解STK:C++音频信号处理综合工具套件
- 华中科技大学电信学院软件无线电实验资料汇总
- CGSN数据解析与集成验证工具集:Python和Shell脚本
- Java实现的远程视频会议系统开发教程
- Change-OEM: 用Java修改Windows OEM信息与Logo
- cmnd:文本到远程API的桥接平台开发
- 解决BIOS刷写错误28:PRR.exe的应用与效果
- 深度学习对抗攻击库:adversarial_robustness_toolbox 1.10.0
- Win7系统CP2102驱动下载与安装指南
- 深入理解Java中的函数式编程技巧
- GY-906 MLX90614ESF传感器模块温度采集应用资料
- Adversarial Robustness Toolbox 1.15.1 工具包安装教程
- GNU Radio的供应商中立SDR开发包:gr-sdr介绍