发布网友
共1个回答
热心网友
前言:
背景:JVM(Java Virtual Machine)是Java程序的虚拟机,提供于操作系统的运行环境,使Java程序可以在任何支持JVM的计算机上运行。JVM的内存管理机制中的GC(Garbage Collection)负责加载、验证、解释、执行和垃圾回收Java字节代码,提供内存管理、线程管理和安全控制等服务。
JVM中的GC有两种主要类型:Young GC和Full GC。Young GC针对新生代对象的回收,通常使用复制算法或标记整理算法,因其对象生命周期短而速度快;Full GC针对整个堆内存的回收,用于回收Young GC中未回收的存活对象,速度较慢。
设计Java应用时,应尽量减少Full GC次数,以保证系统性能,方法包括增大新生代内存空间、减少数组长度等。
理解Young GC的诞生过程:复制算法和标记整理算法是两种不同的Young GC回收算法。复制算法将新生代内存分为两部分,新创建的对象存储在一部分,存活对象存储在另一部分,当新生代内存不足时,Young GC发生,将存活对象复制到另一部分。标记整理算法先标记存活对象,然后整理不存活的对象。Young GC本质上是JVM正常的垃圾回收过程。
Full GC是整个堆内存的回收过程,可能导致应用程序暂停。避免Full GC的关键在于合理内存分配,减少不使用的对象,调整堆内存扫描时间。
全垃圾回收(Full GC)是垃圾回收过程,会暂停所有应用程序线程,对整个堆进行回收。过程包括初始标记、并发标记、重新标记、整理和回收。
编写代码时,可通过调整堆内存大小、优化代码、使用较大的新生代、选择适当的垃圾回收算法等方法避免Full GC。
具体实例:避免使用不必要的临时对象、尽早释放对象、重复使用对象、使用对象池、使用弱引用。例如,避免频繁创建和销毁对象,使用弱引用减少GC频率。
测试阶段关注点:定期监测GC日志、优化数据结构减小数据对象生命周期、关注单元测试,通过测试评估内存使用情况。
总结:日常业务代码测试中,对内存的敏感度要高,尽管系统成熟可靠,但在面对大促压力时,提前解决内存隐患可以节省压测工作量。