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

需积分: 9 2 下载量 51 浏览量 更新于2024-07-09 收藏 10.16MB PDF 举报
"Java核心知识整理.pdf" Java作为一门广泛使用的编程语言,其核心知识包括对JVM(Java虚拟机)的理解以及内存管理机制。以下是关于JVM和垃圾回收的详细解析: 1. JVM(Java Virtual Machine)是Java程序运行的基础,它负责解释并执行字节码。JVM内存主要分为以下几个区域: - **程序计数器**:每个线程都有自己的程序计数器,用于记录当前线程所执行的字节码指令地址。 - **虚拟机栈**:存储方法调用过程中的局部变量表、操作数栈、动态链接和方法出口等信息,每个线程也有自己的虚拟机栈。 - **本地方法区**:为Java虚拟机执行native方法提供内存空间。 - **堆**:所有对象实例都在堆中分配内存,是线程共享的区域。Java的内存管理主要围绕堆进行,分为新生代和老年代。 - **方法区/永久代**:存储类的元数据,如类信息、常量、静态变量等。在Java 8中,这部分被元空间取代。 2. **JVM运行时内存**进一步细分为新生代(包括Eden区、两个Survivor区)、老年代和永久代(或元空间): - **新生代**主要用于存放新创建的对象,经历多次Minor GC后仍存活的对象将晋升至老年代。 - **Eden区**是新生代的主要部分,大部分对象在此处创建。 - **Survivor区**分为From和To,用于在Minor GC期间存储存活下来的对象,每次Minor GC会有一区变为空,另一区接收存活对象。 - **老年代**存放长期存活的对象,当老年代空间不足时触发Major GC或Full GC。 - **永久代/元空间**存储类的信息,Java 8之后元空间位于本地内存,大小可动态调整。 3. **垃圾回收(GC)**是Java自动管理内存的重要机制,主要解决对象生命周期的问题。GC通过多种算法确定哪些对象是垃圾: - **引用计数法**:简单但无法处理循环引用。 - **可达性分析**:通过根集合出发,遍历可达的所有对象,其余为垃圾,Java主要采用此方法。 - **标记清除算法**:标记存活对象,清除未标记对象,会产生碎片。 - **复制算法**:将内存分为两块,每次只使用一块,复制存活对象到另一块,然后清空原块。 - **标记整理算法**:标记存活对象,然后整理内存,消除碎片。 - **分代收集算法**:根据对象存活周期,将内存分为不同代,针对各代使用不同的收集策略。 4. **Java四种引用类型**影响对象的垃圾回收时机: - **强引用**:默认的引用类型,只要强引用存在,对象就不会被GC。 - **软引用**:在系统即将发生内存溢出异常之前,会清理软引用关联的对象。 - **弱引用**:在下一次GC时就会被清理,无论内存是否充足。 - **虚引用**:不直接获取对象,仅用于通知GC,对象即将被回收。 5. **GC分代收集算法和分区收集算法**是两种不同的垃圾回收策略: - **分代收集**针对不同生命周期的对象使用不同的算法,如新生代使用复制算法,老年代使用标记整理算法。 - **分区收集**将堆分成多个独立的区域,每个区域可以独立进行GC,提高了并发性和效率。 6. **GC垃圾收集器**是实现这些算法的具体工具,例如: - **Serial收集器**:单线程,适用于小型应用。 - **ParNew收集器**:Serial的多线程版本,常与CMS配合使用。 - **ParallelScavenge收集器**:多线程,专注于吞吐量,适用于服务器环境。 - **SerialOld收集器**:Serial收集器的老年代版本,单线程标记整理算法。 理解这些概念和机制对于优化Java应用程序的性能至关重要,尤其是在处理大规模数据或高并发场景时。