JVM内存结构与对象生命周期
版权申诉
16 浏览量
更新于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-06-01 上传
2024-01-11 上传
2023-04-29 上传
2023-09-01 上传
2024-08-22 上传
2023-05-29 上传
2023-05-24 上传
java李杨勇
- 粉丝: 35w+
- 资源: 3180
最新资源
- 李兴华Java基础教程:从入门到精通
- U盘与硬盘启动安装教程:从菜鸟到专家
- C++面试宝典:动态内存管理与继承解析
- C++ STL源码深度解析:专家级剖析与关键技术
- C/C++调用DOS命令实战指南
- 神经网络补偿的多传感器航迹融合技术
- GIS中的大地坐标系与椭球体解析
- 海思Hi3515 H.264编解码处理器用户手册
- Oracle基础练习题与解答
- 谷歌地球3D建筑筛选新流程详解
- CFO与CIO携手:数据管理与企业增值的战略
- Eclipse IDE基础教程:从入门到精通
- Shell脚本专家宝典:全面学习与资源指南
- Tomcat安装指南:附带JDK配置步骤
- NA3003A电子水准仪数据格式解析与转换研究
- 自动化专业英语词汇精华:必备术语集锦