Java面试之JVM篇(共七篇---完结)

Java面试之虚拟机篇(一):JVM概述与内存结构

在Java的面试中,虚拟机(JVM)是必考的知识点之一。作为Java程序运行的基础环境,JVM对Java的性能和稳定性有着至关重要的影响。本文将首先介绍JVM的基本概念,然后深入探讨其内存结构。

一、JVM概述

JVM,全称Java Virtual Machine,即Java虚拟机,它是Java程序的运行环境。JVM的主要职责是将Java字节码转换为特定系统架构上的机器码并执行,从而实现“一次编写,到处运行”的目标。

JVM的主要特点包括:

  1. 平台无关性:JVM屏蔽了底层操作系统的差异,使得Java程序可以在不同的操作系统上运行。
  2. 内存管理:JVM提供了自动内存管理机制,包括垃圾回收等,减轻了程序员的负担。
  3. 安全性:JVM通过沙箱机制等手段,保证了Java程序的安全执行。

二、JVM内存结构

JVM的内存结构主要包括以下几个部分:

  1. 方法区(Method Area):存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
  2. 堆(Heap):存放对象实例,几乎所有的对象实例都在这里分配内存。堆是垃圾收集器管理的主要区域,因此也被称作GC堆(Garbage Collected Heap)。
  3. 栈(Stack):每个线程都有一个私有的栈,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。栈中的生命周期与线程同步,每个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
  4. 程序计数器(Program Counter Register):较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。
  5. 本地方法栈(Native Method Stack):与虚拟机栈所发挥的作用非常相似,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务。

理解JVM的内存结构,有助于我们更好地优化Java程序的性能,避免内存泄漏等问题。在后续的博文中,我们将进一步探讨JVM的垃圾回收机制、类加载机制等高级话题。

Java面试之虚拟机篇(二):JVM的垃圾回收与类加载机制

在上一篇文章中,我们介绍了JVM的基本概念和内存结构。在Java面试中,除了需要了解JVM的基本结构,还需要深入理解其垃圾回收和类加载机制。本文将围绕这两个主题展开探讨。

一、JVM的垃圾回收机制

垃圾回收(Garbage Collection,GC)是JVM内存管理的重要部分。当Java对象不再被引用时,其占用的内存就需要被释放,这个过程就是由垃圾回收器来完成的。

垃圾回收的基本流程包括:

  1. 标记阶段:从根对象(如静态变量、活动线程等)开始,递归地访问对象的引用链,将所有可达的对象标记为存活。
  2. 清除阶段:遍历整个堆内存,回收未被标记的对象占用的内存。

JVM提供了多种垃圾回收算法和策略,如分代收集算法、标记-清除算法、标记-整理算法等。不同的算法和策略适用于不同的应用场景,需要根据实际情况进行选择。

在面试中,可能会涉及到如何选择合适的垃圾回收器、如何优化垃圾回收性能等问题。因此,深入理解JVM的垃圾回收机制是非常有必要的。

二、JVM的类加载机制

类加载(Class Loading)是JVM将类的.class文件中的二进制数据读入到内存中,将其放在运行时的方法区,然后在堆中创建一个java.lang.Class对象,用来表示这个类。

类加载的主要步骤包括:

  1. 加载:通过类的全名获取定义此类的二进制字节流。
  2. 链接:验证字节流的正确性,并为类的静态变量分配内存,将其初始化为默认值。
  3. 初始化:为类的静态变量赋予正确的初始值。

在Java中,类的加载是懒加载的,即只有在真正需要使用类的时候才会进行加载。这种机制可以提高程序的启动速度,并减少不必要的内存占用。

类加载器(ClassLoader)是JVM中实现类加载机制的关键部分。JVM提供了三种类加载器:启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和系统类加载器(System ClassLoader)。这些类加载器协同工作,共同完成了类的加载任务。

在面试中,可能会涉及到类加载的过程、类加载器的种类和作用、双亲委派模型等问题。因此,对JVM的

Java面试之虚拟机篇(三):JVM调优与诊断工具

