"JAVA核心知识点整理"
Java是一种广泛使用的高级编程语言,其运行基于Java虚拟机(JVM)。本文档详细梳理了Java的核心知识点,特别是关于JVM内存结构、垃圾回收(GC)及其算法。
首先,JVM是Java程序运行的基础,它负责执行字节码并管理内存。JVM内存主要分为以下几个区域:
1. **程序计数器**:每个线程都有自己的程序计数器,用于记录当前线程正在执行的字节码指令地址。
2. **虚拟机栈**:存储方法调用的局部变量表、操作数栈、动态链接及方法出口等信息。每个线程也都有自己独立的虚拟机栈。
3. **本地方法区**:用于支持Native方法的执行,存储线程私有的本地方法栈。
4. **堆**:是所有线程共享的一块内存区域,用于存储对象实例。Java中的动态内存分配主要发生在堆中。
5. **方法区/永久代**:存放类的信息,如常量、静态变量和编译后的代码。在Java 8之后,这部分被元空间(Metaspace)取代。
JVM运行时内存又细分为新生代、老年代和永久代:
1. **新生代**:主要用于存放新创建的对象,分为Eden区、SurvivorFrom区和SurvivorTo区。Minor GC会使用复制算法进行内存清理和对象晋升。
2. **老年代**:存活时间较长的对象会从新生代晋升至此,使用标记整理算法进行垃圾回收。
3. **永久代**:在Java 8后由元空间替代,用于存储类的元数据。
垃圾回收是JVM自动管理内存的关键机制,主要通过以下算法实现:
1. **引用计数法**:为每个对象添加引用计数器,计数为零的对象被视为垃圾。
2. **可达性分析**:通过根节点(如栈、静态域)出发,能到达的对象为存活,其余为垃圾。
3. **标记清除算法**:标记所有可达对象,然后清除未标记对象。
4. **复制算法**:将内存分为两部分,每次只使用一部分,垃圾回收时复制存活对象到另一部分,然后清空原部分。
5. **标记整理算法**:标记存活对象后,将所有存活对象紧凑到一端,清除另一端的垃圾区域。
6. **分代收集算法**:根据对象的生命周期特性,分别在新生代和老年代使用不同的算法,如新生代使用复制算法,老年代使用标记整理算法。
Java还定义了四种引用类型,影响对象的垃圾回收:
1. **强引用**:最常见的引用,只要存在强引用,对象就不会被垃圾回收。
2. **软引用**:当系统内存不足时,会回收软引用指向的对象。
3. **弱引用**:比软引用更弱,无论内存是否充足,只要进行垃圾回收,就会回收弱引用对象。
4. **虚引用**:最弱的引用,不能直接访问对象,主要用于跟踪对象在垃圾回收过程中的状态。
垃圾收集器是JVM实现GC策略的具体工具,例如:
1. **Serial垃圾收集器**:单线程工作,适合小型应用或开发调试。
2. **ParNew垃圾收集器**:Serial的多线程版本,常与CMS垃圾收集器配合使用。
3. **ParallelScavenge收集器**:强调响应时间和吞吐量,使用多线程复制算法。
4. **SerialOld收集器**:Serial在老年代的对应版本,使用标记整理算法。
理解这些核心知识点对于优化Java应用程序性能、避免内存溢出等问题至关重要。