JVM,GC算法,垃圾回收器,类加载器,进行线上JVM性能调优。

JVM(Java Virtual Machine,Java虚拟机)是Java程序的运行环境,它在操作系统上提供了一个抽象层,使得Java程序可以独立于硬件平台运行。JVM有自己的指令集和内存管理机制,它负责将Java字节码转换为机器码并执行。

垃圾回收(Garbage Collection,GC)是JVM的一个重要特性,它负责自动回收不再使用的内存。GC的目标是尽可能地回收垃圾对象,以释放内存空间,并确保程序的正常运行。GC算法决定了垃圾对象如何被识别和回收。

常见的GC算法有:

引用计数算法(Reference Counting):

        引用计数算法(Reference Counting)用于自动管理内存中的对象。它的主要原理是通过统计每个对象被引用的次数来判断其是否成为垃圾。

在引用计数算法中,每个对象都有一个与之关联的引用计数器。当一个对象被引用时,引用计数器加1;当一个对象的引用被释放时,引用计数器减1。当引用计数器为0时,表示该对象没有被引用,可以将其回收。

引用计数算法的优点包括:

        1. 立即回收:通过实时更新引用计数器,可以在对象不再被引用时立即回收内存,避免了内存占用过长的问题。

        2. 简单高效:引用计数算法相对简单,无需进行全局扫描和标记,垃圾回收的开销较小。

然而,引用计数算法也存在一些缺点:

        1. 循环引用:引用计数算法无法处理循环引用的情况,即两个或多个对象相互引用,但无法被外部访问。这种情况下,引用计数器无法减到0,导致内存泄漏。

        2. 维护开销:引用计数算法需要维护每个对象的引用计数器,引入了额外的开销。

        由于引用计数算法无法处理循环引用的情况,通常在现代的垃圾回收器中很少使用。取而代之的是使用更复杂的算法,如标记-清除算法、复制算法或标记-压缩算法等。这些算法可以更准确地检测和回收垃圾对象,并处理循环引用的情况。

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

        标记-清除算法(Mark and Sweep)用于自动管理内存中的垃圾对象。该算法分为两个阶段:标记阶段和清除阶段。

在标记阶段,从根对象开始,通过遍历对象的引用关系,将所有可达的对象进行标记,表示这些对象是被使用的,不是垃圾。这个过程可以使用深度优先搜索(DFS)或广度优先搜索(BFS)等算法来实现。

        在清除阶段,遍历整个堆内存,将没有被标记的对象视为垃圾对象,并进行清除操作,即释放这些对象所占用的内存。清除操作可以采用简单的内存回收策略,如链表或空闲列表,将垃圾对象的内存添加到空闲列表中,以供后续的内存分配使用。

标记-清除算法的优点包括:

        1. 灵活性:标记-清除算法可以处理任意形状和大小的对象。

        2. 高效性:标记-清除算法只回收垃圾对象,避免了对整个堆内存的扫描,减少了垃圾回收的开销。

然而,标记-清除算法也存在一些缺点:

        1. 内存碎片:清除阶段释放的内存会产生不连续的内存空间,可能导致内存碎片化问题。当需要分配一个大对象时,可能找不到足够的连续内存空间,从而触发额外的内存分配和移动操作。

        2. 暂停时间:标记-清除算法在清除阶段需要遍历整个堆内存,可能导致垃圾回收器停顿的时间较长,影响应用程序的响应性能。

        为了解决标记-清除算法的缺点,现代的垃圾回收器通常采用了更复杂的算法,如复制算法、标记-复制算法、标记-压缩算法等,以提高垃圾回收的效率和内存利用率。

复制算法(Copying):

        复制算法(Copying)用于自动管理内存中的垃圾对象。该算法将堆内存划分为两个区域,通常称为“From区”和“To区”。

        初始时,所有的存活对象都在From区。当进行垃圾回收时,算法会遍历From区中的所有存活对象,并将其复制到To区。复制的过程是逐个对象进行的,将每个对象按照其大小和形状复制到To区的合适位置,并更新对象的引用关系。复制过程中,对象之间的引用关系也会被调整。

        复制完成后,From区中所有没有被复制的对象即为垃圾对象,可以直接丢弃或重用。而To区中的所有对象都是存活对象。为了交换From区和To区的角色,即使To区的空间不足以容纳所有存活对象,也会进行角色互换。

