深入理解JAVA JVM内存与垃圾回收

需积分: 10 1 下载量 107 浏览量 更新于2024-07-14 收藏 10.57MB PDF 举报
"JAVA核心知识点整理" 在Java编程语言中,JVM(Java Virtual Machine)是至关重要的部分,它负责执行字节码并管理内存。本资料详细整理了JVM的各个方面,包括线程、内存区域以及垃圾回收机制。 首先,JVM内存区域分为几个关键部分: 1. **程序计数器**:每个线程都有自己的程序计数器,用于存储当前线程正在执行的Java方法的指令地址,如果线程执行的是Native方法,则计数器值为空。 2. **虚拟机栈**:同样线程私有,用于存储栈帧,每个方法调用都会创建一个栈帧,包含局部变量表、操作数栈、动态链接和方法出口等信息。 3. **本地方法栈**:与虚拟机栈类似,但服务于Java Native Interface (JNI) 方法,处理非Java语言的本地方法调用。 4. **堆**:线程共享,是所有对象实例和数组的存储区域。在Java 8之前,堆分为新生代和老年代;在Java 8及以后,堆内存被进一步细分为年轻代(包括Eden和两个Survivor区)和老年代。 5. **方法区/永久代**:存储类信息、常量、静态变量等,Java 8之后被元空间(Metaspace)取代,以减少对内存的限制。 接着,JVM运行时内存的结构如下: - **新生代**:包括Eden区、From Servicor区和To Servicor区,主要存放新创建的对象。Minor GC在此区域进行,通过复制算法将存活对象移到Survivor区,并更新对象年龄。 - **老年代**:存放长期存活的对象,当新生代对象经过多次 Minor GC 后仍然存活,会被晋升到老年代。 - **永久代/元空间**:存储类信息,与运行时数据区的其他部分不同,不直接参与垃圾回收。 垃圾回收(GC)是JVM自动管理内存的关键,主要目标是识别并回收不再使用的对象。GC算法主要包括: 1. **引用计数法**:简单但无法处理循环引用问题。 2. **可达性分析**:通过根集合遍历确定存活对象,是现代JVM的主要垃圾检测方式。 3. **标记清除算法**:标记所有存活对象,然后清除未标记的对象,会产生碎片。 4. **复制算法**:将存活对象复制到一块连续内存,避免碎片,但效率较低。 5. **标记整理算法**:标记后将存活对象向一端移动,然后清理另一端,适用于老年代。 6. **分代收集算法**:结合上述算法,针对不同代别使用不同的策略,如新生代使用复制算法,老年代用标记整理。 此外,Java提供了四种引用类型来控制对象的生命周期: 1. **强引用**:默认的引用类型,只要存在强引用,对象就不会被GC回收。 2. **软引用**:当内存不足时,会回收软引用指向的对象。 3. **弱引用**:任何时候只要GC运行,弱引用对象都会被回收。 4. **虚引用**:主要用于跟踪对象在垃圾回收过程中的状态,几乎不直接使用。 最后,GC的收集器有多种选择,如: 1. **Serial收集器**:单线程,适合小型应用或服务器的后台应用。 2. **ParNew收集器**:Serial收集器的多线程版本,常与CMS配合使用。 3. **ParallelScavenge收集器**:追求高吞吐量,适用于CPU资源丰富的服务器环境。 4. **SerialOld收集器**:Serial收集器的老年代版本,采用标记整理算法。 这些知识点构成了Java开发中理解JVM和垃圾回收的基础,对于优化代码性能和避免内存泄漏至关重要。