1. 堆(Heap):
• 这是Java对象存储的主要区域,类似于一个大仓库,用于存放所有动态分配的对象实例。堆内存由JVM自动管理,包括对象的分配和回收。
2. 栈(Stack):
• 每个线程都有一个私有的栈,用于存储局部变量、方法调用等信息。栈内存是线程安全的,由JVM自动分配和释放。可以想象成每个线程都有一个自己的“工作区”,用于临时存放数据和指令。
3. 方法区(Method Area):
• 也称为永久代(PermGen space,在Java 8之前)或元空间(Metaspace,在Java 8及之后),用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。可以把它比作一个“知识库”,存放着类的各种信息。
4. 垃圾收集(Garbage Collection, GC):
• JVM自动回收不再使用的对象所占用的内存空间的过程。垃圾收集器会定期扫描堆内存,回收那些不再被引用的对象。可以把它想象成仓库的“清洁工”,定期清理不再需要的“货物”。
5. 年轻代(Young Generation):
• 堆内存的一部分,用于存放新生成的对象。年轻代通常分为一个或多个Eden区和两个Survivor区(也称为From和To区)。新生成的对象首先被分配到Eden区,当Eden区满时,会触发一次Minor GC(年轻代垃圾收集)。
6. 老年代(Old Generation):
• 堆内存的另一部分,用于存放经过多次年轻代垃圾收集后仍然存活的对象。老年代的对象生命周期较长,因此垃圾收集的频率相对较低。
7. 永久代/元空间(PermGen/Metaspace):
• 在Java 8之前,方法区被实现为永久代(PermGen space),用于存储类的元数据。在Java 8及之后,方法区被实现为元空间(Metaspace),使用本地内存(即操作系统的内存)来存储类的元数据。
8. 对象头(Object Header):
• 存储对象的元数据,包括哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等信息。可以把它想象成对象的“身份证”,包含了对象的各种属性。
9. 引用计数(Reference Counting):
• 一种简单的垃圾收集算法,通过维护每个对象的引用计数来判断对象是否可以被回收。但是,由于无法解决循环引用的问题,因此在Java中并没有使用这种算法。
10. 可达性分析(Reachability Analysis):
• Java中使用的垃圾收集算法之一,通过从GC Roots(如静态变量、全局变量、当前线程栈帧中的局部变量等)出发,标记所有可达的对象,然后回收那些不可达的对象。