您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

时间:2021-10-27 09:42:58  来源:  作者:Java架构师联盟

JDK命令行工具

在JDK的开发包中,除了大家熟知的JAVA.exe和javac.exe外,还有一系列辅助工具。这些辅助工具位于JDK安装目录下的bin目录中,可以帮助开发人员很好地解决Java应用程序的一些“疑难杂症”。图6.16显示了部分辅助工具。

乍看之下,虽然这些工具都是.exe的可执行文件,但事实上它们只是Java程序的一层包装,其真正的实现是在tools.jar中,如图6.17所示。

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 


用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

以jps工具为例,在控制台执行jps命令和
java-classpath%Java_HOME%/lib/tools.jarsun.tools.jps.Jps命令是等价的,即jps.exe只是这个命令的一层包装。

jps命令

jps命令类似于linux下的ps,但它只用于列出Java的进程。直接运行jps命令不加任何参数,可以列出Java程序进程ID及Main函数短名称,例如:

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

从这个输出结果中可以看到,当前系统中共存在3个Java应用程序,其中第一个输出Jps就是jps命令本身,这也证明了此命令的本质是一个Java程序。此外,jps还提供了一系列参数来控制它的输出内容。

参数-q可以指定jps只输出进程ID,而不输出类的短名称,例如:

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

参数-m可以用于输出传递给Java进程(主函数)的参数,例如:

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

参数-l可以用于输出主函数的完整路径,例如:

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

参数-v可以显示传递给JVM的参数,例如:

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

注意:jps命令类似于ps命令,但是它只列出系统中所有的Java应用程序。通过jps命令可以方便地查看Java进程的启动类、传入参数和JVM参数等信息。

jstat命令

jstat是一个可用于观察Java应用程序运行信息的工具。它的功能非常强大,可以通过它查看堆信息的详细情况。其基本使用语法如下:

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

其中,选项option可以由以下值构成。

·-class:显示ClassLoader的相关信息。

·-compiler:显示JIT编译的相关信息。

·-gc:显示与GC操作相关的堆信息。

·-gccapacity:显示各个代的容量及使用情况。

·-gccause:显示垃圾收集的相关信息(同-gcutil),同时显示最后一次或当前正在发生的垃圾收集的诱发原因。

·-gcnew:显示新生代信息。

·-gcnewcapacity:显示新生代的大小与使用情况。

·-gcold:显示老年代和永久代的信息。

·-gcoldcapacity:显示老年代的大小。

·-gcpermcapacity:显示永久代的大小。

·-gcutil:显示垃圾收集信息。

·-printcompilation:输出JIT编译的方法信息。相关参数含义如下:

·-t:可以在输出信息前加上一个Timestamp列,显示程序的运行时间。

·-h:可以设定在周期性数据输出时,当输出多少行数据后跟着输出一个表头信息。

·interval:用于指定输出统计数据的周期,单位为ms。

·count:用于指定一共输出多少次数据。

如下示例输出Java进程2972的ClassLoader相关信息。每秒统计一次信息,一共输出2次。

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

在以上的输出结果中,Loaded表示载入类的数量,第1个Bytes表示载入类的合计大小,Unloaded表示卸载类的数量,第2个Bytes表示卸载类的大小,Time表示在加载类和卸载类上所花的时间。

下例显示了查看JIT编译的信息。

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

其中,Compiled表示编译任务执行的次数,Failed表示编译失败的次数,Invalid表示编译不可用的次数,Time表示编译的总耗时,FailedType表示最后一次编译失败的类型,FailedMethod表示最后一次编译失败的类名和方法名。

下例显示了与GC操作相关的堆信息输出结果。

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

其中,各列的信息含义如下:

·S0C:s0(from)的大小(KB)。

·S1C:s1(from)的大小(KB)。

·S0U:s0(from)已使用的空间(KB)。

·S1U:s1(from)已使用的空间(KB)。

·EC:eden区的大小(KB)。

·EU:eden区已使用的空间(KB)。

·OC:老年代的大小(KB)。

·OU:老年代已经使用的空间(KB)。