在深入了解了JVM的内存结构、垃圾回收和类加载机制后,我们还需要掌握如何进行JVM调优以及如何使用JVM的诊断工具。在Java面试中,这些知识点同样重要。本文将重点讨论JVM调优的常用策略以及JVM的诊断工具。

一、JVM调优

JVM调优的主要目标是提高程序的性能、降低内存消耗以及减少延迟。以下是一些常用的JVM调优策略:

  1. 选择合适的垃圾回收器:根据应用程序的特点选择合适的垃圾回收器。例如,对于响应时间要求较高的应用,可以选择CMS或G1等低延迟的垃圾回收器;对于内存占用较大的应用,可以选择Parallel Scavenge等吞吐量优先的垃圾回收器。

  2. 调整堆内存大小:根据应用的需求和系统的物理内存,合理设置JVM的堆内存大小。堆内存太小可能导致频繁的GC,影响性能;堆内存太大则可能浪费系统资源。

  3. 优化代码:减少对象创建、避免不必要的对象引用、及时释放不再使用的对象等,都可以减少GC的压力,提高性能。

  4. 启用JIT编译:JIT(Just-In-Time)编译器可以将热点代码编译成机器码,提高执行效率。可以通过设置JVM参数来启用JIT编译。

  5. 监控和调优线程:合理设置线程池的大小、避免线程死锁和饥饿等问题,可以提高多线程程序的性能。

二、JVM诊断工具

JVM提供了多种诊断工具,可以帮助我们定位和解决性能问题。以下是一些常用的JVM诊断工具:

  1. jps:显示当前Java进程列表。通过jps命令,我们可以获取Java进程的ID,进而使用其他工具进行更深入的诊断。

  2. jstat:用于监控JVM的运行状态,包括类加载、垃圾回收、即时编译等信息。通过jstat命令,我们可以实时查看JVM的各项性能指标,从而判断JVM的运行状态是否正常。

  3. jmap:生成堆内存映射或堆转储快照。通过jmap命令,我们可以获取堆内存的详细信息,包括对象数量、内存占用等,有助于我们分析内存泄漏等问题。

  4. jhat:用于分析jmap生成的堆转储快照。jhat命令会启动一个Web服务器,我们可以在浏览器中查看和分析堆转储快照的内容。

  5. jstack:生成Java线程堆栈跟踪。通过jstack命令,我们可以获取线程的堆栈信息,有助于我们定位线程死锁、饥饿等问题。

  6. VisualVM:一个功能强大的Java虚拟机监控和分析工具,它提供了一个直观的图形界面,方便我们查看和管理Java进程。VisualVM集成了多种诊断工具,包括堆分析器、线程分析器、监视器等,可以帮助我们快速定位和解决性能问题。

在面试中,可能会涉及到如何使用这些工具进行JVM调优和诊断的问题。因此,熟练掌握这些工具的使用方法是非常有必要的。

类加载机制有一个清晰的认识是非常重要的。

Java面试之虚拟机篇(四):JVM与JNI技术

在Java面试中,除了需要掌握JVM的内存结构、垃圾回收、类加载以及调优和诊断工具等基础知识外,对JVM与本地代码交互的技术——Java Native Interface(JNI)的理解也是一项重要的技能。本文将深入探讨JNI技术及其在Java中的应用。

一、JNI简介

JNI是Java Native Interface的缩写,它提供了Java代码与本地应用程序(如C、C++编写的程序)进行交互的接口。通过JNI,Java程序可以调用本地代码,同时本地代码也可以调用Java代码。这种交互能力使得Java可以充分利用其他编程语言的优势,扩展了Java的应用范围。

二、JNI的应用场景

JNI在以下场景中有着广泛的应用:

  1. 性能优化:对于某些计算密集型或I/O密集型的任务,使用本地代码(如C、C++)可能会比Java代码更高效。通过JNI,Java程序可以将这些任务委托给本地代码执行,从而提高性能。

  2. 集成遗留系统:在企业级应用中,经常需要集成一些用其他语言编写的遗留系统。通过JNI,Java程序可以调用这些遗留系统的本地接口,实现系统的集成。

  3. 利用特定平台的特性:某些平台可能提供了特定的API或功能,而这些功能在Java标准库中并不可用。通过JNI,Java程序可以调用这些平台特定的API,从而利用这些特性。

