Sun JDK 1.5 GC策略详解:串行与并行回收机制

需积分: 10 1 下载量 161 浏览量 更新于2024-08-18 收藏 1.03MB PPT 举报
"本文主要探讨了Sun JDK 1.5中的垃圾收集机制(GC),包括串行GC、并行回收GC、并行GC(ParNew)以及新生代可用GC,并涉及内存优化的相关知识。文章详细介绍了Java的自动内存管理、GC的作用、内存结构以及内存分配策略,同时也提到了内存回收的原理和不同类型的引用。" 在Java中,自动内存管理主要是通过垃圾收集器(GC)来实现的,它不仅负责回收不再使用的内存,还决定了内存如何被分配。对于开发者来说,理解GC的工作原理和优化方法对于提升应用程序性能和避免OOM(Out Of Memory)异常至关重要。 SunJDK 1.5中的GC主要包括几种类型: 1. **串行GC (Serial Copying)**:这是最基础的垃圾收集器,适合小内存应用,它在单线程环境下工作,进行完全的Stop-The-World暂停。 2. **并行回收GC (Parallel Scavenge)**:此GC着重于吞吐量,通过多线程并行回收,以提高整体应用程序的执行速度。 3. **并行GC (ParNew)**:它是新生代的并行收集器,与CMS(Concurrent Mark Sweep)配合使用,用于提高新对象的回收效率。 选择哪种GC通常取决于应用的特性和需求,例如,对于低延迟的应用,串行GC可能是更好的选择;而对于高吞吐量的应用,可能需要考虑并行回收GC。 内存结构在Hotspot JVM中分为以下几个部分: - **程序计数器(PC Register)**:每个线程都有自己的程序计数器,用于记录下一条指令的位置。 - **局部变量区(Local Variables)** 和 **操作数栈(Operand Stack)**:存在于每个栈帧中,存储方法的局部变量和计算过程。 - **JVM方法栈**:存储每个线程的栈帧,每个方法调用对应一个栈帧。 - **JVM堆**:所有对象实例都在堆上分配,包括新生代(Young Generation)和老年代(Old Generation)。 - **本地方法栈**:支持JNI(Java Native Interface)调用,与JVM方法栈类似。 - **JVM方法区(或者叫做 PermGen Space)**:存储类信息、常量、静态变量等。 内存分配策略包括: 1. **堆上分配**:大部分对象在Eden区分配,少数直接进入Old区。使用TLAB(Thread Local Allocation Buffer)可以优化分配效率。 2. **栈上分配**:基本类型的局部变量和某些情况下通过逃逸分析后转化为基本类型的对象。 3. **堆外分配**:如DirectByteBuffer,但不推荐直接使用Unsafe进行分配。 内存回收主要判断对象是否可达,Hotspot将引用分为Strong、Soft、Weak、Phantom四种,它们在不同的GC策略下有不同的行为。例如,Soft引用在内存不足时会被回收,而Weak引用一旦标记为不可达,就会被放入ReferenceQueue。Phantom引用则在对象从JVM堆中彻底释放时通知。 根据IBM的研究,大部分对象是短暂存在的,因此Sun Hotspot采用了分代收集策略,分别针对新生代和老年代进行优化,以更高效地回收临时对象。通过调整JVM参数如-Xms、-Xmx、-XX:PermSize、-XX:MaxPermSize等,可以定制内存分配和垃圾收集的行为,以适应不同应用的需求。