·PC:永久区的大小(KB)。

·PU:永久区已使用的空间(KB)。

·YGC:新生代GC操作次数。

·YGCT:新生代GC操作耗时。

·FGC:FullGC操作次数。

·FGCT:FullGC操作耗时。

·GCT:GC操作总耗时。

下例显示了各个代的信息,与-gc相比,它不仅输出了各个代的当前大小,也包含各个代的最大值和最小值。

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

其中部分列的信息含义如下:

·NGCMN:新生代最小值(KB)。

·NGCMX:新生代最大值(KB)。

·NGC:当前新生代大小(KB)。

·OGCMN:老年代最小值(KB)。

·OGCMX:老年代最大值(KB)。

·PGCMN:永久代最小值(KB)。

·PGCMX:永久代最大值(KB)。

下例显示了最近一次执行GC操作的原因及当前执行GC操作的原因。

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

其中部分列的信息含义如下:

·LGCC:上次执行GC操作的原因。

·GCC:当前执行GC操作的原因。

以上输出结果显示,最近一次执行GC操作是由于显式的System.gc()调用所引起的,当前时刻未执行GC操作。

-gcnew参数可以用于查看新生代的一些详细信息。

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

其中部分列的信息含义如下:

·TT:新生代对象晋升到老年代对象的年龄。

·MTT:新生代对象晋升到老年代对象的年龄最大值。

·DSS:所需的survivor区大小。

-gcnewcapacity参数可以详细地输出新生代各个区的大小信息。

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

其中部分列信息如下:

·S0CMX:s0区的最大值(KB)。

·S1CMX:s1区的最大值(KB)。

·ECMX:eden区的最大值(KB)。

-gcold参数用于展现老年代GC操作的概况。

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

-gcoldcapacity参数用于展现老年代的容量信息。

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

-gcpermcapacity参数用于展示永久区的使用情况。

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 


用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

-gcutil参数用于展示GC回收的相关信息。

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

其中部分列的信息如下:

·S0:s0区使用的百分比。

·S1:s1区使用的百分比。

·E:eden区使用的百分比。

·O:old区使用的百分比。

·P:永久区使用的百分比。

注意:jstat命令可以非常详细地查看Java应用程序的堆使用情况及GC操作情况。

jinfo命令

jinfo可以用来查看正在运行的Java应用程序的扩展参数,甚至支持在运行时修改部分参数。其基本语法如下:

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

其中,option可以为以下信息:

·-flag<name>:打印指定JVM的参数值。

·-flag[+|-]<name>:设置指定JVM参数的布尔值。

·-flag<name>=<value>:设置指定JVM参数的值。

在很多情况下,Java应用程序不会指定所有的JVM参数,此时,开发人员可能不知道某一个具体的JVM参数的默认值。在这种情况下,需要通过查找文档获取某个参数的默认值。这个查找过程可能是非常艰难的,但有了jinfo工具,开发人员可以很方便地找到JVM参数的当前值。

例如,下例显示了新生代对象晋升到老年代对象的最大年龄。在应用程序启动时并没有指定这个参数,但通过jinfo可以查看这个参数的当前数值。

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

下例显示了是否打印GC的详细信息。

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

除了查找参数的值,jinfo也支持修改部分参数的数值,当然这个修改能力是极其有限的。下例中通过调用jinfo对PrintGCDetails参数进行修改,jinfo可以在Java程序运行时关闭或者打开这个开关。

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

注意:jinfo不仅可以查看运行时某一个JVM参数的实际取值,甚至可以在运行时修改部分参数,并使之立即生效。

jmap命令

jmap命令可以生成Java应用程序的堆快照和对象的统计信息。

下例使用jmap命令生成PID为2972的Java程序的对象统计信息,并输出到s.txt文件中。

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

可以看到,这个输出结果显示了内存中的实例数量和合计。

jmap命令的另一个更为重要的功能是得到Java程序的当前堆快照,例如执行以下命令:

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

