WebLogic JVM Core dumps文件的生成控制

news2024/10/5 23:29:07

一,背景

当我们运行的WebLogic JVM发生Fatal Error时,会造成JVM crash掉,进而造成进程终止。一般来说crash的时间我们是无法估计在什么时候的,它具有很大的偶然性,因此理论上有时我们希望自动产生Core dump文件来提供我们事后分析的信息记录。默认我们的系统是没有enable这个功能的,因此我们可以尝试开启。

1.1 core dump说明

core文件简介
core文件其实就是内存的映像,当程序崩溃时,存储内存的相应信息,主用用于对程序进行调试。当程序崩溃时便会产生core文件,其实准确的应该说是core dump 文件,默认生成位置与可执行程序位于同一目录下,文件名为core.***,其中***是某一数字。

核心转储(core dump),在汉语中有时戏称为吐核,是操作系统在进程收到某些信号而终止运行时,将此时进程地址空间的内容以及有关进程状态的其他信息写出的一个磁盘文件。这种信息往往用于调试。当一个进程要异常终止时,可以选择把进程的用户空间内存数据全部保存到磁盘上,文件名通常是core,这叫做Core Dump。进程异常终止通常是因为程序错误,比如非法内存访问导致段错误, 事后可以用调试器检查core文件以查清错误原因,这叫做Post-mortem Debug(事后调试)。
一个进程允许 产生多大的core文件取决于进程的Resource Limit(这个信息保在PCB中)。默认是不允许产生core文件的, 因为core文件中可能包含用户密码等敏感信息,不安全。在开发调试阶段可以用ulimit命令改变这个限制,允许产生core文件。

一个core文件里,包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理等信息,也就是把程序当时工作的状态存储成一个文件。不仅仅是在出错的时候会生成core dump文件,在系统卡住或者cpu使用率很高的时候也可以手动触发生成core dump文件。

1.2 手动模拟crash

Kill -11 <PID>

信号11(SIGSEGV)是当一个进程执行了一个无效的内存引用,或发生段错误时发送给它的信号。

二,开启JVM crash自动产生Java core dump

2.1 测试环境:

OS: Red Hat Enterprise Linux Server release 6.7 (Santiago)

WebLogic Server 版本: 12.2.1.2.0

2.2 开启JVM crash自动产生Java core dump

core dump文件生成开关其实是通过对生成的文件大小进行控制达到的,默认大小是0,也就是说默认是不生成core dump文件的,可以通过命令ulimit -c进行查看。将此参数修改成unlimited就可以生成core dump文件了,但值得注意的一点是,每个应用进程都会读取自己的一套系统参数,可以查看进程对应的内存文件/proc/<pid>/limits中的信息来判断修改后的参数值是否对此应用进程生效了,limits文件中的信息如下:

查看core文件生成功能是否打开,如下若是0,则表示没有打开。
$ ulimit -c
0
修改为可以生成core dump文件:
1)临时设置
示例1:如下设置4G,单位为kbyte。
如果生成的信息超过此大小,将会被裁剪,最终生成一个不完整的core文件。在调试此core文 件的时候,gdb会提示错误。
# ulimit -c 4194304
示例2:不限制大小。
$ ulimit -c unlimited
$ ulimit -c
unlimited

2)永久设置

# echo " * soft core unlimited" >> /etc/security/limits.conf
# echo " * hard core unlimited" >> /etc/security/limits.conf

然后重启服务器或重新登录即可生效。

查看具体应用进程的core dump参数设置:

