深入了解JVM和垃圾回收算法

简介: 深入了解JVM和垃圾回收算法

1.什么是JVM?

     JVM是Java虚拟机(Java Virtual Machine)的缩写,是Java程序运行的核心组件。JVM是一个虚拟的计算机,它提供了一个独立的运行环境,可以在不同的操作系统上运行Java程序。

2.如何判断可回收垃圾对象

    Java中的垃圾回收器使用的是“可达性分析”算法来判断对象的可达性。这个算法从一组称为“GC Roots”的对象作为起点,通过引用链追踪所有的引用对象,如果一个对象无法通过任何引用链与GC Roots相连,那么这个对象就是不可达的,即可被判断为垃圾对象。

在Java中,GC Roots是指一组对象,它们被认为是活动的,即不会被垃圾回收器回收的对象。GC Roots包括以下几种实例:

  1. 虚拟机栈(Java虚拟机栈中的局部变量表)中引用的对象
  2. 方法区中类静态属性引用的对象
  3. 方法区中常量引用的对象
  4. 本地方法栈中JNI(Java Native Interface)引用的对象
  5. 活动的线程

3.常见的垃圾算法

 1.标记-清除算法(Mark and Sweep)

      这是最基本的垃圾回收算法之一。在这个算法中,JVM会首先标记所有活动对象,然后清除所有未标记的对象,释放它们所占用的内存空间。缺点:碎片化。

 2.复制算法(Copying)

      这个算法将内存空间划分为两个相等的区域,当一个区域的内存用尽时,JVM会将存活的对象复制到另一个区域,然后清除原区域中的所有对象。这个算法的优点是简单高效,但缺点是需要额外的内存空间。

  3.标记-整理算法(Mark and Compact)

      这个算法结合了标记-清除和复制算法的优点,它首先标记所有活动对象,然后将它们向一端移动,清除另一端的所有对象,从而整理内存空间。缺点:效率比copy略低。

 4.分代收集算法(Generational Garbage Collection)

      是一种用于垃圾回收的策略,它根据对象的存活周期将堆内存分为新生代和老年代,并针对不同代的对象采用不同的垃圾回收算法和策略。

新生代:包括Eden空间和两个Survivor空间(From和To)

老年代:包含长期存活的对象

分代收集算法通常包括以下两个主要的垃圾回收策略:

  1. 新生代垃圾回收:由于大部分对象的生命周期很短,因此新生代的垃圾回收频率较高。通常采用复制算法(Copying)来进行垃圾回收,即将新生代的Eden空间和Survivor空间之间进行对象复制,清除不再使用的对象。这样可以有效地清理短期存活的对象,减少垃圾回收的开销。
  2. 老年代垃圾回收:由于老年代包含长期存活的对象,因此老年代的垃圾回收频率较低。通常采用标记-清除(Mark-Sweep)或标记-整理(Mark-Compact)算法来进行垃圾回收,以清理老年代中的不再使用的对象,并整理内存空间,减少内存碎片化。

4.在分代算法的基础之上,有哪些垃圾回收器

(1)Serial

     Serial收集器采用复制算法(Copying)来进行新生代的垃圾回收。在进行垃圾回收时,Serial收集器会将新生代的Eden区和两个Survivor区之间进行对象复制,清除不再使用的对象。由于它是单线程的,因此在进行垃圾回收时会暂停应用程序的运行,这种方式被称为“Stop-The-World”。

(2)ParNew

     ParNew收集器是一种专门针对新生代的垃圾回收进行了优化的并行垃圾回收器,适用于需要高吞吐量和对响应速度要求较高的应用场景。

(3)Parallel Scavenge

     Parallel Scavenge收集器的设计目标是在多核CPU环境下提供高吞吐量的垃圾回收能力,即在尽量减少垃圾回收暂停时间的同时,尽可能多地利用CPU资源来进行垃圾回收。它采用复制算法(Copying)来进行新生代的垃圾回收,同样会将新生代的Eden区和Survivor区之间进行对象复制,清除不再使用的对象。

(4)CMS

      CMS收集器的垃圾回收过程分为两个阶段:标记阶段和清除阶段。在标记阶段,CMS收集器会通过多线程并发地标记出所有需要回收的对象;在清除阶段,CMS收集器会通过多线程并发地清除标记出来的垃圾对象。优点:减少垃圾回收暂停时间,提高应用程序的响应速度。

(5)Serial Old

      Serial Old收集器是一种专门针对老年代的垃圾回收进行了优化的串行垃圾回收器,适用于对吞吐量要求不是很高,但对内存占用和延迟要求较低的应用场景。

(6)Parallel Old

      Parallel Old收集器用于老年代的垃圾回收,采用多线程并行的方式进行垃圾回收操作,适用于对吞吐量要求较高的应用。

 

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