本例中,将应用程序的堆快照输出到C盘的heap.bin文件中。之后,便可以通过多种工具分析该文件,例如6.3.5节中将要介绍的jhat工具。这里使用VisualVM工具打开这个快照文件,如图6.18所示。

注意:jmap命令可用于导出Java应用程序的堆快照。

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

jhat命令

使用jhat命令可以分析Java应用程序的堆快照内容。这里分析6.3.4节中使用jmap命令生成的堆文件heap.hprof,如下:

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

jhat在分析完成后,使用HTTP服务器展示其分析结果。在浏览器中访问http://127.0.0.1:7000,结果如图6.19所示。

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

在默认页中,jhat服务器显示了所有的非平台类信息。单击链接进入,可以查看选中类的超类、ClassLoader及该类的实例等信息。此外,在页面的底部,jhat还为开发人员提供了其他查询方式,如图6.20所示。

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

通过这些链接,开发者可以进一步查看所有类的信息(包括Java平台的类)、所有类的实例数量及实例的具体信息。最后,还有一个链接指向OQL查询界面。

图6.21显示了在jhat中查看Java应用程序中java.lang.String类的实例数量。

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

单击instances链接可以进一步查看String对象的实例,如图6.22所示。

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

通常,导出的堆快照信息非常多,因此可能很难通过页面上简单的链接索引找到想要的信息。为此,jhat还支持使用OQL语句对堆快照进行查询。执行OQL语句的界面非常简洁,如图6.23所示。例如,使用OQL查询出当前Java程序中所有java.io.File对象的路径,则OQL语句如下:

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

jhat的OQL语句与VisualVM的OQL非常接近,有兴趣的读者可以查阅本书中的相关章节。

注意:jhat命令可以对堆快照文件进行分析,它启动一个HTTP服务器,开发人员可以通过浏览器浏览Java堆快照。

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

jstack命令

jstack命令可用于导出Java应用程序的线程堆栈。其语法如下:

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

其中,-l选项用于打印锁的附加信息。

jstack工具会在控制台输出程序中所有的锁信息,并可以使用重定向将输出结果保存到文件中。例如:

 

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

 

下例演示了一个简单的死锁,两个线程分别占用south锁和north锁,并同时请求对方占用的锁,导致死锁发生。

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 


用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

使用jstack工具打印上例的输出结果,部分结果如下:

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 


用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

从jstack工具的输出结果中可以很容易地找到发生死锁的两个线程及死锁线程的持有对象和等待对象,从而帮助开发人员解决死锁问题。

注意:通过jstack工具不仅可以得到线程堆栈,还可以自动进行死锁检查,并输出找到的死锁信息。

jstatd命令

在本节之前所述的工具中,只涉及监控本机的Java应用程序,而在这些工具中,一些监控工具也支持对远程计算机的监控(如jps、jstat)。为了启用远程监控,则需要配合使用jstatd命令。

jstatd命令是一个RMI服务端程序,它的作用相当于代理服务器,建立本地计算机与远程监控工具的通信。jstatd服务器将本地的Java应用程序信息传递到远程计算机上,如图6.24所示。

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

直接打开jstatd服务器可能会抛出拒绝访问的异常:

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

这是由于jstatd程序没有足够的权限所致。可以使用Java的安全策略,为其分配相应的权限。下面的代码为jstatd分配了最大的权限,并将其保存在jstatd.all.policy文件中。

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

使用以下命令再次开启jstatd服务器:

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

这样,服务器开启成功。

注意:-J参数是一个公共参数,如jps和jstat等命令都可以接受这个参数。由于jps和jstat命令本身也是Java应用程序,-J参数可以为jps等命令本身设置其JVM参数。

默认情况下,jstatd将在1099端口开启RMI服务器。

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

以上命令行显示,本机的1099端口处于监听状态,相关进程号是3656。使用jsp命令查看3656进程正是jstatd,说明jstatd启动成功。

下面使用jps显示远程计算机的Java进程,执行命令如下:

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

使用jstat显示远程进程460的GC操作情况,执行命令如下:

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

hprof工具