$ ps -ef |grep Server1
weblogic 13463 13412 99 01:40 ?        00:00:34 /usr/java/jdk1.8.0_144/bin/java -server -Xms256m -Xmx512m -Dweblogic.Name=Server1 -Djava.security.policy=/home/weblogic/Oracle/Middleware/Oracle_Home/wlserver/server/lib/weblogic.policy -Dweblogic.ProductionModeEnabled=true -Dweblogic.system.BootIdentityFile=/home/weblogic/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/servers/Server1/data/nodemanager/boot.properties -Dweblogic.nodemanager.ServiceEnabled=true -Dweblogic.nmservice.RotationEnabled=true -Djava.system.class.loader=com.oracle.classloader.weblogic.LaunchClassLoader -javaagent:/home/weblogic/Oracle/Middleware/Oracle_Home/wlserver/server/lib/debugpatch-agent.jar -da -Dwls.home=/home/weblogic/Oracle/Middleware/Oracle_Home/wlserver/server -Dweblogic.home=/home/weblogic/Oracle/Middleware/Oracle_Home/wlserver/server -Dweblogic.management.server=http://127.0.0.1:7001 -Dweblogic.ext.dirs=/home/weblogic/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/ext_lib weblogic.Server
weblogic 13546 12140  0 01:41 pts/1    00:00:00 grep Server1
$ cd /proc/13463
$ cat limits
Limit                     Soft Limit           Hard Limit           Units     
Max cpu time              unlimited            unlimited            seconds   
Max file size             unlimited            unlimited            bytes     
Max data size             unlimited            unlimited            bytes     
Max stack size            8388608              unlimited            bytes     
Max core file size        unlimited            unlimited            bytes     
Max resident set          unlimited            unlimited            bytes     
Max processes             1024                 38877                processes
Max open files            4096                 4096                 files     
Max locked memory         65536                65536                bytes     
Max address space         unlimited            unlimited            bytes     
Max file locks            unlimited            unlimited            locks     
Max pending signals       38877                38877                signals   
Max msgqueue size         819200               819200               bytes     
Max nice priority         0                    0                    
Max realtime priority     0                    0                    
Max realtime timeout      unlimited            unlimited            us        

Hard Limit和Soft Limit的区别:
-H  :hard limit ,严格的设定,必定不能超过这个设定的数值
-S  :soft limit ,警告的设定,可以超过这个设定值,但是若超过则有警告信息
在设定上,通常soft会比hard小,举例来说,soft可以设置为80,而hard设定为100,那么你可以使用到90(没有超过100),但介于80~100之间时,系统会有警告信息通知你。

2.3 测试产生core file

通过kill -11 <PID>命令模拟Server1 服务器Crash掉了。

这时查看WebLogic域目录,产生了core文件:

 我们看到此文件是比较大的有760MB,如果是生产环境,JVM内存可能更大,超过10GB的情况都有可能。这对磁盘空间是很大的开销。

查看相应的日志记录:

After file rotation: ServerLog-0 /home/weblogic/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/servers/Server1/logs/Server1.log to /home/weblogic/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/servers/Server1/logs/Server1.log00081
Realigning 0 iterators for: ServerLog-0
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00000030716082fb, pid=3342, tid=0x00007f2eecc29700
#
# JRE version: Java(TM) SE Runtime Environment (8.0_144-b01) (build 1.8.0_144-b01)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.144-b01 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C  [libpthread.so.0+0x82fb]  pthread_join+0x10b
#
# Core dump written. Default location: /home/weblogic/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/core or core.3342
#
# An error report file with more information is saved as:
# /home/weblogic/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/hs_err_pid3342.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
#
/home/weblogic/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/bin/startWebLogic.sh: line 197:  3342 Aborted                 (core dumped) ${JAVA_HOME}/bin/java ${JAVA_VM} ${MEM_ARGS} -Dweblogic.Name=${SERVER_NAME} -Djava.security.policy=${WLS_POLICY_FILE} ${JAVA_OPTIONS} ${PROXY_SETTINGS} ${SERVER_CLASS}
Stopping Derby server...
Derby server stopped.
<Nov 26, 2022 2:08:18 AM CST> <INFO> <NodeManager> <The server 'Server1' with process id 3288 is no longer alive; waiting for the process to die.>
<Nov 26, 2022 2:08:18 AM CST> <FINEST> <NodeManager> <Process died.>
<Nov 26, 2022 2:08:18 AM CST> <FINEST> <NodeManager> <get latest startup configuration before deciding/trying to restart the server>
<Nov 26, 2022 2:08:18 AM CST> <FINEST> <NodeManager> <caught exception attempting to save state: java.io.IOException: No space left on device>
<Nov 26, 2022 2:08:18 AM CST> <SEVERE> <NodeManager> <Unexpected error while monitoring server>
java.io.IOException: No space left on device

说明:本地磁盘空间不够了。
        at sun.nio.ch.FileDispatcherImpl.write0(Native Method)
        at sun.nio.ch.FileDispatcherImpl.write(FileDispatcherImpl.java:60)
        at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93)
        at sun.nio.ch.IOUtil.write(IOUtil.java:65)
        at sun.nio.ch.FileChannelImpl.write(FileChannelImpl.java:205)
        at weblogic.nodemanager.util.ConcurrentUnixFile.write(ConcurrentUnixFile.java:43)
        at weblogic.nodemanager.common.StateInfoWriter.writeStateInfo(StateInfoWriter.java:46)
        at weblogic.nodemanager.common.StateInfo.save(StateInfo.java:187)
        at weblogic.nodemanager.server.ServerMonitor.saveStateFile(ServerMonitor.java:602)
        at weblogic.nodemanager.server.ServerMonitor.runMonitor(ServerMonitor.java:576)
        at weblogic.nodemanager.server.ServerMonitor.run(ServerMonitor.java:476)
        at java.lang.Thread.run(Thread.java:745)