复制算法的优点包括:

        1. 消除了内存碎片:复制算法将存活对象复制到新区域,不会产生内存碎片化问题,从而避免了内存碎片导致的空间浪费和内存碎片化的影响。

        2. 简单高效:复制算法的实现相对简单,只需要维护两个区域的指针,复制存活对象并调整引用关系即可。

然而,复制算法也存在一些缺点:

        1. 内存利用率低:由于需要将存活对象复制到新区域,需要额外的内存空间。复制算法的可用内存空间实际上是原来堆内存空间的一半。

        2. 频繁的复制操作:当存活对象较多时,复制算法需要频繁地进行复制操作,可能导致性能下降。

        为了克服复制算法的缺点,现代的垃圾回收器通常采用了其他的算法,如标记-复制算法、标记-压缩算法等,以提高内存利用率和垃圾回收的效率。

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

        标记-整理算法(Mark and Compact)用于自动管理内存中的垃圾对象。该算法由两个主要的步骤组成:标记和整理。

        标记阶段与标记-清除算法类似,通过遍历程序的对象图,标记所有的存活对象。标记的方式可以是从根对象开始,递归遍历所有可达对象,或者使用追踪式垃圾回收器进行标记。

整理阶段是标记-整理算法的核心步骤。在整理阶段,所有存活的对象都被移动到一端,以保持对象之间的连续性。具体而言,算法会将所有存活对象移动到堆内存的一端,并将它们紧凑排列,其间没有空闲空间。这样,所有的垃圾对象将会被清理出堆内存,并使得剩下的内存区域变成一块连续的可用空间。

        整理过程中,对象之间的引用关系需要进行相应的更新,以确保对象之间的引用关系不会出错。当整理完成后,堆内存的一端将会是所有存活对象的集合,而另一端则是空闲空间,可以重新分配给新的对象。

标记-整理算法的优点包括:

        1. 消除了内存碎片:通过整理内存,标记-整理算法可以消除内存碎片,从而提高了内存利用率。

        2. 维持对象的连续性:整理阶段将存活对象紧凑排列在一起,提高了内存的局部性,从而有利于提高缓存的命中率和程序的执行效率。

然而,标记-整理算法也存在一些缺点:

        1. 整理过程的开销:整理阶段需要将存活对象移动到一端,这可能会导致整理过程的开销较大,特别是当存活对象较多时。

        2. 需要额外的空间:在整理过程中,需要额外的空间来暂存移动的对象,以及标记对象是否已被移动的信息。

        标记-整理算法相对于复制算法和标记-清除算法来说,是一种综合性能较好的垃圾回收算法,在现代的垃圾回收器中得到广泛应用。

JVM内置了多种垃圾回收器,常用的有:

Serial收集器:

        Serial收集器为单线程执行,适用于小型应用和客户端应用,停顿时间较长。它是Java虚拟机中的一种垃圾回收器,也被称为Serial Scavenge收集器。它是一种以单线程方式运行的垃圾回收器,主要用于客户端应用和低配置服务器的场景下。

Serial收集器的工作原理如下:

        1. 应用程序停顿:Serial收集器会暂停应用程序的运行,以便进行垃圾回收。这种停顿时间相对较长,可能会对应用的响应性产生一定的影响。

        2. 标记-压缩算法:Serial收集器使用标记-压缩算法进行垃圾回收。首先,它会遍历堆中的对象,标记出所有存活的对象。然后,它会对标记过的对象进行压缩,释放没有被引用的对象占用的内存空间。

Serial收集器相较于其他垃圾回收器具有以下特点:

        1. 单线程执行:Serial收集器只使用单线程进行垃圾回收,这可以使得它相对于其他并行垃圾回收器更加简单和轻量。

        2. 简单高效:由于单线程执行,Serial收集器对垃圾回收的开销比较小,适用于资源较为有限的环境。

        3. 低延迟:Serial收集器的停顿时间相对较长,但在内存较小且并发需求较低的场景下,可以提供较低的延迟。

        Serial收集器的缺点是无法充分利用多核处理器的性能,因为它只使用单个线程进行垃圾回收。此外,它的停顿时间较长,不适用于对响应性要求较高的应用场景。因此,在选择使用Serial收集器时,需要根据具体的应用场景和性能需求进行评估和测试。