三、JNI的使用方式

使用JNI需要遵循以下步骤:

  1. 编写本地方法:在Java代码中声明本地方法,这些方法没有具体的实现,而是通过native关键字标记为本地方法。

  2. 生成JNI头文件:使用javah工具从Java类文件生成JNI头文件(.h文件)。这个头文件包含了本地方法的C/C++函数签名。

  3. 实现本地方法:在C/C++代码中实现本地方法。这些方法需要按照JNI规范进行编写,以便与Java代码进行交互。

  4. 编译和链接本地代码:将C/C++代码编译为动态链接库(如.dll或.so文件),并将其加载到Java程序中。

  5. 调用本地方法:在Java代码中通过调用本地方法来执行本地代码。

四、JNI的注意事项

在使用JNI时,需要注意以下几点:

  1. 内存管理:JNI涉及到Java和本地代码之间的内存交互,因此需要格外注意内存管理问题。避免内存泄漏和野指针等问题是JNI编程的重要任务。

  2. 错误处理:本地代码可能会遇到各种错误情况,如参数无效、内存不足等。在JNI编程中,需要妥善处理这些错误情况,确保程序的稳定性。

  3. 可移植性:由于JNI涉及到本地代码,因此其可移植性可能会受到限制。在编写JNI代码时,需要考虑不同平台和操作系统的差异,以确保代码的可移植性。

  4. 性能开销:JNI调用本身会带来一定的性能开销,尤其是在频繁调用本地方法时。因此,在使用JNI时,需要权衡性能提升和开销之间的关系。

Java面试之虚拟机篇(五):JVM与容器化技术

随着云计算和容器化技术的兴起,Java应用与容器化技术的结合变得越来越紧密。在Java面试中,对JVM与容器化技术(如Docker)的理解和应用也逐渐成为重要的考察点。本文将探讨JVM在容器化环境中的表现以及如何利用容器化技术优化Java应用的部署和管理。

一、容器化技术简介

容器化技术是一种轻量级的虚拟化技术,它允许开发者将应用及其依赖打包成一个可移植的容器,从而实现应用的快速部署和一致的运行环境。Docker是目前最流行的容器化技术之一,它提供了丰富的工具和接口,简化了容器的创建、管理和调度过程。

二、JVM在容器化环境中的表现

在容器化环境中,JVM的行为和性能会受到一些特殊因素的影响:

  1. 资源限制:容器通常会对CPU、内存等资源进行限制,这可能会影响JVM的性能和垃圾回收行为。因此,在配置JVM参数时,需要考虑到容器的资源限制,避免资源耗尽或浪费。

  2. 启动时间:容器的快速启动和停止是容器化技术的一大优势。然而,JVM的启动时间相对较长,尤其是在应用冷启动时。为了优化启动时间,可以考虑使用预热的JVM镜像、减少类加载数量或使用快速启动的JVM版本。

  3. 内存管理:容器化环境中的内存管理尤为重要。JVM的内存使用需要得到合理的配置和管理,以避免内存泄漏和OOM(OutOfMemoryError)等问题。同时,还需要注意容器与宿主机之间的内存隔离和限制。

三、利用容器化技术优化Java应用部署和管理

容器化技术为Java应用的部署和管理带来了诸多便利:

  1. 环境一致性:通过容器化技术,可以确保Java应用在不同环境中具有一致的运行环境,减少因环境差异导致的兼容性问题。

  2. 快速部署:容器化技术使得Java应用的部署变得简单快捷,只需将容器镜像推送到仓库,然后在需要的地方拉取并启动容器即可。

  3. 弹性伸缩:结合容器编排工具(如Kubernetes),可以实现Java应用的自动伸缩,根据负载情况动态调整应用实例的数量。

  4. 监控和日志收集:容器化技术提供了丰富的监控和日志收集工具,可以方便地监控Java应用的运行状态和性能,及时发现问题并进行排查。

Java面试之虚拟机篇(六):JVM与云原生技术的融合