<Nov 26, 2022 2:08:18 AM CST> <FINEST> <NodeManager> <runMonitor returned, setting finished=true and notifying waiters>
<Nov 26, 2022 2:08:54 AM CST> <FINEST> <NodeManager> <previous state saving failed, need to rebuild the state file>

三,关闭JVM crash自动产生Java core dump

正如开篇所诉,为了节省disk空间,很多时候我们并不希望产生core dump文件。那么可以尝试禁止掉。

3.1修改ulimit参数

临时:如果只是临时禁止

$ ulimit -c 0
$ ulimit -c
0

永久:如果要永久禁止
[root@goya ~]# echo " * soft core 0" >> /etc/security/limits.conf
[root@goya ~]# echo " * hard core 0" >> /etc/security/limits.conf
[root@goya ~]# tail /etc/security/limits.conf
......
# End of file
 * soft core 0
 * hard core 0

然后重启服务器或重新登录即可生效

[weblogic@goya ~]$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
......

3.2 测试不产生core file

1) 查看WebLogic的测试被管节点的core参数设置。

2)通过kill -11 <PID>命令模拟Server1 服务器Crash掉。

[weblogic@goya 3375]$ kill -11 3375

 

 如上图所示,没有core.3375文件产生。只有一个An error report 文件产生。

 3)查看相应的日志记录

[weblogic@goya logs]$ pwd
/home/weblogic/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/servers/Server1/logs
[weblogic@goya logs]$ view Server1.out00009

......
After file rotation: ServerLog-0 /home/weblogic/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/servers/Server1/logs/Server1.log to /home/weblogic/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/servers/Server1/logs/Server1.log00095
Realigning 0 iterators for: ServerLog-0
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00000030716082fb, pid=3375, tid=0x00007f768a01b700
#
# JRE version: Java(TM) SE Runtime Environment (8.0_144-b01) (build 1.8.0_144-b01)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.144-b01 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C  [libpthread.so.0+0x82fb]  pthread_join+0x10b
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /home/weblogic/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/hs_err_pid3375.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
#
/home/weblogic/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/bin/startWebLogic.sh: line 197:  3375 Aborted                 (core dumped) ${JAVA_HOME}/bin/java ${JAVA_VM} ${MEM_ARGS} -Dweblogic.Name=${SERVER_NAME} -Djava.security.policy=${WLS_POLICY_FILE} ${JAVA_OPTIONS} ${PROXY_SETTINGS} ${SERVER_CLASS}
Stopping Derby server...
Derby server stopped.
<Nov 26, 2022 2:42:56 AM CST> <INFO> <NodeManager> <The server 'Server1' with process id 3323 is no longer alive; waiting for the process to die.>
<Nov 26, 2022 2:42:56 AM CST> <FINEST> <NodeManager> <Process died.>

四,从JDK参数CreateCoredumpOnCrash来控制

如果不想在操作系统层面设置,就可以修改JVM参数来实现。不过,这个是JDK 9之后版本才有的参数,因此jdk 8或者更低的JDK版本是 不可以的。

1)验证参数版本有效性:

JDK1.8:

[root@goya ~]# java -version
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)
[root@goya ~]# java -XX:-CreateCoredumpOnCrash -version
Unrecognized VM option 'CreateCoredumpOnCrash'
Did you mean '(+/-)CreateMinidumpOnCrash'?
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

说明没有这个参数。

JDK 17:

[root@localhost ~]# java -version
openjdk version "17.0.2" 2022-01-18
OpenJDK Runtime Environment Temurin-17.0.2+8 (build 17.0.2+8)
OpenJDK 64-Bit Server VM Temurin-17.0.2+8 (build 17.0.2+8, mixed mode, sharing)
[root@localhost ~]# java -XX:-CreateCoredumpOnCrash -version
openjdk version "17.0.2" 2022-01-18
OpenJDK Runtime Environment Temurin-17.0.2+8 (build 17.0.2+8)
OpenJDK 64-Bit Server VM Temurin-17.0.2+8 (build 17.0.2+8, mixed mode, sharing)

2)验证core dump文件