Parallel收集器:

        Parallel收集器是一种以高吞吐量为目标的垃圾回收器,主要用于在后台快速回收大量垃圾对象的场景下。

Parallel收集器的工作原理如下:

  1. 并行扫描和标记(Parallel Scanning and Marking):Parallel收集器使用多线程并行地扫描堆中的对象,并标记所有的存活对象。这个过程会对应用程序的运行产生一定的停顿,但是由于采用了多线程并行的方式,所以可以在较短的时间内完成。

  2. 并行回收(Parallel Major Collection):Parallel收集器采用多线程并行地进行垃圾回收,从堆中回收标记为垃圾的对象。这个过程也会对应用程序产生一定的停顿,但是由于采用了多线程并行的方式,所以可以在较短的时间内完成。

Parallel收集器相较于其他垃圾回收器具有以下优点:

  1. 高吞吐量:Parallel收集器通过使用多线程并行地扫描、标记和回收垃圾对象,可以充分利用多核处理器的性能,提供高吞吐量的垃圾回收。

  2. 快速回收:Parallel收集器专注于快速回收大量垃圾对象,适用于需要快速地清理大量临时对象的场景。

  3. 自适应调节:Parallel收集器在运行时可以根据系统的负载情况动态地调整垃圾回收的策略和参数,以达到最佳的性能表现。

        然而,Parallel收集器也存在一些缺点,如会产生较长的停顿时间、不适用于对延迟要求较高的应用场景等。因此,在选择使用Parallel收集器时需要根据具体的应用场景和性能要求进行评估和测试。

CMS(Concurrent Mark Sweep)收集器

        CMS(Concurrent Mark Sweep)收集器在JDK 1.4版本中首次引入,并在JDK 5中成为默认的垃圾回收器。CMS收集器被设计用于在减少应用程序停顿时间的同时,尽量减少垃圾回收的开销。CMS收集器的工作原理如下:

  1. 初始标记(Initial Mark):CMS收集器会首先进行一次短暂的STW(Stop-The-World)停顿,标记所有的根对象,并标记在根对象可达的情况下,直接与其关联的存活对象。这个过程很快完成,因为只是标记了部分对象。

  2. 并发标记(Concurrent Marking):在应用程序运行的同时,CMS收集器使用多线程来标记所有的存活对象。这个过程会耗费一定的时间,但是不会导致应用程序的停顿。

  3. 并发预清理(Concurrent Pre-Cleaning):在并发标记阶段结束后,CMS收集器会进行一次并发的预清理过程,用于处理在并发标记期间产生的垃圾对象。

  4. 重新标记(Remark):在应用程序运行的同时,CMS收集器会进行一次短暂的STW停顿,用于处理在并发标记和并发预清理过程中产生的垃圾对象。

  5. 并发清除(Concurrent Sweep):在重新标记后,CMS收集器会使用多线程来清理标记为垃圾的对象。这个过程会耗费一定的时间,但是不会导致应用程序的停顿。

CMS收集器相较于传统的垃圾回收器具有以下优点:

  1. 低停顿:CMS收集器通过在应用程序运行的同时进行垃圾回收,减少了垃圾回收对应用程序的影响,降低了停顿时间。
  2. 高并发:CMS收集器使用多线程进行垃圾回收,能够充分利用多核处理器的性能,实现高并发的垃圾回收。
  3. 低延迟:CMS收集器通过并发标记和并发清除过程,减少了垃圾回收的停顿时间,提供更低的延迟。
  4. 高吞吐量:CMS收集器在大堆内存、低延迟要求的应用场景下具有很好的性能表现和可预测性。

        然而,CMS收集器也存在一些缺点,如可能产生内存碎片、并发标记过程会消耗一定的CPU资源等。所以在一些特定的应用场景下,可能需要进行适当的调优和配置选择来提高CMS收集器的性能和稳定性。

G1(Garbage-First)收集器:

        G1(Garbage-First)收集器在JDK 7u4版本中首次引入,并在JDK 9中成为默认的垃圾回收器。

        G1收集器的设计目标是在有限的停顿时间内达到高吞吐量的垃圾回收效果。它将堆内存划分为多个大小相等的区域(Region),每个区域可以是Eden区、Survivor区或Old区。G1收集器会根据应用的行为动态地调整这些区域的大小,以适应不同的内存需求。

