当前位置:首页 > 内存 > 正文

jvm内存管理垃圾回收

  • 内存
  • 2024-06-11 15:48:11
  • 9216

一、JVM有哪些垃圾回收算法?JVM运行时数据区中有一个堆区,堆是一大堆对象。这个对象池中管理着大量的对象实例,池中的几层对象引用都很深。通常称为接口,每秒以非常高的速率生成对象,同时对象之间的关系形成一个庞大的网络。
Java创造了一个无限的内存环境,但对象不能简单地增加而不减少,所以需要垃圾回收,那么JVM如何确定回收哪些对象呢?哪一个应该保留?这就需要用到JVM的垃圾收集机制,我们常说的GC(GarbageCollection),也叫垃圾收集器。


二、2022年完全最全JVM讲解(最新版2W字总结)


深入剖析:2022年JVM内存管理与垃圾回收机制全面解读

Java虚拟机(JVM)的内存区域分为两部分:私人区域和公共区域。每个线程都有一个独立的程序计数器(用于跟踪当前正在执行的字节码)、虚拟机堆栈(存储方法调用上下文)和本地方法区(本地存储代码和常量)。共享区主要包括堆区和JAVA方法堆用于存储对象和组,分为新代和老代,分别对应不同的生命周期和垃圾回收策略。


新生代和老年代

新生代是对象的诞生地,Eden区主要用于创建对象。经过MinorGC(复制算法)后,幸存的对象将被移至Survivor区或老年代。新生代中的垃圾收集旨在快速响应,而老年代负责处理长寿命对象,当空间不足或新对象较大时,MajorGC被激活(清除令牌或令牌碎片整理),这会导致到内存碎片和更长的生命周期。


元数据区域和垃圾收集算法

第8周之后,元数据区域取代了持久代、存储类和元数据信息。垃圾收集器通过引用计数或根搜索算法来识别可回收对象。复制算法高效但不压缩内存,令牌紧缩算法兼具效率和减少碎片。元数据区域的持久性可能会导致OOM(内存不足),因此应谨慎管理。


HotSpotVM采用分代的收集方式,新生代采用复制算法,老年代可以采用Mark-Compact算法。硬引用会导致内存泄漏,而软引用和弱引用则提供了回收内存的灵活性。串行收集器因其简单和高效而常见于单线程场景,ParNew是适合客户端模式下一代回收的多线程版本。


服务器模式垃圾收集器

在服务器模式下,像ParallelScavenge这样的垃圾收集器专注于程序流程,SerialOld提供低暂停的单线程清理,CMS和G1有自己的重点:CMS追求低停顿时间但会影响CPU,而G1则具有灵活的堆区分配和无碎片管理,兼顾低停顿和高吞吐量。


内存管理和类加载

内存泄漏源于对生命周期短的对象的长引用类加载过程包括加载、链接(验证、准备、分析)。和初始化。类只有在第一次使用时才进行初始化。常量池管理会影响类的初始化时间。类加载器遵循双亲委托机制来确保类型安全,而线程上下文加载器则在特定场景下提供灵活性。


了解线程上下文加载器,例如tthread().getContextClassLoader(),有助于处理标准库和自定义实现之间的兼容性问题。


总结

JVM的内存管理和垃圾收集机制是理解Java性能基础的关键。通过深入了解各个区域的特点和回收策略,以及类加载和上下文加载的原理,开发者可以更有效地优化内存使用,保证应用程序的稳定运行。