深入理解Java架构:JVM内存模型与垃圾回收机制

需积分: 29 5 下载量 119 浏览量 更新于2024-11-15 收藏 8.9MB ZIP 举报
资源摘要信息:"Java架构知识库整理" Java架构知识库整理主要涉及了Java虚拟机(JVM)的内部架构和内存管理机制,这些内容对于Java架构师来说是必备的基础知识。以下是详细的知识点: 1. JVM内存区域 - 程序计数器:每个线程私有的一块小内存区域,用于指示当前线程执行的指令位置,是线程隔离的,不会发生内存溢出。 - 虚拟机栈:存储了局部变量表、操作数栈、动态链接、方法出口等信息,也是线程私有的,与线程生命周期相同,可能出现栈溢出错误。 - 本地方法区:与虚拟机栈类似,但主要用于支持native方法的执行,也是线程私有的。 - 堆(Heap):所有线程共享,存放对象实例,是垃圾收集器管理的主要区域,分为新生代和老年代。 - 方法区/永久代:用于存储已被虚拟机加载的类信息、常量、静态变量等,也是线程共享的区域。Java 8之后,永久代被元空间(Metaspace)取代。 2. JVM运行时内存 - 新生代:对象创建之初被分配到新生代,包括Eden区和两个Survivor区(ServivorFrom和ServivorTo)。Minor GC的流程包括复制、清空、互换操作。 - 老年代:新生代中经历多次GC仍然存活的对象会被移动到老年代,它的空间一般比新生代大。 - 永久代:Java 8以前,用于存储类信息、常量、静态变量等,Java 8之后这部分被移至直接内存的元空间。 3. 垃圾回收与算法 - 如何确定垃圾:Java采用的是一种基于可达性分析的垃圾回收机制。可达性分析通过一系列称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则认为该对象是不可达的,可以被回收。 - 引用计数法:每个对象有一个引用计数器,被引用时计数器+1,引用失效时-1,当计数器为0时对象可回收。但这种方法无法解决循环引用的问题。 - 可达性分析:GC Roots作为起点,向下搜索引用链,无引用链相连的对象即为不可达对象。 - 垃圾回收算法: - 标记清除算法(Mark-Sweep):先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。 - 复制算法(copying):将内存分为两块,一块使用中,一块空闲。当使用的一块空间不足时,将存活对象复制到空闲的一块,然后清空使用过的区域。 - 标记整理算法(Mark-Compact):先标记,然后将存活对象向一端移动,最后清理掉边界以外的内存区域。 JVM内存区域和垃圾回收机制是Java虚拟机的核心组成部分,理解这些概念对于设计高性能、稳定的应用程序至关重要。作为Java架构师,不仅要熟悉这些概念,还要能够在实际工作中合理地调整和优化这些参数,确保系统运行的高效和稳定。