与前文中介绍的监控工具不同,hprof不是独立的监控工具,它只是一个Javaagent工具,可以用于监控Java应用程序在运行时的CPU信息和堆信息。使用java-agentlib:hprof=help命令可以查看hprof的帮助文档。下面是hprof工具帮助信息的输出结果,加粗部分是常用的参数。

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

使用hprof工具可以查看程序中各个函数的CPU占用时间。以下代码包含3个方法,分别占用不同的CPU时间。

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 


用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

使用参数-agentlib:hprof=cpu=times,interval=10运行以上代码。times选项将会在Java函数的调用前后记录函数的执行时间,进而计算函数的执行时间。程序运行的部分输出结果如下:

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

可以很容易地看到运行时间最长的函数。

使用参数-agentlib:hprof=heap=dump,format=b,file=c:core.hprof运行程序,可以将应用程序的堆快照保存在指定文件c:core.hprof中。使用MAT或者VisualVM等工具可以分析这个堆文件。

使用参数-agentlib:hprof=heap=sites运行程序,可以输出Java应用程序中各个类所占的内存百分比。部分输出结果如下:

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

注意:使用hprof工具可以监控Java应用程序各个函数的运行时间,或导出程序的堆快照。

jcmd命令

在JDK7之后,JDK新增了一个命令行工具jcmd。不同于之前的命令行工具,jcmd是一个多功能工具,它几乎包括之前介绍的所有命令的功能。

如下命令类似于jps,列出当前正在运行的Java程序。

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

下面的命令显示了给定程序的启动时间。

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

不同于之前的命令行工具,jcmd的使用更加友好,它不仅支持pid作为输入,也可以使用主程序类名作为其输入,例如:

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

它足够“聪明”,甚至可以只写类的短名称,例如:

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

还可以通过jcmd很轻松地打印线程堆栈(类似于jstack),例如:

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

也可以通过jcmd打印类的柱状图信息(类似于jmap-histo),例如:

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

同样支持dump整个堆数据,例如:

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

 

上述命令会将整个堆信息转存到D:d.dump文件中。

还可以查看进程启动时的虚拟机参数,例如:

用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具


