JVM虚拟机
文章平均质量分 85
JVM虚拟机
每天都要进步一点点
工作日常技术学习、积累、总结
展开
-
线上服务CPU/内存问题快速定位
原创 2024-02-05 09:57:31 · 170 阅读 · 0 评论 -
对象内存布局
在HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。原创 2022-08-11 11:30:32 · 634 阅读 · 0 评论 -
GC日志分析
目录一、GC分类二、GC日志分类三、GC日志结构剖析四、GC日志分析工具一、GC分类针对HotSpot VM的实现,它里面的GC按照回收区域又分为两大种类型:一种是部分收集(Partial GC),一种是整堆收集(Full GC)。部分收集(Partial GC):不是完整收集整个Java堆的垃圾收集。其中又分为:新生代收集(Minor GC / Young GC):只是新生代(Eden / S0, S1)的垃圾收集; 老年代收集(Major GC / Old GC):只是老原创 2021-09-21 09:11:35 · 1526 阅读 · 0 评论 -
JVM运行时参数
目录一、JVM参数选项二、添加JVM参数选项三、常用的JVM参数选项四、通过Java代码获取JVM参数一、JVM参数选项官网地址:java(一)、类型一:标准参数选项> java -help用法: java [-options] class [args...] (执行类) 或 java [-options] -jar jarfile [args...] (执行 jar 文件)其中选项包括: -d32原创 2021-09-20 20:23:46 · 617 阅读 · 0 评论 -
JVM监控及诊断工具GUI篇之Arthas(五):其他指令
一、Arthas其它相关指令jobs :列出所有job; kill :强制终止任务; fg :将暂停的任务拉到前台执行; bg :将暂停的任务放到后台执行;注:前面四个都是跟Arthas后台异步任务相关的指令,具体使用可参考:Arthas后台异步任务 — Arthas 3.5.4 文档grep :搜索满足条件的结果;//使用示例: sysprop | grep java sysprop | grep java -n sysenv | grep -v JAVA sysenv原创 2021-09-20 20:07:47 · 289 阅读 · 0 评论 -
JVM监控及诊断工具GUI篇之Arthas(四):monitor、watch、trace相关指令
目录一、概述二、Arthas之monitor指令三、Arthas之watch 指令四、Arthas之trace指令五、Arthas之stack指令六、Arthas之tt指令一、概述本文将总结Arthas中monitor、watch、trace相关监控指令,请注意,这些命令,都通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此在线上、预发使用时,请尽量明确需要观测的类、方法以及条件,诊断结束要执行stop或将增强过的类执行reset...原创 2021-09-20 19:54:37 · 2563 阅读 · 0 评论 -
JVM监控及诊断工具GUI篇之Arthas(三):class、classloader相关指令
目录一、Arthas中class/classloader相关之sc指令二、Arthas中class/classloader相关之sm指令三、Arthas中class/classloader相关之jad指令四、Arthas中class/classloader相关之mc指令五、Arthas中class/classloader相关之classloader指令六、Arthas中class/classloader相关之其他指令一、Arthas中class/classloader相关之sc指原创 2021-09-20 19:47:57 · 1265 阅读 · 0 评论 -
JVM监控及诊断工具GUI篇之Arthas(二):jvm相关指令
目录一、Arthas jvm相关指令之dashboard二、Arthas jvm相关指令之thread三、Arthas jvm相关指令之jvm四、Arthas jvm相关指令之sysprop五、Arthas jvm相关指令之sysenv六、Arthas jvm相关指令之vmoption七、Arthas jvm相关指令之其他指令一、Arthas jvm相关指令之dashboarddashboard :展示当前系统的实时数据面板,按 ctrl+c 退出。当运行在Ali-tom原创 2021-09-19 20:04:20 · 1383 阅读 · 0 评论 -
JVM监控及诊断工具GUI篇之Arthas(一):基础指令
目录一、概述二、Arthas基础指令一、概述前面介绍的工具都必须在服务端项目进程中配置相关的监控参数,然后工具通过远程连接到项目进程,获取相关的数据。这样就会带来一些不便,比如线上环境的网络是隔离的,本地的监控工具根本连不上线上环境。并且类似于Jprofiler这样的商业工具,是需要付费的。那么有没有一款工具不需要远程连接,也不需要配置监控参数,同时也提供了丰富的性能监控数据呢?阿里巴巴开源的性能分析神器Arthas应运而生。Arthas是Alibaba开源的Java诊断工具,深受开原创 2021-09-19 19:39:09 · 436 阅读 · 0 评论 -
JVM监控及诊断工具GUI篇之JProfiler
目录一、概述二、两种数据采集方式三、VM遥感监测视图中相关监测数据四、内存视图(Live Memory)的分析五、Heap Walker功能说明六、CPU视图功能说明七、Threads视图功能说明一、概述在运行Java的时候有时候想测试运行时占用内存情况,这时候就需要使用测试工具查看了。在eclipse里面有 Eclipse Memory Analyzer tool(MAT)插件可以测试,而在IDEA中也有这么一个插件,就是JProfiler。JProfiler 是由 e原创 2021-09-19 09:53:36 · 5483 阅读 · 1 评论 -
使用OQL语言查询对象信息
MAT支持一种类似于SQL的查询语言OQL(Object Query Language)。OQL使用类SQL语法,可以在堆中进行对象的查找和筛选。1. SELECT子句在MAT中,Select子句的格式与SQL基本一致,用于指定要显示的列。Select子句中可以使用“*”,查看结果对象的引用实例(相当于outgoing references)。SELECT * FROM java.util.Vector vSELECT objects v.elementData FROM java.原创 2021-09-17 16:23:15 · 4960 阅读 · 0 评论 -
内存泄漏(memory leak)的理解与应用
目录一、何为内存泄漏?二、内存泄漏的理解三、内存泄漏和内存溢出的关系四、泄漏的分类五、Java中内存泄露的8种情况六、内存泄露案例分析一、何为内存泄漏?可达性分析算法来判断对象是否是不再使用的对象,本质都是判断一个对象是否还被引用。那么对于这种情况下,由于代码的实现不同就会出现很多种内存泄漏问题(让JVM误以为此对象还在引用中,无法回收,造成内存泄漏)。如下图:二、内存泄漏的理解严格来说,只有对象不会再被程序用到了,但是GC又不能回收它们的情况,才叫内存泄漏。但实原创 2021-09-17 16:13:03 · 7116 阅读 · 4 评论 -
JVM监控及诊断工具GUI篇之Eclipse MAT
目录一、概述二、获取dump文件的四种方式三、MAT主要功能概览四、Histogram类直方图功能演示五、Thread Overview线程概览六、深堆与浅堆七、支配树的理解与应用一、概述MAT(Memory Analyzer Tool)工具是一款功能强大的Java堆内存分析器,可以用于查找内存泄漏以及查看内存消耗情况。MAT是基于Eclipse开发的,不仅可以单独使用,还可以作为插件的形式嵌入在Eclipse中使用,是一款免费的性能分析工具,使用起来非常方便。M原创 2021-09-17 15:42:56 · 379 阅读 · 0 评论 -
JVM监控及诊断工具GUI篇之Visual VM
目录一、概述二、Visual VM的主要功能三、生成和查看堆dump文件四、生成和分析线程dump文件一、概述Visual VM是一个免费的且功能强大的多合一故障诊断和性能监控的可视化工具。它集成了多个JDK命令行工具,使用Visual VM可用于显示虚拟机进程及进程的配置和环境信息(jps,jinfo),监视应用程序的CPU、GC、堆、方法区及线程的信息(jstat、jstack)等,甚至代替JConsole。在JDK 6 Update 7以后,Visual VM便作为JDK的一部原创 2021-09-17 10:50:22 · 467 阅读 · 0 评论 -
JVM监控及诊断工具GUI篇之JConsole
目录一、图形化工具概述二、JConsole是什么?三、JConsole性能分析一、图形化工具概述使用上一章命令行工具或组合能帮您获取目标Java应用性能相关的基础信息,但它们存在下列局限:1.无法获取方法级别的分析数据,如方法间的调用关系、各方法的调用次数和调用时间等(这对定位应用性能瓶颈至关重要);2.要求用户登录到目标 Java 应用所在的宿主机上,使用起来不是很方便;3.分析数据通过终端输出,结果展示不够直观;为此,JDK提供了一些内存泄漏的分析工具,如jconsole,原创 2021-09-17 10:09:18 · 252 阅读 · 0 评论 -
JVM监控及诊断工具命令行篇之jstatd
tatd:远程主机信息收集之前介绍的指令只涉及到监控本机的Java应用程序,而在这些工具中,一些监控工具也支持对远程计算机的监控(如jps、jstat)。为了启用远程监控,则需要配合使用jstatd 工具。命令jstatd是一个RMI服务端程序,它的作用相当于代理服务器,建立本地计算机与远程监控工具的通信。jstatd服务器将本机的Java应用程序信息传递到远程计算机。基本语法:C:\Users\QDM>jstatd -husage: jstatd [-nr] [-p por.原创 2021-09-12 08:46:52 · 385 阅读 · 0 评论 -
JVM监控及诊断工具命令行篇之jcmd
目录一、jcmd:多功能命令行二、jcmd使用示例一、jcmd:多功能命令行在JDK 1.7以后,新增了一个命令行工具jcmd。它是一个多功能的工具,可以用来实现前面除了jstat之外所有命令的功能。比如:用它来导出堆、内存使用、查看Java进程、导出线程信息、执行GC、JVM运行时间等。官方帮助文档:jcmdjcmd拥有jmap的大部分功能,并且在Oracle的官方网站上也推荐使用jcmd命令代替jmap命令,使用jcmd -h查看帮助文档:C:\Users\WSH>j原创 2021-09-12 08:43:11 · 1476 阅读 · 0 评论 -
JVM监控及诊断工具命令行篇之jstack
目录一、jstack:打印JVM中线程快照二、jstack检测死锁三、jstach观察线程状态四、jstack观察线程同步问题一、jstack:打印JVM中线程快照jstack(JVM Stack Trace):用于生成虚拟机指定进程当前时刻的线程快照(虚拟机堆栈跟踪)。线程快照就是当前虚拟机内指定进程的每一条线程正在执行的方法堆栈的集合。生成线程快照的作用:可用于定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等问题。这些都是导致线程长时间停顿的原创 2021-09-12 08:37:08 · 736 阅读 · 0 评论 -
JVM监控及诊断工具命令行篇之jhat
一、jhat:JDK自带堆分析工具jhat(JVM Heap Analysis Tool):Sun JDK提供的jhat命令与jmap命令搭配使用,用于分析jmap生成的heap dump文件(堆转储快照)。jhat内置了一个微型的HTTP/HTML服务器,生成dump文件的分析结果后,用户可以在浏览器中查看分析结果(分析虚拟机转储快照信息)。使用了jhat命令,就启动了一个http服务,端口是7000,即http://localhost:7000/,就可以在浏览器里分析。说明:jhat命令在原创 2021-09-11 14:44:49 · 2300 阅读 · 0 评论 -
JVM监控及诊断工具命令行篇之jmap
目录一、jmap:导出内存映像文件&内存使用情况二、导出dump堆转储快照文件三、显示堆内存相关信息四、其它作用五、小结一、jmap:导出内存映像文件&内存使用情况jmap(JVM Memory Map):一方面是获取dump文件(堆转储快照文件,二进制文件),还可以获取目标Java进程的内存相关信息,包括Java堆各区域的使用情况、堆中对象的统计信息、类加载信息等。开发人员可以在控制台中输入命令“jmap -help”查阅jmap工具的具体使用方式和一些标准选项原创 2021-09-11 14:38:55 · 681 阅读 · 0 评论 -
JVM监控及诊断工具命令行篇之jinfo
目录一、jinfo:实时查看和修改JVM配置参数二、jinfo查看参数三、jinfo修改参数四、拓展一、jinfo:实时查看和修改JVM配置参数jinfo(Configuration Info for Java):查看虚拟机配置参数信息,也可用于调整虚拟机的配置参数。在很多情况下,Java应用程序不会指定所有的Java虚拟机参数。而此时,开发人员可能不知道某一个具体的Java虚拟机参数的默认值。在这种情况下,可能需要通过查找文档获取某个参数的默认值,这个查找过程可能是非常艰难的。但有原创 2021-09-11 10:29:00 · 298 阅读 · 0 评论 -
JVM监控及诊断工具命令行篇之jstat
目录一、jstat:查看JVM统计信息二、jstat option参数三、jstatinterval参数四、jstatcount参数五、jstat -t参数六、jstat -h参数七、补充一、jstat:查看JVM统计信息jstat(JVM Statistics Monitoring Tool):用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。在没有GUI图形界面,只提供了纯文本控制台环境的..原创 2021-09-11 10:16:46 · 688 阅读 · 1 评论 -
JVM监控及诊断工具命令行篇之jps
目录一、概述二、jps:查看正在运行的Java进程一、概述性能诊断是软件工程师在日常工作中需要经常面对和解决的问题,在用户体验至上的今天,解决好应用的性能问题能带来非常大的收益。Java 作为最流行的编程语言之一,其应用性能诊断一直受到业界广泛关注。可能造成 Java 应用出现性能问题的因素非常多,例如线程控制、磁盘读写、数据库访问、网络I/O、垃圾收集等。想要定位这些问题,一款优秀的性能诊断工具必不可少。体会1:使用数据说明问题,使用知识分析问题,使用工具处理问题。 体会2:无监原创 2021-09-09 20:52:04 · 571 阅读 · 0 评论 -
性能监控与调优概述
目录一、大厂面试题二、背景说明三、调优概述四、性能优化的步骤五、性能评价/测试指标一、大厂面试题JVM性能监控与优化几乎是面试中必问的一个专题,可见掌握JVM性能监控的一些指标以及优化的思路、步骤等很有必要,先来看看一些大厂对于JVM性能优化相关的面试题:支付宝JVM性能调优都做了什么?小米有做过JVM内存优化吗?从SQL、JVM、架构、数据库四个方面讲讲优化思路?蚂蚁金服JVM的编译优化?JVM性能调优都做了什么?JVM诊断调优工具用过哪些?J原创 2021-09-09 20:33:21 · 278 阅读 · 0 评论 -
自定义类加载器
一、为什么要自定义类加载器?隔离加载类在某些框架内进行中间件与应用的模块隔离,把类加载到不同的环境。比如:阿里内某容器框架通过自定义类加载器确保应用中依赖的jar包不会影响到中间件运行时使用的jar包。再比如:Tomcat这类Web应用服务器,内部自定义了好几种类加载器,用于隔离同一个Web应用服务器上的不同应用程序。修改类加载的方式类的加载模型并非强制,除Bootstrap外,其他的加载并非一定要引入,或者根据实际情况在某个时间点进行按需进行动态加载。扩展加载源比如从数据库、网络、甚至是原创 2021-09-05 10:41:08 · 5371 阅读 · 2 评论 -
沙箱安全机制
目录一、沙箱安全机制概述二、JDK1.0时期三、JDK1.1时期四、 JDK1.2时期五、JDK1.6时期一、沙箱安全机制概述保证程序安全;保护Java原生的JDK代码;Java安全模型的核心就是Java沙箱(Sandbox),什么是沙箱?沙箱是一个限制程序运行的环境。沙箱机制就是将Java代码限定在虚拟机(JVM)特定的运行范围中,并且严格限制代码对本地系统资源访问。通过这样的措施来保证对代码的有限隔离,防止对本地系统造成破坏。沙箱主要限制系统资源访问,那系统资源包原创 2021-09-05 06:50:32 · 1658 阅读 · 0 评论 -
双亲委派模型
目录一、定义与本质二、优势与劣势三、破坏双亲委派机制四、热替换的实现一、定义与本质类加载器用来把类加载到Java虚拟机中。从JDK1.2版本开始,类的加载过程采用双亲委派机制,这种机制能更好地保证Java平台的安全。定义如果一个类加载器在接到加载类的请求时,它首先不会自己尝试去加载这个类,而是把这个请求任务委托给父类加载器去完成,依次递归,如果父类加载器可以完成类加载任务,就成功返回。只有父类加载器无法完成此加载任务时,才自己去加载。本质双亲委派机制规定了类加载的顺序是:原创 2021-09-05 06:34:02 · 242 阅读 · 0 评论 -
ClassLoader类解析
目录一、概述二、ClassLoader的主要方法三、SecureClassLoader与URLClassLoader四、ExtClassLoader与AppClassLoader五、Class.forName()与ClassLoader.loadClass()六、 loadClass()方法解析一、概述ClassLoader类继承关系图如下:除了以上虚拟机自带的加载器外,用户还可以定制自己的类加载器。Java提供了抽象类java.lang.ClassLoader,所.原创 2021-09-03 20:17:22 · 928 阅读 · 0 评论 -
类加载器详解
目录一、类的加载器分类二、引导类加载器(Bootstrap ClassLoader)三、扩展类加载器(Extension ClassLoader)四、系统类加载器(App ClassLoader)五、用户自定义类加载器六、测试不同的类加载器一、类的加载器分类JVM支持两种类型的类加载器,分别为引导类加载器(Bootstrap ClassLoader) 和自定义类加载器(User一Defined ClassLoader)。从概念上来讲,自定义类加载器一般指的是程序中由开发人原创 2021-09-02 21:14:08 · 651 阅读 · 0 评论 -
类加载器的概述
目录一、概述二、类加载的分类三、命名空间与类的唯一性四、类加载机制的基本特征一、概述类加载器是JVM执行类加载机制的前提。ClassLoader的作用:ClassLoader是Java的核心组件,所有的Class都是由ClassLoader进行加载的,ClassLoader负责通过各种方式将Class信息的二进制数据流读入JVM内部,转换为一个与目标类对应的java.lang.Class对象实例,然后交给Java虚拟机进行链接、初始化等操作。因此,ClassLoader在整个原创 2021-09-02 20:58:11 · 230 阅读 · 1 评论 -
类的加载过程详解之过程五:类的Unloading(卸载)
目录一、概述二、类、类的加载器、类的实例之间的引用关系三、类的生命周期四、具体例子五、类的卸载六、方法区的垃圾回收一、概述类存在于方法区中,jdk8中方法区的落地实现是元空间,元空间使用的是系统内存,所以当类没有被及时卸载时,可能会出现方法区的OOM。二、类、类的加载器、类的实例之间的引用关系在类加载器的内部实现中,用一个Java集合来存放所加载类的引用。另一方面,一个Class对象总是会引用它的类加载器,调用Class对象的getClassLoader()方法,就能原创 2021-09-01 20:38:54 · 716 阅读 · 0 评论 -
类的加载过程详解之过程四:类的Using使用
任何一个类型在使用之前都必须经历过完整的加载、链接和初始化3个类加载步骤。一旦一个类型成功经历过这3个步骤之后,便“万事俱备,只欠东风”,就等着开发者使用了。开发人员可以在程序中访问和调用它的静态类成员信息(比如:静态字段、静态方法),或者使用new关键字为其创建对象实例。例:加载一个类时,以User类为例:方法区存放User类模板数据/对象; 堆空间中创建一个User类的Class实例,这个实例指向了方法区中的类模板对象; 栈中(栈帧的局部变量表中)中声明了一个class对象,class对原创 2021-09-01 20:33:08 · 258 阅读 · 0 评论 -
类的加载过程详解之过程三:Initialization(初始化)阶段
目录一、概述二、初始化阶段赋值和准备阶段赋值的对比三、类初始化方法()的线程安全性四、类的初始化情况:主动使用vs被动使用一、概述初始化阶段,简言之,为类的静态变量赋予正确的初始值。1、具体描述类的初始化是类装载的最后一个阶段。如果前面的步骤都没有问题,那么表示类可以顺利装载到系统中。此时,类才会开始执行Java字节码。(即:到了初始化阶段,才真正开始执行类中定义的Java程序代码。)初始化阶段的重要工作是执行类的初始化方法:<clinit>()方法。该方原创 2021-09-01 20:28:21 · 2327 阅读 · 0 评论 -
类的加载过程详解之过程二:Linking(链接)阶段
目录一、概述二、Verification(验证)三、Preparation(准备)四、Resolution(解析)一、概述前面已经介绍过,在类加载完之后的第二个阶段就是Linking链接阶段,链接阶段主要包含验证、准备、解析三个步骤,下面我们挨个进行介绍。二、Verification(验证)验证是链接操作的第一步,它的目的是保证加载的字节码是合法、合理并符合规范的。验证的步骤比较复杂,实际要验证的项目也很繁多,大体上Java虚拟机需要做以下检查,如图所示。整体说明:原创 2021-09-01 20:04:21 · 1304 阅读 · 2 评论 -
类的加载过程详解之过程一:Loading(加载)阶段
目录一、概述二、过程一:Loading(加载)阶段三、总结一、概述在Java中数据类型分为基本数据类型和引用数据类型。基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载。按照Java虚拟机规范,从class文件到加载到内存中的类,到类卸载出内存为止,它的整个生命周期包括如下7个阶段:其中,验证、准备、解析3个部分统称为链接(Linking)。从程序中类的使用过程看:下面我们对前面提到类的生命周期涉及的七个阶段分别进行介绍。二、过程一:Loading.原创 2021-08-29 07:39:32 · 1605 阅读 · 0 评论 -
字节码指令之同步控制指令
目录一、概述二、方法级的同步三、方法内指定指令序列的同步一、概述java虚拟机支持两种同步结构:方法级的同步和方法内部一段指令序列的同步,这两种同步都是使用monitor来支持的。二、方法级的同步方法级的同步:是隐式的,即无须通过字节码指令来控制,它实现在方法调用和返回操作之中。虚拟机可以从方法常量池的方法表结构中的ACC_SYNCHRONIZED访问标志得知一个方法是否声明为同步方法;当调用方法时,调用指令将会检查方法的AC_SYNCHRONIZED访问标志是否设置。原创 2021-08-28 10:29:57 · 387 阅读 · 0 评论 -
字节码指令之异常处理指令
目录一、抛出异常指令二、异常处理与异常表一、抛出异常指令(1)athrow指令在Java程序中显示抛出异常的操作 (throw语句)都是由athrow指令来实现。除了使用throw语句显示抛出异常情况之外,JVM规范还规定了许多运行时异常会在其他Java虚拟机指令检测到异常状况时自动抛出。例如,在之前介绍的整数运算时,当除数为零时,虚拟机会在 idiv或 ldiv指令中抛出 ArithmeticException异常。(2)注意正常情况下,操作数栈的压入弹出都是一条条指令完成的。原创 2021-08-28 10:19:25 · 372 阅读 · 0 评论 -
字节码指令之控制转移指令
目录一、概述二、比较指令三、条件跳转指令四、比较条件跳转指令五、多条件分支跳转指令六、无条件跳转指令一、概述程序流程离不开条件控制,为了支持条件跳转,虚拟机提供了大量字节码指令,大体上可以分为:1)比较指令 2)条件跳转指令 3)比较条件跳转指令 4)多条件分支跳转指令 5)无条件跳转指令等二、比较指令比较指令属于算术指令,比较指令的说明:比较指令的作用是比较栈顶两个元素的大小,并将比较结果入栈。 比较指令有: dcmpg、dcmpl、 fcmpg、.原创 2021-08-26 21:29:10 · 867 阅读 · 0 评论 -
字节码指令之操作数栈管理指令
一、概述JVM提供的操作数栈管理指令,如同操作一个普通数据结构中的堆栈那样,可以用于直接操作操作数栈的指令。这类指令包括如下内容:将一个或两个元素从栈顶弹出,并且直接废弃:pop, pop2; 复制栈顶一个或两个数值并将复制值或双份的复制值重新压入栈顶:dup, dup2, dup_x1,dup2_x1, dup_x2,dup2_x2; 将栈最顶端的两个slot数值位置交换:swap。 Java虚拟机没有提供交换两个64位数据类型(long double)数值的指令。 指令nop:一个非常原创 2021-08-26 20:35:12 · 354 阅读 · 0 评论 -
字节码指令之方法调用与返回指令
目录一、方法调用指令二、方法返回指令一、方法调用指令方法调用指令: invokevirtual、 invokeinterface,、invokespecial、 invokestatic 、 invokedynamic。以下5条指令用于方法调用:invokevirtual指令:用于调用对象的实例方法,根据对象的实际类型进行分派(虚方法分派),支持多态,这也是Java语言中最常见的方法分派方式。(多态场景下方法的重写) invokeinterface指令:用于调用接口方法,它会在运.原创 2021-08-25 20:47:47 · 462 阅读 · 0 评论