深入理解JVM:内存模型与垃圾回收

需积分: 9 1 下载量 133 浏览量 更新于2024-07-14 收藏 10.51MB PDF 举报
"JAVA核心知识点整理.pdf" 这篇PDF文档主要涵盖了Java编程语言中的核心知识点,特别是与Java虚拟机(JVM)以及垃圾回收机制相关的部分。以下是详细的解释: 1. JVM (Java Virtual Machine) 是Java程序运行的基础,它将编译后的字节码转化为机器码执行。JVM分为几个关键区域: - 程序计数器:每个线程都有自己的程序计数器,用于存储当前线程执行的字节码指令地址。 - 虚拟机栈:同样线程私有,每个线程有一个栈,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。 - 本地方法区:支持Java调用本地(非Java)方法,如JNI。 - 堆(Heap):所有线程共享,用于存储对象实例,是垃圾收集的主要区域。 - 方法区/永久代:存储类信息、常量、静态变量等,Java 8后被元空间取代。 2. JVM运行时内存进一步细分为新生代、老年代和永久代: - 新生代:主要用于存放新创建的对象,分为Eden区、SurvivorFrom区和SurvivorTo区,通过Minor GC进行对象存活判断和空间清理。 - 老年代:存放长时间存在的对象,当新生代对象经过多次Minor GC后晋升至此。 - 永久代/元空间:存储类的元数据,在Java 8之后,这部分被移到了元空间,以便减少对Java heap的压力。 3. 垃圾回收(Garbage Collection, GC)是自动管理内存的过程,包括以下几种算法: - 引用计数法:简单但存在循环引用问题。 - 可达性分析:通过根节点来确定对象是否可达,更准确但计算复杂。 - 标记清除算法:标记活对象,清除未标记对象,会产生碎片。 - 复制算法:将活对象复制到一块连续区域,效率高但浪费空间。 - 标记整理算法:标记后将活对象整理到一端,避免碎片,但效率较低。 - 分代收集算法:根据对象生命周期不同采用不同策略,如新生代使用复制算法,老年代用标记整理算法。 4. Java中有四种不同的引用类型: - 强引用:默认的引用类型,只要引用存在,对象就不会被GC回收。 - 软引用:在系统即将发生内存溢出之前,会回收软引用指向的对象。 - 弱引用:比软引用更弱,GC在任何时候都会回收弱引用对象。 - 虚引用:仅用于跟踪对象被GC回收的时机,对象能否被访问并不关心。 5. GC收集算法还有分区收集,即将堆内存划分为多个小块,可以提高并发性能,例如: - 分代收集算法:在新生代采用复制算法,老年代用标记整理算法。 - 分区收集算法:每个分区独立进行GC,提高并发性和局部性。 6. 不同类型的垃圾收集器: - Serial:单线程,使用复制算法,适合小内存环境。 - ParNew:Serial的多线程版本,常与CMS配合使用。 - ParallelScavenge:多线程,关注吞吐量,使用复制算法。 - SerialOld:Serial的旧对象收集器,用标记整理算法,适用于单CPU环境。 - CMS(Concurrent Mark Sweep):并发标记清除,减少停顿时间。 - G1:新一代垃圾收集器,目标是可预测的暂停时间模型。 这个文档为Java开发者提供了一个深入理解JVM内存管理和垃圾回收机制的框架,有助于优化代码并解决性能问题。