$ java -XX:-CreateCoredumpOnCrash -version
java version "11.0.14" 2022-01-18 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.14+8-LTS-263)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.14+8-LTS-263, mixed mode)

简单测试一个Java程序测试:

$ java -XX:-CreateCoredumpOnCrash xxx.java
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00007faab8754015, pid=25223, tid=25223
#
# JRE version: Java(TM) SE Runtime Environment 18.9 (11.0.14+8) (build 11.0.14+8-LTS-263)
# Java VM: Java HotSpot(TM) 64-Bit Server VM 18.9 (11.0.14+8-LTS-263, mixed mode, tiered, compressed oops, g1 gc, linux-amd64)
# Problematic frame:
# C [libpthread.so.0+0x9015] pthread_join+0xa5
#
# CreateCoredumpOnCrash turned off, no core file dumped
...

Weblogic可以在控制台内,或者setDomainEnv.sh里设置。

示例:

示例:

JAVA_OPTIONS="${JAVA_OPTIONS} -XX:-CreateCoredumpOnCrash"
export JAVA_OPTIONS

说明:
目前 JDK 1.8 版本只能通过 core file size 配置为0,来disable core dump功能。
对于WebLogic高版本比如 14.1.x 支持的 JDK 9 及以上的JDK可以通过设置 -XX:-CreateCoredumpOnCrash来达到目的。

 

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

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

相关文章

figma有哪些快速入门的好用技巧

使用Figma在创建设计系统或处理大型设计项目时&#xff0c;总会涉及批量修改.快速定位.自动布局问题&#xff0c;MarcAndrew这篇文章分享了技巧&#xff0c;可以大大提高设计效率&#xff0c;希望对大家有所帮助: 在这篇文章中&#xff0c;我列出了一些快速简单的方法来帮助你…

YoLo V3 SPP u模型的讲解与总结

一。mosaic图像增强 其实就是将多张图片给汇总到一起&#xff0c;在源码当中就是默认使用4张图片进行拼接&#xff0c;进行预测。 优点&#xff1a; 增加数据的多样性增加目标个数BN能一次性统计多张图片的参数&#xff08;变相的增加了&#xff0c;输入一张图片其实就已经包…

Java agent 使用详解

一、前言 于一个即将上线的应用来说&#xff0c;系统监控是必不可少的&#xff0c;为什么需要监控呢&#xff1f;应用是跑在服务器上的&#xff0c;应用在运行过程中会发生各自意想不到的问题&#xff0c;像大家熟知的OOM&#xff0c;mysql故障&#xff0c;服务器宕机&#xff…

Mac docker-desktop 安装单机版k8s

文章目录01 引言02 下载安装docker desktop03 安装k8s04 安装k8s控制台&#xff08;k8s dashboard&#xff09;05 更方遍的方式安装dashboard01 引言 本文主要讲解在Mac下使用docker-desktop来安装k8s。 02 下载安装docker desktop 下载地址&#xff1a;https://www.docker.…

实例方法定义语法(四)

那么什么是方法呢&#xff1f; Java方法是语句的集合&#xff0c;它们在一起执行一个功能。 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建&#xff0c;在其他地方被引用 1.方法的定义 类的方法定义类的某种行为或者功能。 方法定义的语法…

Allegro如何设置丝印位号优先显示操作指导

Allegro如何设置丝印位号优先显示操作指导 Allegro支持让丝印位号优先显示,可以让视图更加的清晰明了,按照需要的方式显示,具体操作如下 以下图为例 丝印位号被器件的外形盖住了,需要显示的效果为,优先显示丝印位号,器件外形次优先 选择display-layer Priority 出现Di…

MySQL日志系统

MySQL相关文章 慢sql搜集分析工具搭建 前言 日志系统可谓是MySQL中的重中之重&#xff0c;一些MySQL的特性也通过依赖于日志实现的。 本篇文章过一遍日志相关的东西&#xff0c;方便日后复习。 binlog 概念 二进制日志文件&#xff0c;记录了所有的DDL&#xff08;数据库…

tensorflow.keras常用模块介绍

目录前言一、基础层1-0、Input层1-1、Dense层1-2、Activation层&#xff08;激活层&#xff09;、Dropout层1-3、Lambda层1-4、Flatten层二、嵌入层2-1、Embedding层三、池化层3-1、MaxPooling1D层3-2、MaxPooling2D层3-3、AveragePooling1D层3-4、AveragePooling2D层3-5、Glob…

Android 组件化架构设计从原理到实战

