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区因为比较小,就可以用标记-清除算法,老年代空间比较大,就可以用标记-整理算法。

相关文章
|
6月前
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
593 55
|
11月前
|
监控 算法 Java
Java虚拟机(JVM)垃圾回收机制深度剖析与优化策略####
本文作为一篇技术性文章,深入探讨了Java虚拟机(JVM)中垃圾回收的工作原理,详细分析了标记-清除、复制算法、标记-压缩及分代收集等主流垃圾回收算法的特点和适用场景。通过实际案例,展示了不同GC(Garbage Collector)算法在应用中的表现差异,并针对大型应用提出了一系列优化策略,包括选择合适的GC算法、调整堆内存大小、并行与并发GC调优等,旨在帮助开发者更好地理解和优化Java应用的性能。 ####
288 27
|
12月前
|
监控 算法 Java
Java虚拟机(JVM)的垃圾回收机制深度解析####
本文深入探讨了Java虚拟机(JVM)的垃圾回收机制,旨在揭示其背后的工作原理与优化策略。我们将从垃圾回收的基本概念入手,逐步剖析标记-清除、复制算法、标记-整理等主流垃圾回收算法的原理与实现细节。通过对比不同算法的优缺点及适用场景,为开发者提供优化Java应用性能与内存管理的实践指南。 ####
|
6月前
|
缓存 算法 Java
JVM深入原理(八)(一):垃圾回收
弱引用-作用:JVM中使用WeakReference对象来实现软引用,一般在ThreadLocal中,当进行垃圾回收时,被弱引用对象引用的对象就直接被回收.软引用-作用:JVM中使用SoftReference对象来实现软引用,一般在缓存中使用,当程序内存不足时,被引用的对象就会被回收.强引用-作用:可达性算法描述的根对象引用普通对象的引用,指的就是强引用,只要有这层关系存在,被引用的对象就会不被垃圾回收。引用计数法-缺点:如果两个对象循环引用,而又没有其他的对象来引用它们,这样就造成垃圾堆积。
181 0
|
6月前
|
算法 Java 对象存储
JVM深入原理(八)(二):垃圾回收
Java垃圾回收过程会通过单独的GC线程来完成,但是不管使用哪一种GC算法,都会有部分阶段需要停止所有的用户线程。这个过程被称之为StopTheWorld简称STW,如果STW时间过长则会影响用户的使用。一般来说,堆内存越大,最大STW就越长,想减少最大STW,就会减少吞吐量,不同的GC算法适用于不同的场景。分代回收算法将整个堆中的区域划分为新生代和老年代。--超过新生代大小的大对象会直接晋升到老年代。
148 0
|
8月前
|
缓存 监控 算法
JVM简介—2.垃圾回收器和内存分配策略
本文介绍了Java垃圾回收机制的多个方面,包括垃圾回收概述、对象存活判断、引用类型介绍、垃圾收集算法、垃圾收集器设计、具体垃圾回收器详情、Stop The World现象、内存分配与回收策略、新生代配置演示、内存泄漏和溢出问题以及JDK提供的相关工具。
JVM简介—2.垃圾回收器和内存分配策略
|
8月前
|
监控 算法 Java
JVM—垃圾收集算法和HotSpot算法实现细节
JVM的垃圾收集算法和HotSpot的实现细节复杂但至关重要,通过理解和掌握这些算法,可以为Java应用程序选择合适的垃圾收集器,并进行有效的性能调优。选择适当的垃圾收集策略,结合合理的内存配置和日志分析,能够显著提升应用的运行效率和稳定性。
167 15
|
12月前
|
机器学习/深度学习 监控 算法
Java虚拟机(JVM)的垃圾回收机制深度剖析####
本文深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法、性能调优策略及未来趋势。通过实例解析,为开发者提供优化Java应用性能的思路与方法。 ####
268 28
|
11月前
|
算法 网络协议 Java
【JVM】——GC垃圾回收机制(图解通俗易懂)
GC垃圾回收,标识出垃圾(计数机制、可达性分析)内存释放机制(标记清除、复制算法、标记整理、分代回收)
|
11月前
|
存储 监控 算法
Java虚拟机(JVM)垃圾回收机制深度解析与优化策略####
本文旨在深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法及参数调优方法。通过剖析垃圾回收的生命周期、内存区域划分以及GC日志分析,为开发者提供一套实用的JVM垃圾回收优化指南,助力提升Java应用的性能与稳定性。 ####