G1收集器的工作原理如下:

  1. 初始标记(Initial Mark):G1收集器会首先进行一次短暂的STW(Stop-The-World)停顿,标记所有的根对象,并标记在根对象可达的情况下,直接与其关联的存活对象。这个过程很快完成,因为只是标记了部分对象。

  2. 并发标记(Concurrent Marking):G1收集器使用并发线程来标记存活对象。在应用程序运行的同时,G1收集器会遍历整个堆,并标记所有的存活对象。这个过程会耗费一定的时间,但是不会导致应用程序的停顿。

  3. 高吞吐量:G1收集器能够在有限的停顿时间内达到高吞吐量,减少了垃圾回收对应用程序的影响。

  4. 可预测的停顿时间:G1收集器通过预先设置的目标停顿时间,可以更好地控制垃圾回收过程的停顿时间,减少了长时间的停顿造成的性能问题。

  5. 避免内存碎片:G1收集器采用了不同于传统的分代收集的方式,将堆内存划分为多个区域,可以更好地处理大堆内存情况下的碎片问题。

  6. 最终标记(Final Mark):在并发标记完成后,G1收集器需要再次进行一次短暂的STW停顿,来完成本次垃圾回收前的最后一次标记。这个过程会标记在并发标记期间产生的垃圾对象。

  7. 筛选回收(Live Data Counting):G1收集器会根据每个区域中存活对象的数量和可回收时间来进行优先级排序,优先回收含有垃圾最多的区域。G1收集器先回收垃圾最多的区域,因此被称为Garbage-First。

  8. 它在JDK 7u4版本中首次引入,并在JDK 9中成为默认的垃圾回收器。G1收集器的设计目标是在有限的停顿时间内达到高吞吐量的垃圾回收效果。它将堆内存划分为多个大小相等的区域(Region),每个区域可以是Eden区、Survivor区或Old区。G1收集器会根据应用的行为动态地调整这些区域的大小,以适应不同的内存需求。G1收集器的工作原理如下:

G1收集器相较于传统的垃圾回收器具有以下优点:

  1. 高吞吐量:G1收集器能够在有限的停顿时间内达到高吞吐量,减少了垃圾回收对应用程序的影响。

  2. 可预测的停顿时间:G1收集器通过预先设置的目标停顿时间,可以更好地控制垃圾回收过程的停顿时间,减少了长时间的停顿造成的性能问题。

  3. 避免内存碎片:G1收集器采用了不同于传统的分代收集的方式,将堆内存划分为多个区域,可以更好地处理大堆内存情况下的碎片问题。

        G1收集器在大堆内存、低延迟要求的应用场景下具有很好的性能表现和可预测性,是目前JVM中被广泛应用的垃圾回收器之一。

类加载器(ClassLoader)

        类加载器(ClassLoader)负责将Java字节码加载到内存中,并创建相应的Class对象。Java程序在运行时动态加载类,而不是像编译型语言一样在编译时静态加载。类加载器采用了双亲委派模型,即先由上层的类加载器尝试加载,如果找不到则由下层的类加载器加载。

它是Java虚拟机(JVM)的一部分,用于将类文件(class文件)加载到内存中,并生成对应的Class对象。类加载器负责定位和加载类文件,并将其转换为可在JVM中运行的二进制格式。

类加载器具有以下功能:

        1. 类的查找和加载:类加载器通过提供加载类的能力,按照一定的规则查找类文件,并将其加载到内存中。类加载器负责将类文件解析为字节码,并创建对应的Class对象。

        2. 类的链接:类加载器在加载类文件后,会进行类的链接操作。链接的过程包括验证类文件的合法性、准备类变量和静态变量的内存空间,并解析符号引用等。

        3. 类的初始化:在类加载器加载类文件后,会进行类的初始化操作。类的初始化过程包括执行静态代码块和静态变量的赋值等。

        类加载器采用的是委托模型,即当一个类加载器需要加载一个类时,它会先委托给其父类加载器进行加载。只有在父类加载器无法加载该类时,子类加载器才会尝试加载。这个机制保证了类的唯一性和不重复加载。