随着云原生技术的迅速崛起,JVM作为Java应用的核心运行环境,与云原生技术的融合变得日益重要。在Java面试中,对JVM与云原生技术的理解以及如何将它们有效结合,已经成为面试官关注的重点。本文将深入探讨JVM与云原生技术的融合,以及如何利用云原生技术提升Java应用的性能和可伸缩性。

一、云原生技术简介

云原生技术是一组旨在提升应用在云环境中的开发、部署、运行和管理效率的技术和方法的集合。它强调应用的可移植性、可伸缩性、高可用性和安全性。云原生技术包括容器化技术(如Docker)、容器编排工具(如Kubernetes)、服务网格、微服务架构等。

二、JVM与云原生技术的融合点

  1. 容器化部署:通过将JVM和Java应用打包成容器镜像,可以实现应用的快速部署和一致的运行环境。容器编排工具(如Kubernetes)可以自动管理容器的生命周期,包括启动、停止、扩缩容等,从而提高了应用的可伸缩性和高可用性。

  2. 资源动态管理:云原生技术允许根据应用的负载情况动态调整资源分配。JVM可以通过与云原生平台的集成,实现CPU、内存等资源的动态申请和释放,从而提高资源的利用率和应用的性能。

  3. 服务发现与治理:在微服务架构中,服务发现与治理是至关重要的。云原生技术提供了服务注册与发现、负载均衡、熔断降级等功能,可以帮助JVM更好地管理微服务之间的调用和通信。

  4. 监控与告警:云原生技术提供了丰富的监控和告警工具,可以实时监控JVM的性能指标(如GC频率、内存使用情况等),并在出现异常时及时发出告警,帮助开发者快速定位和解决问题。

三、利用云原生技术优化Java应用

  1. 自动扩缩容:通过结合云原生平台和JVM的资源管理策略,可以实现Java应用的自动扩缩容。根据应用的负载情况,自动调整JVM实例的数量和资源配置,确保应用在高并发场景下能够稳定运行。

  2. 优化启动时间:针对JVM启动时间较长的问题,可以利用云原生平台的预热功能或快速启动镜像来加速启动过程。同时,也可以通过优化JVM参数和类加载策略来减少启动时间。

  3. 提高资源利用率:通过云原生平台的资源调度和动态管理功能,可以更加合理地分配和使用资源。例如,根据应用的负载情况动态调整JVM的内存大小,避免资源浪费和性能瓶颈。

  4. 增强安全性:云原生技术提供了更加严格的安全隔离和访问控制机制,可以帮助保护JVM和Java应用的安全。通过集成云原生平台的安全特性,如网络隔离、加密通信等,可以降低安全风险并增强应用的可靠性。

Java面试之虚拟机篇(七):JVM的未来发展趋势

随着技术的不断进步和需求的日益复杂化,JVM作为Java应用的核心运行环境,也在不断发展和完善。未来,JVM将呈现以下几个发展趋势:

一、性能持续优化

性能一直是JVM关注的重点。未来,JVM将继续在性能优化方面下功夫,包括提高垃圾回收效率、减少内存占用、优化JIT编译器等方面。通过不断改进算法和实现,JVM将能够为Java应用提供更高的运行速度和更低的延迟,满足各种高性能应用场景的需求。

二、云原生集成更紧密

随着云原生技术的广泛应用,JVM与云原生技术的集成将更加紧密。未来,JVM将更好地支持容器化部署、动态资源管理和服务治理等功能,与云原生平台实现无缝对接。这将使得Java应用能够更轻松地运行在云环境中,享受云原生带来的种种优势。

三、安全性增强

安全性是JVM不可忽视的一个重要方面。未来,JVM将进一步加强安全特性,包括更严格的内存隔离、加密通信、安全审计等方面。同时,JVM还将与各种安全工具和平台实现更紧密的集成,为Java应用提供全方位的安全保障。

四、跨平台能力进一步提升

跨平台是Java语言的一大优势,也是JVM的核心价值之一。未来,JVM将继续提升跨平台能力,支持更多的操作系统和硬件平台。这将使得Java应用能够更加灵活地部署在各种环境中,满足不同场景的需求。