Tags:JDK   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
JDK命令行工具在JDK的开发包中,除了大家熟知的java.exe和javac.exe外,还有一系列辅助工具。这些辅助工具位于JDK安装目录下的bin目录中,可以帮助开发人员很好地解决Java应用程...【详细内容】
2021-10-27  Tags: JDK  点击:(34)  评论:(0)  加入收藏
JDK 17 正式发布+免费牛逼啊,JDK 16 刚发布半年(2021/03/16),JDK 17 又如期而至(2021/09/14),这个时间点牛逼啊,蹭苹果发布会的热度?记得当年 JDK 15 的发布也是同天,巧了。。虽然 iPho...【详细内容】
2021-09-16  Tags: JDK  点击:(88)  评论:(0)  加入收藏
背景在一台阿里云服务器上需要搭建nacos集群,服务器是centos7.先是使用安装上传命令yum install lrzszrz:从本地上传文件至服务器sz filename:从服务器下载文件至本地然后各种...【详细内容】
2021-04-14  Tags: JDK  点击:(364)  评论:(0)  加入收藏
背景目前,有很多公司的WEB服务器会出现CPU、内存、IO告警,运维人员往往不能及时地获取JVM等相关信息,以便分析造成告警的原因,故本文将从几个方面来阐述如何进行JVM快照,如何分析...【详细内容】
2021-03-12  Tags: JDK  点击:(168)  评论:(0)  加入收藏
1 类加载器在类加载器家族中存在着类似人类社会的权力等级制度:1.1 Bootstrap由C/C++实现,启动类加载器,属最高层,JVM启动时创建,通常由与os相关的本地代码实现,是最根基的类加载...【详细内容】
2021-01-20  Tags: JDK  点击:(192)  评论:(0)  加入收藏
JVM话说面试这块,JVM算是一个经典的也是三年必问的知识点了,而且这个知识点算是最重要的一个知识点,你如果会这个内容,那么对你的在之后的面试中,能够喊出一个不错的价格。而关于...【详细内容】
2020-12-15  Tags: JDK  点击:(74)  评论:(0)  加入收藏
现在很多编译器和软件都开始要求使用 JDK 11 了。因此我们希望在 CentOS 上安装 JDK 11。运行下面的命令:yum install java-11-openjdk-devel如果你的系统中还装有不同版本的...【详细内容】
2020-11-05  Tags: JDK  点击:(55)  评论:(0)  加入收藏
一,前言我们都知道,tomcat启动前需要配置JDK环境变量,如果没有配置JDK的环境变量,那么tomcat启动的时候就会报错,也就是无法启动。但是在我们的工作或者学习过程中,有的时候会出现...【详细内容】
2020-10-09  Tags: JDK  点击:(85)  评论:(0)  加入收藏
JDK 15已经于2020年9月15日如期发布。本文介绍JDK 15新特性。发布版本说明根据发布的规划,这次发布的 JDK 15 将是一个短期的过度版,只会被 Oracle 支持(维护)6 个月,直到明年 3...【详细内容】
2020-09-25  Tags: JDK  点击:(83)  评论:(0)  加入收藏
一、下载安装jdk并配置1.1 进行JDK下载 下载地址:一键直达JDK下载展示图 一般下载后,安装位置默认,一路下一步,一直到安装完毕-“关闭”。1.2 环境变量配置不要管是不是一般情况...【详细内容】
2020-09-03  Tags: JDK  点击:(144)  评论:(0)  加入收藏
▌简易百科推荐
一、Redis使用过程中一些小的注意点1、不要把Redis当成数据库来使用二、Arrays.asList常见失误需求:把数组转成list集合去处理。方法:Arrays.asList 或者 Java8的stream流式处...【详细内容】
2021-12-27  CF07    Tags:Java   点击:(3)  评论:(0)  加入收藏
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Java架构师之路    Tags:JAVA   点击:(5)  评论:(0)  加入收藏
大家好!我是老码农,一个喜欢技术、爱分享的同学,从今天开始和大家持续分享JVM调优方面的经验。JVM调优是个大话题,涉及的知识点很庞大 Java内存模型 垃圾回收机制 各种工具使用 ...【详细内容】
2021-12-23  小码匠和老码农    Tags:JVM调优   点击:(11)  评论:(0)  加入收藏
前言JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍...【详细内容】
2021-12-23  dingle    Tags:JDBC   点击:(12)  评论:(0)  加入收藏
Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试。目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的...【详细内容】
2021-12-23  JAVA小白    Tags:Java   点击:(10)  评论:(0)  加入收藏
Java从版本5开始,在 java.util.concurrent.locks包内给我们提供了除了synchronized关键字以外的几个新的锁功能的实现,ReentrantLock就是其中的一个。但是这并不意味着我们可...【详细内容】
2021-12-17  小西学JAVA    Tags:JAVA并发   点击:(10)  评论:(0)  加入收藏
一、概述final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。...【详细内容】
2021-12-15  唯一浩哥    Tags:Java基础   点击:(14)  评论:(0)  加入收藏
1、问题描述关于java中的日志管理logback,去年写过关于logback介绍的文章,这次项目中又优化了下,记录下,希望能帮到需要的朋友。2、解决方案这次其实是碰到了一个问题,一般的情况...【详细内容】
2021-12-15  软件老王    Tags:logback   点击:(17)  评论:(0)  加入收藏
本篇文章我们以AtomicInteger为例子,主要讲解下CAS(Compare And Swap)功能是如何在AtomicInteger中使用的,以及提供CAS功能的Unsafe对象。我们先从一个例子开始吧。假设现在我们...【详细内容】
2021-12-14  小西学JAVA    Tags:JAVA   点击:(21)  评论:(0)  加入收藏
一、概述观察者模式,又可以称之为发布-订阅模式,观察者,顾名思义,就是一个监听者,类似监听器的存在,一旦被观察/监听的目标发生的情况,就会被监听者发现,这么想来目标发生情况到观察...【详细内容】
2021-12-13  唯一浩哥    Tags:Java   点击:(16)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条