Java中默认的类加载器有以下几种:

        1. 启动类加载器(Bootstrap ClassLoader):也称为引导类加载器,是JVM的一部分,负责加载Java核心类库。它是JVM内部的一部分,由C++实现,无法直接在Java代码中进行引用。

        2. 扩展类加载器(Extension ClassLoader):负责加载Java的扩展类库,如$JAVA_HOME/lib/ext目录下的类库。

        3. 应用程序类加载器(Application ClassLoader):也称为系统类加载器,负责加载应用程序的类文件。它是ClassLoader类的子类,是Java程序中默认的类加载器。

        除了这三个默认的类加载器,还可以自定义类加载器,并通过继承ClassLoader类来实现。自定义类加载器可以实现更灵活的类加载策略,如从非标准的位置加载类文件、对类文件进行解密等。

线上JVM性能调优的目标是提高应用的吞吐量和响应时间,常用的调优手段包括:

  1. 调整堆内存大小:根据应用的特点和硬件环境,合理设置堆内存大小,避免频繁的垃圾回收。

  2. 选择合适的垃圾回收器:根据应用的特点和需求,选择合适的垃圾回收器,例如对响应时间要求高的应用可以选择CMS或G1收集器。

  3. 设置合适的垃圾回收参数:通过调整垃圾回收参数,如新生代和老年代的比例、晋升老年代的阈值等,来达到更好的性能。

  4. 分析GC日志:通过分析垃圾回收日志,了解GC过程中各个阶段的耗时和内存情况,找出性能瓶颈并进行优化。

  5. 避免内存泄漏:及时释放不再使用的对象,避免内存泄漏导致内存占用过高。

  6. 使用工具进行分析和监控:使用工具如JVisualVM、GC日志分析工具、堆内存分析工具等进行实时监控和分析,帮助定位和解决性能问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/742817.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

清廉机关建设宣传稿件怎样联系媒体投稿发表?

在推进清廉机关建设的伟大征程中,我们深知信息宣传的重要性。如何将清廉机关建设的成果和理念广泛传播,让更多人了解并参与到这一伟大事业中来,成为我们面临的重要课题。 过去,我们或许曾经历过联系媒体投稿的种种心酸。一家家媒体的联系,一次次的等待与回复,其中的艰辛与不易…

mapperXML标签总结

MyBatis 的真正强大在于它的语句映射,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,省掉了将近 95% 的代码。MyBatis 致力于减少使用成本,让用户能更专注于…

春风吹又生的开源项目「GitHub 热点速览」

随着上周知名 Switch 开源模拟器 Yuzu(柚子)被任天堂起诉,该项目作者就删库了,但还是要赔偿任天堂数百万美元。此事还在 GitHub 上掀起了一波 Yuzu fork 项目的小浪潮,正所谓野火烧不尽,春风吹又生。 很多读…

Unity使用Addressable热更新

先看热更新的gif: Addressable是Unity推出的打ab包方案。不需要手动写AB打包脚手架了,不需要关心依赖,这也简化了ab热更新的流程。Addressable打包需要先将资源放入group中,按group来打包,每个group对应一个ScriptableObject的配置…

大模型学习笔记(一):部署ChatGLM模型以及stable-diffusion模型

大模型学习笔记(一):部署ChatGLM模型以及stable-diffusion模型 注册算力平台(驱动云平台)1.平台注册2.查看算力3.进入平台中心 部署ChatGLM3-6B模型1.创建项目2.配置环境设置镜像源、克隆项目修改requirements 3.修改w…

【git报错】【重置代理】Failed to connect to github.com port 443: Connection refused

重置代理 git config --global --unset http.proxy git config --global --unset https.proxy

VC-旅游系统-213-(代码+说明)

转载地址: http://www.3q2008.com/soft/search.asp?keyword旅游系统 旅游信息管理系统开题报告 一、研究目的 旅游信息管理系统能帮助旅行社在游客的市场开拓、游客的信息管理、客户服务等方面进行综合处理。使旅行社能够准确的掌握客户的市场动态,充分了解对客户…

嵌入式学习day37 数据结构

1.sqlite3_open int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); 功能: 打开数据库文件(创建一个数据库连接) 参数: filename:数据库文…