为什么需要组件化 小项目是不需要组件化的。当一个项目有数十个人开发&#xff0c;编译项目要花费10分钟&#xff0c;修改一个bug就可能会影响到其他业务&#xff0c;小小的改动就需要进行回归测试&#xff0c;如果是这种项目&#xff0c;那么我们需要进行组件化了 组件化和模…

有效的渗透测试才能确保Web应用安全

应用程序的安全性和快速交付之间存在矛盾&#xff0c;但由于应用程序代码缺陷和安全漏洞&#xff0c;我们正在目睹或经历越来越多的攻击。据调查&#xff0c;软件安全漏洞占了大约47%的安全事故。 与任何软件一样&#xff0c;Web应用程序也包含缺陷和错误。这种安全风险的一个…

[附源码]Python计算机毕业设计Django物品捎带系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

SAP PS 第9节 合并采购申请、组合WBS之详解

SAP PS 第9节 合并采购申请、组合WBS之影响1 合并采购申请1.1 合并采购申请后台配置1.2 合并采购申请效果如下2 组合WBS2.1 后台配置2.1.1 激活需要分组的MRP组2.1.2 项目必须为有库存模式&#xff0c;无论估价或者未估价都可以2.1.3 物料必须允许项目库存&#xff08;允许独立…

Azkaban登录分析

分析意义:目前azkaban采用的是azkaban-users.xml配置文件的方式,配置登录用户。如果公司需要二次开发,增加安全性和便捷性,想从数据库取值呢,该如何着手开发呢?本文分析登录过程,便于进行azkaban的二次登录开发。 1、登录请求地址,请求方式和参数 请求地址:http://x…

mysql创建子账户

1.首先登陆root账户 [roothecs-219255 ~]# mysql -uroot -p首先在Xshell客户端登陆linux&#xff0c;然后输入mysql命令进行登陆。 2.创建子账户 创建一个用户名为test1&#xff0c;密码为123456的子账号&#xff0c;有两种方法&#xff0c;分别为&#xff1a; CREATE USER …

【多目标进化优化】NSGAII 算法原理与代码实现

前言 Gitee 代码地址&#xff1a;https://gitee.com/futurelqh/Multi-objective-evolutionary-optimization 理论分析 \quad\quadSrinivas 和 Deb 于 1993 年提出 了 NSGA (non-dominated sorting in genetic algorithm) (Srinivas et al, 1994)。NSGA 主要有三个方面的不足&…

Docker:数据卷(Data Volumes)dockerfile

目录 一、宿主机与容器之间的文件拷贝 从容器中拷贝文件到宿主机 从宿主机拷贝文件到容器 二、数据卷 三、数据卷容器 四、Dockerfile 1、自定义centos&#xff0c;具备vim及ifconfig作用 2、自定义tomcat8 一、宿主机与容器之间的文件拷贝 备份我们已经装好的docker 等备…

隔离式DC/DC高压模块5V12V24V转50V110V250V300V380V600V1100V短路保护直流升压可调开关控制电源模块

特点 ● 效率高达 70%以上 ● 1*2英寸标准封装 ● 单电压输出 ● 价格低 ● 稳压输出 ● 工作温度: -40℃~85℃ ● 阻燃封装&#xff0c;满足UL94-V0 要求 ● 温度特性好 ● 可直接焊在PCB 上 应用 HRB W2~25W 系列模块电源是一种DC-DC升压变换器。该模块电源的输入电压分为&a…

Android databinding之数据单向与双向绑定详解与使用(三)

一、介绍 通过前面两篇文档&#xff0c;我们大概了解了databinding的工作方式&#xff0c;view的初始化&#xff0c;recycleview的使用。但是这些UI都离不开数据的填充&#xff0c;数据的修饰。 在说到数据绑定&#xff0c;好多开发者平时在工作中也经常听到databinding的数据…

https服务部署指南

1.概念 https服务的证书分布如下图&#xff1a; 客户端&#xff1a;CA证书 服务器&#xff1a;服务器证书&#xff0c;服务器密钥 2.证书生成&验证 2.1 证书生成 假设我们的域名为&#xff1a; www.contoso.com 创建CA私钥 openssl ecparam -out contoso.key -name p…

JMH基准测试工具 (一):介绍

在日常开发中&#xff0c;我们对一些代码的调用或者工具的使用会存在多种选择方式&#xff0c;在不确定他们性能的时候&#xff0c;我们首先想要做的就是去测量它。大多数时候&#xff0c;我们会简单的采用多次计数的方式来测量&#xff0c;来看这个方法的总耗时。 但是&#x…