JVM内存模型详解:18道面试题及元空间替代 PermGen 解析

需积分: 0 1 下载量 26 浏览量 更新于2024-08-03 收藏 19KB DOCX 举报
本文档是一份关于Java虚拟机(JVM)的面试题集,主要关注JVM内存模型及其管理。JVM内存模型包括以下几个关键部分: 1. 虚拟机栈:用于存储方法调用的局部变量、操作数栈和动态链接信息。每个线程都有自己的虚拟机栈,对于线程安全的操作,如同步方法,其栈帧会被扩展。 2. 堆:这是JVM中最大的内存区域,主要用于存放对象实例。在早期版本中,有永久代(PermGen),但在JDK 1.7以后被元空间(Metaspace)所取代。元空间存储类的元数据,如类加载信息、常量池等,它不在Java堆内,而是使用本地内存。 3. 方法区:在JDK 1.7之前,这部分负责存储符号引用、字面量和类的静态变量。在元空间替换后,这些内容有所变化:符号引用移到native heap,字面量和类静态变量转移到Java heap。 4. 程序计数器:每个线程都有一个独立的计数器,用于跟踪当前执行的字节码指令的地址。 5. 本地方法栈:类似于虚拟机栈,但主要为运行在本地方法库中的Java Native Interface (JNI) 方法提供内存。 内存管理方面,文档讨论了以下问题: - 内存溢出:当JVM无法为新创建的对象分配内存或垃圾收集器无法回收足够空间时,会导致内存溢出。这可能由于大量对象创建、循环引用或长时间不清理不再使用的对象造成。 - 内存泄漏:当对象虽然不再被使用,但由于引用关系,使得垃圾收集器无法识别并回收它们,导致内存占用持续增加。如给出的示例中,虽然对象`object`被设置为`null`,但由于`set`集合仍然持有对象引用,导致内存泄漏,即使`set`大小不变,但对象却不能被GC回收。 这份文档深入剖析了JVM内存模型,以及与之相关的内存管理,有助于理解Java应用在内存使用上的优化和注意事项。面试者应熟悉这些概念,以便在面试中展现出对JVM底层机制的掌握。