JVM 垃圾回收与垃圾回收算法

简介: JVM 垃圾回收与垃圾回收算法

垃圾回收

啥是垃圾回收?为什么要进行垃圾回收?是怎么进行垃圾回收的?这一套组合拳问题,我想大家都有思考过,下面就来说说他相关的问题

一 垃圾回收概念

JVM运行时,因为他是一个虚拟机,虚拟机就要有内存,而这个内存是我们来指定的,因为任何一个机器运行起来都需要内存,当程序运行起来的时候,java会创建很多对象来操作,这些对象都需要空间来存储,而他们就是存储在jvm的内存中的,前面我们说了jvm的内存模型,就对应了对象的存储,而如果一直存储最终jvm的内存一定会被耗尽,索引我们要检出一些无用的对象进行清除,而这个过程就是垃圾回收。

二 垃圾回收的实现

1 判断对象已死

1)引用计数法

他就是说如果一个对象被引用,那么这个对象就是存活的就不应该被回收,但是有一个问题,如果两个对象互相引用,那就处理不了了。

ObjectA.instance = ObjectB 
ObjectB.instance = ObjectA

2)可达性分析法

他是以GcRoot作为起始点,如果对象和这个GcRoot有关联,那么证明这个对象就是存活的,反之就是说明这个对象是可以被回收的。

可以作为GCRoot的有下面几种

   ·虚拟机栈 A a = new A()
   ·静态属性引用的对象
   ·常量引用的对象
   ·本地方法栈中引用的对象

2 Java堆的回收

因为他占用的内存空间最大,所以垃圾回收主要几种在这里,他的过程是
创建对象的时候,会给对象分配内存,这时候如果对象大于Edgn区的存储空间,那么就放到老年代区,如果不大于就放到Edgn区,如果Edgn区满了,就会触发youngGc,没有被引用就会方法Survivor区,那放到他的哪块空间呢,会放到没有使用的s空间,然后把使用的那块空间清除,之后交换位置,如果ygc后占用的空间大于Survivor区的最大空间,那么就放到老年代,那互相交换的那部分会一直交换吗?不回,有一个最大次数,15次,如果交换次数大于15次,那就把Survivor区的存储放到老年代区,如果老年代放不下了,那就会触发FullGC,如果FullGc后老年代还放不下,那就OOM了。

3 元空间的回收

一直以来,因为Java堆占用的内存比较多,所以给人一种只要堆才会垃圾回收,其实是不对的元空间也会进行垃圾回收,比如定义一个String abc,但是他没有被引用,但是他又被存放在常量池,那这种那几回收的时候会被回收的,他也有几种场景

  ·该类的实例已经被回收,堆中没有存储这个对象的实例
  ·加载该类的ClassLoader已经被回收

在大量使用反射,动态代理的时候,就需要回收元空间的数据,否者元空间也会OOM

三 垃圾回收算法

1 标记-清除算法

这种算法就是在程序中标记出所有要清楚的对象,标记完成后统一清楚,他的缺点集中在两点,第一点就是标记和清除效率都不高,第二点就是清楚后会产生大量的空间碎片,这样会导致为大对象分配内存时,因为没有连续的空间,而不得不触发一次垃圾回收。

2 复制算法

为了解决效率问题而出现,他是把内存区域分成两块,第一块用完了,就把还存活的对象复制到另一块去,然后把已使用的空间一次性的清理掉。他的缺点就是太耗费空间,把一个空间分两块代价有点大。

3 标记-整理算法

他是在标记-清除算法基础上的,但是他解决了空间碎片问题,他是让所有存活的对象都向一个方向移动,最终不回产生连续的空间碎片

4 分代收集算法

现在的虚拟机基本上都是使用这种,因为堆中不同的区域适用不同的算法,比如堆的S1区和S2区,他们就是两个相同空间的内存区域,就可以用复制算法,edgn区因为比较小,就可以用标记-清除算法,老年代空间比较大,就可以用标记-整理算法。

相关文章
|
1月前
|
存储 算法 Java
Java面试题:深入探究Java内存模型与垃圾回收机制,解释JVM中堆内存和栈内存的主要区别,谈谈对Java垃圾回收机制的理解,Java中的内存泄漏及其产生原因,如何检测和解决内存泄漏问题
Java面试题:深入探究Java内存模型与垃圾回收机制,解释JVM中堆内存和栈内存的主要区别,谈谈对Java垃圾回收机制的理解,Java中的内存泄漏及其产生原因,如何检测和解决内存泄漏问题
37 0
|
7天前
|
存储 算法 Java
JVM自动内存管理之垃圾收集算法
文章概述了JVM内存管理和垃圾收集的基本概念,提供一个关于JVM内存管理和垃圾收集的基础理解框架。
JVM自动内存管理之垃圾收集算法
|
20天前
|
存储 监控 算法
(六)JVM成神路之GC基础篇:对象存活判定算法、GC算法、STW、GC种类详解
经过前面五个章节的分析后,对于JVM的大部分子系统都已阐述完毕,在本文中则开始对JVM的GC子系统进行全面阐述,GC机制也是JVM的重中之重,调优、监控、面试都逃不开的JVM话题。
|
23天前
|
Java
Jinfo 查看 jvm 配置及使用 Jstat 查看堆内存使用与垃圾回收
Jinfo 查看 jvm 配置及使用 Jstat 查看堆内存使用与垃圾回收
29 5
|
23天前
|
存储 算法 Java
JVM 垃圾回收算法与垃圾回收器
JVM 垃圾回收算法与垃圾回收器
26 3
|
3天前
|
算法 Java 应用服务中间件
探索JVM垃圾回收算法:选择适合你应用的最佳GC策略
探索JVM垃圾回收算法:选择适合你应用的最佳GC策略
|
26天前
|
监控 Java 运维
开发与运维收集问题之jstat命令查看JVM垃圾回收情况如何解决
开发与运维收集问题之jstat命令查看JVM垃圾回收情况如何解决
14 1
|
1月前
|
算法 Java
Java面试题:解释垃圾回收中的标记-清除、复制、标记-压缩算法的工作原理
Java面试题:解释垃圾回收中的标记-清除、复制、标记-压缩算法的工作原理
33 1
|
20天前
|
弹性计算 运维 Java
Serverless 应用引擎使用问题之JVM进行垃圾回收时重启,该如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
1月前
|
存储 监控 算法
探索Java虚拟机:深入理解JVM内存模型和垃圾回收机制
在Java的世界中,JVM是核心所在,它不仅承载着代码的运行,还管理着内存资源。本文将带你深入了解JVM的内存模型和垃圾回收机制,通过具体数据与案例分析,揭示它们对Java应用性能的影响,并探讨如何优化JVM配置以提升效率。