JVM的监控

JVM的监控

Table of Contents *
一、jvm常见监控工具&指令 * 1、 jps:jvm进程状况工具 * 2、jstat: jvm统计信息监控工具 * 3、jinfo: java配置信息 * 4、jmap: java 内存映射工具 * 5、jhat:jvm堆快照分析工具 * 6、jstack:java堆栈跟踪工具 * 二、可视化工具 * 三、应用 * 1、cpu飙升 * 2、线程死锁 * 2.查看java进程的线程快照信息 * 3、OOM内存泄露 * 参考文章

| |
|
| |
| 。 | |
| |
| 在常见的线上问题时候,我们多数会遇到以下问题: |
| |
| > * 内存泄露 |
| > * 某个进程突然cpu飙升 |
| > * 线程死锁 |
| > * 响应变慢…等等其他问题。 |
| |
| 如果遇到了以上这种问题,在线下可以有各种本地工具支持查看,但到线上了,就没有这么多的本地调试工具支持,我们该如何基于监控工具来进行定位问题? |
| |
| 我们一般会基于数据收集来定位,而数据的收集离不开监控工具的处理,比如:运行日志、异常堆栈、GC日志、线程快照、堆快照等。经常使用恰当的分析和监控工具可以加快我们的分析数据、定位解决问题的速度。以下我们将会详细介绍。 |
| |
| ## 一、jvm常见监控工具&指令 |
| |
| ### 1、 jps:jvm进程状况工具 |
| |
| |
| |
| | | jps [options] [hostid]复制代码 | | |
| |
| |
| |
| 如果不指定hostid就默认为当前主机或服务器。 |
| |
| 命令行参数选项说明如下: |
| |
| |
| |
| | | -q 不输出类名、Jar名和传入main方法的参数 | | | | - l 输出main类或Jar的全限名 | | | | -m 输出传入main方法的参数 | | | | - v 输出传入JVM的参数复制代码 | | |
| |
| |
| |
| ### 2、jstat: jvm统计信息监控工具 |
| |
| jstat 是用于见识虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、jit编译等运行数据,它是线上定位jvm性能的首选工具。 |
| |
| 命令格式: |
| |
| |
| |
| | | jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ] | | | | generalOption - 单个的常用的命令行选项,如-help, -options, 或 -version。 | | | | outputOptions -一个或多个输出选项,由单个的statOption选项组成,可以和-t, -h, and -J等选项配合使用。复制代码 | | |
| |
| 参数选项: |
| |
| | Option | Displays | Ex | |
| | ———————————————————— | ———————————————————— | ———————————————————— | |
| | class | 用于查看类加载情况的统计 | jstat -class pid:显示加载class的数量,及所占空间等信息。 | |
| | compiler | 查看HotSpot中即时编译器编译情况的统计 | jstat -compiler pid:显示VM实时编译的数量等信息。 | |
| | gc | 查看JVM中堆的垃圾收集情况的统计 | jstat -gc pid:可以显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。 | |
| | gccapacity | 查看新生代、老生代及持久代的存储容量情况 | jstat -gccapacity:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小 | |
| | gccause | 查看垃圾收集的统计情况(这个和-gcutil选项一样),如果有发生垃圾收集,它还会显示最后一次及当前正在发生垃圾收集的原因。 | jstat -gccause:显示gc原因 | |
| | gcnew | 查看新生代垃圾收集的情况 | jstat -gcnew pid:new对象的信息 | |
| | gcnewcapacity | 用于查看新生代的存储容量情况 | jstat -gcnewcapacity pid:new对象的信息及其占用量 | |
| | gcold | 用于查看老生代及持久代发生GC的情况 | jstat -gcold pid:old对象的信息 | |
| | gcoldcapacity | 用于查看老生代的容量 | jstat -gcoldcapacity pid:old对象的信息及其占用量 | |
| | gcpermcapacity | 用于查看持久代的容量 | jstat -gcpermcapacity pid: perm对象的信息及其占用量 | |
| | gcutil | 查看新生代、老生代及持代垃圾收集的情况 | jstat -util pid:统计gc信息统计 | |
| | printcompilation | HotSpot编译方法的统计 | jstat -printcompilation pid:当前VM执行的信息 | |
| |
| 例如: |
| |
| 查看gc 情况执行:jstat-gcutil 27777 |
| |
|