五、智能化与自动化趋势

随着人工智能和机器学习技术的发展,JVM也将逐步引入智能化和自动化的特性。例如,通过机器学习算法对JVM的性能数据进行分析,实现自动调优和故障预测;通过自动化工具实现JVM的部署、监控和管理等功能。这些智能化和自动化的特性将大大提高JVM的易用性和可靠性。

六、与新兴技术的融合

随着新兴技术的不断涌现,JVM也需要与时俱进,与这些技术实现融合。例如,与量子计算技术的结合将有望为JVM带来前所未有的性能提升;与边缘计算技术的结合将使JVM能够更好地支持分布式应用场景;与区块链技术的结合将为JVM提供更强的数据安全性和可追溯性。

总之,未来JVM将在性能优化、云原生集成、安全性增强、跨平台能力提升以及智能化与自动化等方面实现进一步发展。这些发展趋势将使得JVM更加适应现代应用的需求,为Java开发者提供更加高效、稳定、安全的运行环境

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

免费语音转文字:自建Whisper,贝锐花生壳3步远程访问

Whisper是OpenAI开发的自动语音识别系统(语音转文字)。 OpenAI称其英文语音辨识能力已达到人类水准,且支持其它98中语言的自动语音辨识,Whisper神经网络模型被训练来运行语音辨识与翻译任务。 此外,与其他需要联网运行…

Ubuntu 20.04.6下载、安装

一、下载 下载地址:https://cn.ubuntu.com/download 下载版本:ubuntu-20.04.6-desktop-amd64.iso 二、安装 参考博客: https://blog.csdn.net/lhl_blog/article/details/123406322 https://www.cnblogs.com/fieldtianye/p/17879840.html…

如何使用docker部署前端项目

账号:root 密码:*** 主机:ip地址 登录后: 初级名词: sudo 是Linux和类Unix操作系统中的一个命令,全称为“super user do”,用于允许普通用户以超级用户(root)的身份执行某些或全部命令 需要下载的软件: sudo yum install 软件名 sudo yum install lrzsz 上传软件 s…

婴儿专用洗衣机有必要吗?四大宝藏婴儿洗衣机测评对比

对于有了宝宝的家庭来说,洗衣成为了一项重要的家务事。大家都知道,宝宝的皮肤比较娇嫩,容易受到各种细菌、病毒的侵扰。所以,宝宝的衣物应该与大人的分开洗。婴儿洗衣机作为一种专门为婴幼儿家庭设计的洗衣机,其具有除…

Spring5深入浅出篇:Spring对象属性注入详解

Spring5深入浅出篇:Spring对象属性注入详解 很多粉丝私信我这个Spring5的课程在哪看,这边是在B站免费观看欢迎大家投币支持一下. https://www.bilibili.com/video/BV1hK411Y7zf 首先需要了解什么是注入?在创建对象的过程中,不仅仅是创建一个对象还需要为对象的属性赋值.这一系…

Win11和WinRAR取消折叠菜单恢复经典菜单

这里写目录标题 前言1. Win11恢复经典右键菜单1.1 修改前1.2 恢复成经典右键菜单1.3 修改后1.4 想恢复怎么办? 2. WinRAR取消折叠菜单恢复经典菜单2.1 修改前2.2 修改恢复为经典菜单2.3 修改后2.4 想恢复怎么办? 前言 最近换回了Windows电脑&#xff0c…

SpringBoot学习(四)NoSQL、接口文档、远程调用、消息服务、Web安全、可观测性、AOT

文章目录 NoSQLRedis整合场景整合自动配置原理定制化序列化机制redis客户端 接口文档OpenAPI3架构整合使用常用注解Docket配置 远程调用WebClient创建与配置获取响应定义请求体 HTTP interface导入依赖定义接口创建代理&测试 消息服务消息队列-场景异步解耦削峰缓冲 消息队…

学习Docker笔记