盲盒网站遭遇DDoS攻击,高防ip是如何起到安全防护的?

随着盲盒市场的快速发展和在线盲盒平台的普及,网站安全问题备受关注。其中,DDoS(分布式拒绝服务)攻击是一种常见的网络安全威胁,会给盲盒网站带来严重的影响,如网络中断、系统崩溃等问题。为了应对这种风险…

python使用rabbitmq发送消息和接收消息数据

发送消息 import pika# 设置RabbitMQ连接参数(更改账号密码) credentials pika.PlainCredentials(username, password) # 更改为自己的服务器地址 parameters pika.ConnectionParameters(192.168.0.157, 5672, /, credentials)# 建立到RabbitMQ的连接 connection pika.Bloc…

华为配置OSPF的Stub区域示例

配置OSPF的Stub区域示例 组网图形 图1 配置OSPF Stub区域组网图 Stub区域简介配置注意事项组网需求配置思路操作步骤配置文件 Stub区域简介 Stub区域的ABR不传播它们接收到的自治系统外部路由,在Stub区域中路由器的路由表规模以及路由信息传递的数量都会大大减少…

自然语言处理(NLP)技术的概念及优势

自然语言处理(NLP)是人工智能领域的一个重要分支,其目标是使计算机能够理解、处理和生成人类自然语言的形式和含义。 NLP技术的优势包括: 实现人机交互:NLP技术可以使计算机与人类之间实现自然的语言交互&#xff0c…

有来团队后台项目-解析7

sass 安装 因为在使用vite 创建项目的时候,已经安装了sass,所以不需要安装。 如果要安装,那么就执行 npm i -D sass 创建文件 src 目录下创建文件 目录结构如图所示: reset.scss *, ::before, ::after {box-sizing: border-…

使用CrossOver 在Mac 运行Windows 软件|D3DMetal是什么技术,

CrossOver Mac 使用特点 • 免费试用 14 天,可使用 CrossOver Mac 全部功能,• 试用过期会保留之前安装的 Windows 软件• 使 Mac 运行 Windows 程序 使用CrossOver在Mac上运行Windows软件是一个方便且无需安装完整Windows操作系统的解决方案。CrossOve…

macOS安装maven

官网下载maven https://maven.apache.org/download.cgi如下图所示: 1.解压并复制到指定的目录中2.配置环境变量 vim ~/.bash_profile进行文件的修改 export M2_HOME/Users/fanfan/company/apache-maven-3.9.6 export PATH$PATH:$M2_HOME/bin3.终端中输入source ~…

如何从笔记本电脑恢复已删除的照片

人们相信照片是回忆一生中最难忘事件的最佳媒介。人们在计算机上收集超过 5 GB 的照片是很常见的。然而,在笔记本电脑上保存照片并不安全,因为您可能会因以下原因有意或无意地删除笔记本电脑上的照片: 您的笔记本电脑存储空间几乎已满。您必…

【Vite+Ts】自动按需引入Element-Plus

安装插件 cnpm i -D unplugin-vue-components unplugin-auto-import unplugin-element-plus修改vite.config.ts // vite.config.ts import AutoImport from "unplugin-auto-import/vite"; import Components from "unplugin-vue-components/vite"; impor…

WWW2024 | PromptMM:Prompt-Tuning增强的知识蒸馏助力多模态推荐系统

论文:https://arxiv.org/html/2402.17188v1 代码:https://github.com/HKUDS/PromptMM 研究动机 多模态推荐系统极大的便利了人们的生活,比如亚马逊和Netflix都是基于多模态内容进行推荐的。对于研究,人们也遵循工业界的趋势,进行modality-aware的用户…

Http 请求状态码

HTTP状态码是服务器用于告知客户端网页或资源的请求状态的三位数字代码。这些状态码分为五个类别,每个类别有不同的用途: 1xx - 信息性状态码 100 Continue:客户端应继续其请求101 Switching Protocols:请求者已要求服务器切换协…

[笔记] Docker 安装脚本分析

最近在研究 wsl 上安装 Docker ,查了一些资料找到官网提供的安装脚本,感觉比较有意思所以拿来分析一波: https://get.docker.com 使用 curl 下载脚本 在介绍中有一个命令行用于下载该脚本: curl -fsSL https://get.docker.com…