JVM的监控 |
| |
| ### 3、jinfo: java配置信息 |
| |
| 命令格式: |
| |
| |
| |
| | | jinfo[option] pid复制代码 | | |
| |
| |
| |
| 比如:获取一些当前进程的jvm运行和启动信息。 |
| |
| JVM的监控 |
| |
| ### 4、jmap: java 内存映射工具 |
| |
| jmap命令用于生产堆转存快照。打印出某个java进程(使用pid)内存内的,所有’对象’的情况(如:产生那些对象,及其数量)。 |
| |
| 命令格式: |
| |
| |
| |
| | | jmap [ option ] pid | | | | jmap [ option ] executable core | | | | jmap [ option ] [server-id@]remote-hostname-or-IP复制代码 | | |
| |
| |
| |
| 参数选项: |
| |
| |
| |
| | | -dump:[live,]format=b,file=<filename> &#x4F7F;&#x7528;hprof&#x4E8C;&#x8FDB;&#x5236;&#x5F62;&#x5F0F;,&#x8F93;&#x51FA;jvm&#x7684;heap&#x5185;&#x5BB9;&#x5230;&#x6587;&#x4EF6;=. live&#x5B50;&#x9009;&#x9879;&#x662F;&#x53EF;&#x9009;&#x7684;&#xFF0C;&#x5047;&#x5982;&#x6307;&#x5B9A;live&#x9009;&#x9879;,&#x90A3;&#x4E48;&#x53EA;&#x8F93;&#x51FA;&#x6D3B;&#x7684;&#x5BF9;&#x8C61;&#x5230;&#x6587;&#x4EF6;. | | | | -finalizerinfo &#x6253;&#x5370;&#x6B63;&#x7B49;&#x5019;&#x56DE;&#x6536;&#x7684;&#x5BF9;&#x8C61;&#x7684;&#x4FE1;&#x606F;. | | | | -heap &#x6253;&#x5370;heap&#x7684;&#x6982;&#x8981;&#x4FE1;&#x606F;&#xFF0C;GC&#x4F7F;&#x7528;&#x7684;&#x7B97;&#x6CD5;&#xFF0C;heap&#x7684;&#x914D;&#x7F6E;&#x53CA;wise heap&#x7684;&#x4F7F;&#x7528;&#x60C5;&#x51B5;. | | | | -histo[:live] &#x6253;&#x5370;&#x6BCF;&#x4E2A;class&#x7684;&#x5B9E;&#x4F8B;&#x6570;&#x76EE;,&#x5185;&#x5B58;&#x5360;&#x7528;,&#x7C7B;&#x5168;&#x540D;&#x4FE1;&#x606F;. VM&#x7684;&#x5185;&#x90E8;&#x7C7B;&#x540D;&#x5B57;&#x5F00;&#x5934;&#x4F1A;&#x52A0;&#x4E0A;&#x524D;&#x7F00;&#x201D;*&#x201D;. &#x5982;&#x679C;live&#x5B50;&#x53C2;&#x6570;&#x52A0;&#x4E0A;&#x540E;,&#x53EA;&#x7EDF;&#x8BA1;&#x6D3B;&#x7684;&#x5BF9;&#x8C61;&#x6570;&#x91CF;. | | | | -permstat &#x6253;&#x5370;classload&#x548C;jvm heap&#x957F;&#x4E45;&#x5C42;&#x7684;&#x4FE1;&#x606F;. &#x5305;&#x542B;&#x6BCF;&#x4E2A;classloader&#x7684;&#x540D;&#x5B57;,&#x6D3B;&#x6CFC;&#x6027;,&#x5730;&#x5740;,&#x7236;classloader&#x548C;&#x52A0;&#x8F7D;&#x7684;class&#x6570;&#x91CF;. &#x53E6;&#x5916;,&#x5185;&#x90E8;String&#x7684;&#x6570;&#x91CF;&#x548C;&#x5360;&#x7528;&#x5185;&#x5B58;&#x6570;&#x4E5F;&#x4F1A;&#x6253;&#x5370;&#x51FA;&#x6765;. | | | | -F &#x5F3A;&#x8FEB;.&#x5728;pid&#x6CA1;&#x6709;&#x76F8;&#x5E94;&#x7684;&#x65F6;&#x5019;&#x4F7F;&#x7528;-dump&#x6216;&#x8005;-histo&#x53C2;&#x6570;. &#x5728;&#x8FD9;&#x4E2A;&#x6A21;&#x5F0F;&#x4E0B;,live&#x5B50;&#x53C2;&#x6570;&#x65E0;&#x6548;. | | | | -h | -help &#x6253;&#x5370;&#x8F85;&#x52A9;&#x4FE1;&#x606F; | | | | -J &#x4F20;&#x9012;&#x53C2;&#x6570;&#x7ED9;jmap&#x542F;&#x52A8;&#x7684;jvm. &#x590D;&#x5236;&#x4EE3;&#x7801; | |</filename> |
| |
| ### 5、jhat:jvm堆快照分析工具 |
| |
| jhat 命令与jamp搭配使用,用来分析map生产的堆快存储快照。jhat内置了一个微型http/Html服务器,可以在浏览器找那个查看。不过建议尽量不用,既然有dumpt文件,可以从生产环境拉取下来,然后通过本地可视化工具来分析,这样既减轻了线上服务器压力,有可以分析的足够详尽(比如 MAT/jprofile/visualVm)等。 |
| |
| ### 6、jstack:java堆栈跟踪工具 |
| |
| jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 |
| |
| 命令格式: |
| |
| |
| |
| | | jstack [ option ] pid | | | | jstack [ option ] executable core | | | | jstack [ option ] [server-id@]remote-hostname-or-IP&#x590D;&#x5236;&#x4EE3;&#x7801; | | |
| |
| |
| |
| 参数: |
| |
| |
| |
| | | -F&#x5F53;&#x2019;jstack [-l] pid&#x2019;&#x6CA1;&#x6709;&#x76F8;&#x5E94;&#x7684;&#x65F6;&#x5019;&#x5F3A;&#x5236;&#x6253;&#x5370;&#x6808;&#x4FE1;&#x606F; | | | | -l&#x957F;&#x5217;&#x8868;. &#x6253;&#x5370;&#x5173;&#x4E8E;&#x9501;&#x7684;&#x9644;&#x52A0;&#x4FE1;&#x606F;,&#x4F8B;&#x5982;&#x5C5E;&#x4E8E;java.util.concurrent&#x7684;ownable synchronizers&#x5217;&#x8868;. | | | | -m&#x6253;&#x5370;java&#x548C;native c/c++&#x6846;&#x67B6;&#x7684;&#x6240;&#x6709;&#x6808;&#x4FE1;&#x606F;. | | | | -h | -help&#x6253;&#x5370;&#x5E2E;&#x52A9;&#x4FE1;&#x606F; | | | | pid &#x9700;&#x8981;&#x88AB;&#x6253;&#x5370;&#x914D;&#x7F6E;&#x4FE1;&#x606F;&#x7684;java&#x8FDB;&#x7A0B;id,&#x53EF;&#x4EE5;&#x7528;jps&#x67E5;&#x8BE2;.&#x590D;&#x5236;&#x4EE3;&#x7801; | | |
| |
| |
| |
| 后续的查找耗费最高cpu例子会用到。 |
| |
| ## 二、可视化工具 |
| |
| 对jvm监控的常见可视化工具,除了jdk本身提供的Jconsole和visualVm以外,还有第三方提供的jprofilter,perfino,Yourkit,Perf4j,JProbe,MAT等。这些工具都极大的丰富了我们定位以及优化jvm方式。 |
| |
| 这些工具的使用,网上有很多教程提供,这里就不再过多介绍了。对于VisualVm来说,比较推荐使用,它除了对jvm的侵入性比较低以外,还是jdk团队自己开发的,相信以后功能会更加丰富和完善。jprofilter对于第三方监控工具,提供的功能和可视化最为完善,目前多数ide都支持其插件,对于上线前的调试以及性能调优可以配合使用。 |
| |
| 另外对于线上dump的heap信息,应该尽量拉去到线下用于可视化工具来分析,这样分析更详细。如果对于一些紧急的问题,必须需要通过线上监控,可以采用 VisualVm的远程功能来进行,这需要使用tool.jar下的MAT功能。 |
| |
| ## 三、应用 |
| |
| ### 1、cpu飙升 |
| |
| 在线上有时候某个时刻,可能会出现应用某个时刻突然cpu飙升的问题。对此我们应该熟悉一些指令,快速排查对应代码。 |
| |
| 1.找到最耗CPU的进程 |
| |
| |
| |
| | | &#x6307;&#x4EE4;:top&#x590D;&#x5236;&#x4EE3;&#x7801; | | |
| |
| |
| |
| |
| 2.找到该进程下最耗费cpu的线程 |
| |
| |
| |
| | | &#x6307;&#x4EE4;:top -Hp pid&#x590D;&#x5236;&#x4EE3;&#x7801; | | |
| |
| |
| |
| |
| |
| 3.转换进制 |
| |
| |
| |
| | | printf &#x201C;%x\n&#x201D; 15332 // &#x8F6C;&#x6362;16&#x8FDB;&#x5236;&#xFF08;&#x8F6C;&#x6362;&#x540E;&#x4E3A;0x3be4&#xFF09; &#x590D;&#x5236;&#x4EE3;&#x7801; | | |
| |
| |
| 4.过滤指定线程,打印堆栈信息 |
| |
| |
| |
| | | &#x6307;&#x4EE4;: | | jstack pid |grep 'threadPid' -C5 --color | | | | jstack 13525 |grep '0x3be4' -C5 --color // &#x6253;&#x5370;&#x8FDB;&#x7A0B;&#x5806;&#x6808; &#x5E76;&#x901A;&#x8FC7;&#x7EBF;&#x7A0B;id&#xFF0C;&#x8FC7;&#x6EE4;&#x5F97;&#x5230;&#x7EBF;&#x7A0B;&#x5806;&#x6808;&#x4FE1;&#x606F;&#x3002;&#x590D;&#x5236;&#x4EE3;&#x7801; | | |
| |
| 可以看到是一个上报程序,占用过多cpu了(以上例子只为示例,本身耗费cpu并不高) |
| |
| ### 2、线程死锁 |
| |
| 有时候部署场景会有线程死锁的问题发生,但又不常见。此时我们采用jstack查看下一下。比如说我们现在已经有一个线程死锁的程序,导致某些操作waiting中。 |
| |
| 1.查找java进程id |
| |
| |
| |
| | | &#x6307;&#x4EE4;:top &#x6216;&#x8005; jps &#x590D;&#x5236;&#x4EE3;&#x7801; | | |
| |
| |
| ### 2.查看java进程的线程快照信息 |
| |
| |
| |
| | | &#x6307;&#x4EE4;&#xFF1A;jstack -l pid&#x590D;&#x5236;&#x4EE3;&#x7801; | | |
| |
| 从输出信息可以看到,有一个线程死锁发生,并且指出了那行代码出现的。如此可以快速排查问题。 |
| |
| ### 3、OOM内存泄露 |
| |
| java堆内的OOM异常是实际应用中常见的内存溢出异常。一般我们都是先通过内存映射分析工具(比如MAT)对dump出来的堆转存快照进行分析,确认内存中对象是否出现问题。 |
| |
| 当然了出现OOM的原因有很多,并非是堆中申请资源不足一种情况。还有可能是申请太多资源没有释放,或者是频繁频繁申请,系统资源耗尽。针对这三种情况我需要一一排查。 |
| |
| OOM的三种情况: |
| |
| > 1.申请资源(内存)过小,不够用。 |
| > |
| > 2.申请资源太多,没有释放。 |
| > |
| > 3.申请资源过多,资源耗尽。比如:线程过多,线程内存过大等。 |
| |
| 1.排查申请申请资源问题。 |
| |
| |
| |
| | | &#x6307;&#x4EE4;:jmap -heap 11869 &#x590D;&#x5236;&#x4EE3;&#x7801; | | |
| |
| 查看新生代,老生代堆内存的分配大小以及使用情况,看是否本身分配过小。 |
| |
| |
| 从上述排查,发现程序申请的内存没有问题。 |
| |
| 2.排查gc |
| |
| 特别是fgc情况下,各个分代内存情况。 |
| |
| |
| |
| | | &#x6307;&#x4EE4;:jstat -gcutil 11938 1000 &#x6BCF;&#x79D2;&#x8F93;&#x51FA;&#x4E00;&#x6B21;gc&#x7684;&#x5206;&#x4EE3;&#x5185;&#x5B58;&#x5206;&#x914D;&#x60C5;&#x51B5;&#xFF0C;&#x4EE5;&#x53CA;gc&#x65F6;&#x95F4;&#x590D;&#x5236;&#x4EE3;&#x7801; | | |
| |
| |
| 3.查找最费内存的对象 |
| |
| |
| |
| | | &#x6307;&#x4EE4;: jmap -histo:live 11869 | more&#x590D;&#x5236;&#x4EE3;&#x7801; | | |
| |
| 上述输出信息中,最大内存对象才161kb,属于正常范围。如果某个对象占用空间很大,比如超过了100Mb,应该着重分析,为何没有释放。 |
| |
| 注意,上述指令: |
| |
| |
| |
| | | jmap -histo:live 11869 | more | | | | &#x6267;&#x884C;&#x4E4B;&#x540E;&#xFF0C;&#x4F1A;&#x9020;&#x6210;jvm&#x5F3A;&#x5236;&#x6267;&#x884C;&#x4E00;&#x6B21;fgc&#xFF0C;&#x5728;&#x7EBF;&#x4E0A;&#x4E0D;&#x63A8;&#x8350;&#x4F7F;&#x7528;&#xFF0C;&#x53EF;&#x4EE5;&#x91C7;&#x53D6;dump&#x5185;&#x5B58;&#x5FEB;&#x7167;&#xFF0C;&#x7EBF;&#x4E0B;&#x91C7;&#x7528;&#x53EF;&#x89C6;&#x5316;&#x5DE5;&#x5177;&#x8FDB;&#x884C;&#x5206;&#x6790;&#xFF0C;&#x66F4;&#x52A0;&#x8BE6;&#x5C3D;&#x3002; | | | | jmap -dump:format=b,file=/tmp/dump.dat 11869 | | | | &#x6216;&#x8005;&#x91C7;&#x7528;&#x7EBF;&#x4E0A;&#x8FD0;&#x7EF4;&#x5DE5;&#x5177;&#xFF0C;&#x81EA;&#x52A8;&#x5316;&#x5904;&#x7406;&#xFF0C;&#x65B9;&#x4FBF;&#x5FEB;&#x901F;&#x5B9A;&#x4F4D;&#xFF0C;&#x9057;&#x5931;&#x51FA;&#x9519;&#x65F6;&#x95F4;&#x3002;&#x590D;&#x5236;&#x4EE3;&#x7801; | | |
| |
| |
| 4.确认资源是否耗尽 |
| |
| > * pstree 查看进程线程数量 |
| > * netstat 查看网络连接数量 |
| |
| 或者采用: |
| |
| > * ll /proc/({PID}/fd | wc -l // 打开的句柄数 | | > * ll /proc/){PID}/task | wc -l (效果等同pstree -p | wc -l) //打开的线程数 |
| |
| 以上就是一些常见的jvm命令应用。 |
| |
| 一种工具的应用并非是万能钥匙,包治百病,问题的解决往往是需要多种工具的结合才能更好的定位问题,无论使用何种分析工具,最重要的是熟悉每种工具的优势和劣势。这样才能取长补短,配合使用。 |
| |
| |
| |
| |
| ## 参考文章 |
| |
| https://segmentfault.com/a/1190000009707894 |
| |
| https://www.cnblogs.com/hysum/p/7100874.html |
| |
| http://c.biancheng.net/view/939.html |
| |
| https://www.runoob.com/ |
| |
| https://blog.csdn.net/android_hl/article/details/53228348 |
| |
|

Original: https://www.cnblogs.com/gaoziman/p/15861998.html
Author: 爱笑的Gao
Title: JVM的监控

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/609574/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • [云原生]Kubernetes-介绍(第1章)

    一、应用部署方式演变 二、Kubernetes简介 三、Kubernetes组件 四、Kubernetes概念 参考: Kubernetes(K8S) 入门进阶实战完整教程,黑马程…

    Linux 2023年6月13日
    090
  • 日常开发方案设计指北

    互联网公司管理研发流程,常常使用TAPD一类的敏捷工具。一个需求从提出到上线要经历至少七个流程: 1)需求评审:产品经理给出需求文档,邀请技术参与需求评审,目的是扫清需求疑点,排除…

    Linux 2023年6月6日
    098
  • 聊聊支付流程的设计与实现逻辑

    新手打怵老手头疼的业务; 一、业务背景 通常在业务体系中,都会或多或少的涉及到支付相关的功能;对于一些经验欠缺同学来说,最紧张的就是面对这类支付结算的逻辑,因为流程中的任何细节问题…

    Linux 2023年6月14日
    074
  • Vim配置文件-详解(.vimrc)

    Vim配置文件的作用 Vim启动时,会根据配置文件(.vimrc)来设置 Vim,因此我们可以通过此文件来定制适合自己的 Vim 所有系统用户在启动Vim时,都会加载这个配置文件。…

    Linux 2023年6月13日
    080
  • Redis时延问题分析及应对

    Redis时延问题分析及应对 Redis的事件循环在一个线程中处理,作为一个单线程程序,重要的是要保证事件处理的时延短,这样,事件循环中的后续任务才不会阻塞;当redis的数据量达…

    Linux 2023年5月28日
    077
  • 软件基础的理论(1)

    软件基础的理论 一, 什么是软件产品 它是一个逻辑产品,没有实体,包括程序,文档和数据,需要通过终端设备才能体现出来功能和作用 二, 软件产品的中间过程文档 客户需求 &#…

    Linux 2023年6月7日
    078
  • WPF 切换主题使用 luna 复古版本

    本文告诉大家如何在 WPF 里面使用 luna 等复古主题 今天在 lsj 说他准备优化 WPF 的程序集时,准备删除 luna 等程序集时,找到了一段有趣的注释,发现在 WPF …

    Linux 2023年6月6日
    067
  • Shell脚本生成密码

    利用 /dev/urando 生成密码 密码以字母、数字、开头 特殊符号多 for _ in {1..30};do tr -dc ‘~`!@#$%^&*()_+-={}:&…

    Linux 2023年6月6日
    097
  • DHCP服务

    一、dhcp介绍 dhcp 应用层协议 动态主机配置协议 作用: 为主机动态分配tcp/ip参数(ip地址、掩码、网关、DNS服务器地址) Linux实现dhcp服务 软件: dh…

    Linux 2023年6月7日
    070
  • [ Python ] PyQt5 PySide2 笔记

    https://www.cnblogs.com/yeungchie/ PyQt5 from PyQt5.QtWidgets import * from PyQt5.QtCore i…

    Linux 2023年6月7日
    087
  • 系统复位到操作系统启动的简要流程图

    多核下,处理器由系统复位到操作系统启动的简要流程图; 其中第一列为处理器核初始化过程, 第二列为芯片核外部分初始化过程, 第三列为设备初始化过程, 第四列为内核加 载过程, 第五列…

    Linux 2023年6月14日
    087
  • 判断Redis复制是否完成的方法

    当需要使用Redis的复制功能时,有时需要能及时的得到复制完成的信息,或者说复制的进度。 Redis提供的INFO命令,可以提供redis运行时的各种信息。我们这里需要关注Repl…

    Linux 2023年5月28日
    0109
  • 面试必问的安卓虚拟机,你真的掌握了么?——安卓虚拟机基础知识回顾

    前言 21世纪,安卓虚拟机正在一步步的走入我们的生活,小到个人部分朋友在电脑上使用安卓虚拟机玩手游,大到安卓从业人员在虚拟机上面跑程序。不得不承认,对于每一位Androider 而…

    Linux 2023年6月13日
    092
  • 55分钟学会正则表达式

    什么是正则正则表达式是一种用来描述一定数量文本的模式,用来匹配相同规范样式的文本。在JavaScript中用RegExp对象表示正则表达式( 即Regular Eexpressio…

    Linux 2023年6月13日
    083
  • ShardingSphere-proxy-5.0.0建立mysql读写分离的连接(六)

    一、修改配置文件config-sharding.yaml,并重启服务 # Licensed to the Apache Software Foundation (ASF) unde…

    Linux 2023年6月14日
    0103
  • cron 表达式

    cron 表达式 1.简介:一个cron表达式最少有5个空格来分割时间元素,总共有7个元素,分别如下: ① 秒(0-59) ② 分钟(0-59) ③ 小时(0-23) ④ 天(月的…

    Linux 2023年6月7日
    064
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球