在23号刚刚学完新版本的docker还想说回去继续学习老版本的springcloud课程里面的docker 结果一看黑马首页新版本课程出了,绷不住了。以下是我学习新版本docker的笔记,记录了我学习过程遇到的各种bug和解决,也参考了黑马老师的笔记&#xff1a…

统一SQL 支持Oracle decode函数到TDSQL-MySQL的转换

统一SQL介绍 https://www.light-pg.com/docs/LTSQL/current/index.html 源和目标 源数据库:Oracle 目标数据库:TDSQL-MySQL 操作目标 在Oracle中,decode函数语法如下图:该函数功能是将 expr与每个 search 依次做比较&#x…

告别SQL注入攻击之扰!揭秘强大防护策略,筑牢网站安全防线,畅享无忧体验!

SQL注入攻击是一种极具破坏性的Web漏洞,它利用应用程序对用户输入的处理不当,让恶意用户能够执行非授权的SQL查询,进而对数据库造成巨大损害。这种攻击方式可能导致数据泄露、系统崩溃等严重后果,因此必须引起高度重视。 为了有效…

免费又好用的五款电脑监控软件(先收藏再看)

电脑监控软件可以为企业的管理提供一臂之力,然而市面上的监控软件品牌众多,良莠不齐,导致企业不知道用哪个,今天为大家盘点免费又好用的五款电脑监控软件。 安企神(点击试用7天) 安企神是一款专业的电脑监…

OpenAIGPT-4.5提前曝光?

OpenAI GPT-4.5的神秘面纱:科技界的震撼新篇章 在人工智能的世界里,每一次技术的飞跃都不仅仅是一次更新,而是对未来无限可能的探索。近日,科技巨头OpenAI似乎再次站在了这场革命的前沿,其潜在的新产品——GPT-4.5 Tur…

电力调度自动化系统,如何减少配电安全隐患?

“双碳”战略目标下,数据中心迎来了更多发展机遇,同时电力调度自动化系统也迎来更多挑战,如何保障持续稳定的电力供应、确保关键负载的可靠运行,并兼顾数字化管理、绿色可持续转型等等议题成为数据中心行业构建未来领导力的重要关…

使用gdb调试遇到No symbol table is loaded. Use the “file“ command.怎么办?

问题排查 出现下面问题,通常是没有处于调式模式环境下,所以我们需要在gcc指令后加 【-g】。 因为,我么的gcc编辑器默认是动态链接,而且是realese发布版本。 想要解决也很简单 主要思路就是在gcc -g。 在makefile文件如下进行修改即…

MES与ERP强强联手

MES系统是企业信息管理的基础,通过将ERP系统与实时生产过程联系起来,使企业能够有效控制和组织生产。 MES系统与ERP系统如何集成?   集成中,ERP与MES系统功能需要在整体的设计架构内,统一规划,划分边界。…

学习操作系统路线

操作系统 简介 本课程为计算机专业学生量身定制,补足计算机操作系统相关知识,查漏补缺,也可用于考研复习。内容包括:操作统概述、进程管理、内存管理、文件管理、输入/输出管理等章节。内容力求精炼、重点突出、条理清晰、深入浅…

干货:一篇文章让你掌握用户运营 沈阳新媒体运营培训

用户对于产品的重要性不言而喻,而用户运营作为最接近用户的一环,自然而然受到了各大互联网公司的重视。想要掌握用户运营,必须得先知道其市场需求和主要技能,本文从这两个方面对用户运营展开了分析拆解,梳理用户运营的…

ruoyi-nbcio-plus基于vue3的flowable修正加签与跳转的前端问题

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

LLMs——扩展数据受限的语言模型解决方案

概述 在自然语言处理(NLP)领域,大型语言模型的发展一直是研究的热点。这些模型通过增加参数数量和训练数据量来提升性能,但这种增长趋势是否会有一个极限?实际上,研究者们已经注意到,为了有效地…

npm常用的命令大全(2024-04-21)

nodejs中npm常见的命令 npm主要是node包管理和发布的工具。 npm官网网址:npm | Homehttps://www.npmjs.com/官网英文文档: npm DocsDocumentation for the npm registry, website, and command-line interfacehttps://docs.npmjs.com/about-npm官网中文文…