javap命令的作用是什么?

典型回答 javap是jdk自带的一个工具,可以对代码反编译,也可以查看java编译器生成的字节码。 ✅什么是编译和反编译? 一般情况下,很少有人使用javap对class文件进行反编译,因为有很多成熟的反编译工具可以使用,比如jad。但是,javap还可以查看java编译器为我们生成的字节码。通过它,可以对照源代码和字节码,从而了解很多编译器内部的工作。 扩展知识 使用 javap命令分解一个class文件,它根据options来决定到底输出什么。如果没有使用options,那么javap将会输出包,类里的protected和public域以及类里的所有方法。javap将会把它们输出在标准输出上。来看这个例子,先编译(javac)下面这个类。 1 2 3 4 5 6 7 8 9 10 11 12 13 public class JavapTest { public static void main(String[] args) { String info = "this is hollis testing javap"; System.out.println(info); Integer integer = new Integer(1); String string = integer.toString(); String string1 = "Hollis" + "Chuang"; } } 在命令行上键入javap DocFooter后,输出结果如下: 1 2 3 4 5 6 7 8 ➜ javap JavapTest Compiled from "JavapTest.java" public class JavapTest { public JavapTest(); public static void main(java.lang.String[]); } 如果加入了-c,即javap -c JavapTest,那么输出结果如下: ...

March 22, 2026 · 4 min · santu

jhat有什么用,如何用他分析堆dump

典型回答 jhat(Java Heap Analysis Tool),是一个用来分析java的堆情况的命令。使用jmap生成的Java堆的Dump文件可以用jhat命令将其转成html的形式,然后通过http访问可以查看堆情况。 jhat命令解析会Java堆dump并启动一个web服务器,然后就可以在浏览器中查看堆的dump文件了。 扩展知识 使用 使用jmap命令生成dump: 1 2 3 $ jmap -dump:format=b,file=heapDump 62247 Dumping heap to /Users/hollis/workspace/test/heapDump ... Heap dump file created 以上命令可以将进程62247的堆dump文件导出到heapDump文件中。查看当前目录就能看到heapDump文件。 接下来,解析Java堆转储文件,并启动一个 web server: 1 2 3 4 5 6 7 8 9 10 11 $ jhat heapDump Reading from heapDump... Dump file created Thu Jan 21 18:59:51 CST 2016 Snapshot read, resolving... Resolving 341297 objects... Chasing references, expect 68 dots.................................................................... Eliminating duplicate references.................................................................... Snapshot resolved. Started HTTP server on port 7000 Server is ready. 使用jhat命令,就启动了一个http服务,端口是7000 ,然后在访问http://localhost:7000/ ...

March 22, 2026 · 1 min · santu

什么是Web 3.0?

Web 3.0是最近非常火的一个概念了,就算你不知道他具体是什么,但是你也一定听说过这个名词。 但是Web 3.0中又夹杂着很多其他的概念,比如币、DeFi、DeApps、NFT、元宇宙,等等更多其他的概念,所以很多人就更难理解了。这篇文章我们站在工程师的角度来谈一谈什么是Web 3.0,为什么他广受争议,他到底发展到什么阶段了,作为普通研发者,我们能在这里面做些什么呢? 第三代互联网 Web 3.0很多人把它称之为第三代互联网,那么他和前两代有什么区别呢?到底第三代做了啥事情呢?我们先了解下什么是 Web 1.0 和 Web 2.0。 Web 1.0 一般认为2004年之前的互联网就处于Web 1.0的时代,那时候的网站主要是提供了一些查阅信息的功能,比如像搜狐这类新闻网站、雅虎这类搜索网站,以及马云在做阿里巴巴之前搞的中国黄页。 这些网站的主要特点就是他们主要是做信息展示的,也就是说上面的内容你只能看。 所以,Web 1.0是只读的。 Web 2.0 那到了Web 2.0的时代之后呢,从2004年开始,很多互动式的网站、APP都接踵而至了,比如我们现在还常用的微信、抖音、FaceBook。 在这些Web 2.0的网站上面,你不仅能获取到很多信息,你还能参与进来做互动以及内容的产出。比如你可以做评论,发动态,发你的作品等等。 所以,Web 2.0是能读+写的。 Web 3.0 那什么是Web 3.0呢,那就是很多人认为说虽然在Web 2.0的时代,我们作为用户输出了很多内容,但是这些内容的所有权并不属于我们,而是属于那些平台的。而这些平台网站,虽然他们背后的服务器部署、以及应用架构可能是做了各种分布式、异地多活、冷热备份什么的。但是,归根结底,如果这家公司倒闭了,那你的数据也都没有了。所以,他还是中心化的。 在Web 2.0的时代,用户生产了很多内容和数据,但是真正受益的是那些平台,他们可以利用我们的数据进行营销、广告,很多时候我们没有任何办法。 那于是,就有人提出了Web 3.0的概念,在这里面,用户不仅可以读、也可以写数据,最重要是用户可以拥有自己的数据。 也就是说,在Web 3.0中,我的数据不再属于任何中心化的平台、公司、或者机构,我的数据属于我自己。那么,怎么算数据属于我自己呢? 如果腾讯说,好的,我宣布你的朋友圈属于你自己,那就算了?那当然不是。 如何实现这个<属于>呢,这就需要用到区块链了。 Web 3.0与区块链 Web 3.0中最重要的是用户拥有自己的数据,那么也就是说我们的数据不能存储在任何中心化的存储上。这时候就需要区块链这种去中心化的技术了。 所以,也有人说所谓的Web 3.0,其实就是运行在区块链技术上的去中心化互联网。 利用区块链技术,我们每一个人都可以是链上的一个节点,而且大家都是具有平等权利和义务的,不再需要一个中心,所有的上链的动作,不再需要中心处理节点、不需要数字证书、也不需要谁批准。所有参与的节点进行共识算法投票就行了。一旦经过确权,那就不可再更改了。 那么,其实区块链又分为公有链、私有链还有联盟链,大家想一想就不难理解,Web 3.0应该就是构建在公有链之上的。 Web 3.0的实际应用 Web 3.0 是想建设去中心化的互联网,那么就主要需要依赖区块链的技术。那和Web 1.0和Web 2.0一样,在Web 3.0 里面肯定需要有很多网站、应用供我们使用才行,那这些应用也需要构建在区块链之上,否则也就不算Web 3.0了。 那么,在Web 3.0中,有自己的货币——加密货币、自己的组织形式——DAO、自己的服务模式——智能合约、自己的藏品——NFT、自己的金融——DeFi、自己的游戏——GameFi等等。。。 所以,我们常说的那些数字货币、NFT、游戏、甚至是元宇宙,其实都是Web 3.0这个底层基础架构上面的实际应用。这些东西综合到一起就组成了Web 3.0。 当然,这些应用当中有一个比较特殊,那就是数字货币,他不仅仅是Web 3.0中的一个实际应用,更重要的是它是维持Web 3.0的一个重要基础,为什么这么说呢,还记得我们前面讲过了说Web 3.0需要基于公有链来运行,那么公有链想要自主的良好运行,就需要有激励制度,要不然谁会愿意上来共同维护这个体系呢。那真的能起到激励作用的,那无非就是币了。 ...

March 22, 2026 · 1 min · santu

什么是流程引擎,请问流程引擎有什么优缺点?

典型回答 流程引擎(Process Engine) 是一种用于自动化、管理和执行业务流程的软件系统。它通过将业务逻辑抽象为可定义的流程模型(如工作流、审批流程、订单处理等),实现任务的自动流转、状态管理、条件分支处理以及人工与系统交互的协调。流程引擎通常基于标准化的流程建模语言(如BPMN 2.0),支持流程的设计、部署、执行和监控。(来自百度) 简单点说就是通过把一堆业务操作节点编排成一个固定的执行流程,让这个流程可以按照规定的方式执行,并且可以做到可视化查看和配置。最简单的流程就是审批流 像上面这种,可以编排业务节点、分支流程等等的。 它的最大的好处就是可视化,可以让非技术人员一眼就能看懂,甚至参与设计。 还有就是标准化,比如你要实现的是一个请假审批流程,那么只要有一套统一的流程,那么就可以避免在代码中硬编码,因为流程帮你把他们编排好了,比如第一步主管审批,第二步HR审批,第三步财务审批,如果请假超过10天,则上升到二级主管审批。 另外,如果流程是相对标准的,那么可维护性也会好一些,因为改动都是局部的,比如在一个节点中改代码,或者在流程中增删节点,全局影响是可控的。 还有人说流程引擎可以自动化减少人工干预,但是这个如果是硬编码也能做到,所以这个就还好,不算啥大优势。 另外,流程引擎做得好的,可以支持各种分支、循环、子流程、异步等等的,就比较灵活,当然,这个通过硬编码也能实现。 流程引擎并不是没有任何缺点的,他也是有一些局限性的。 比如特别简单的逻辑,用流程引擎反而会比较重。因为流程引擎的代码,其实是不太好找的,一个节点的代码看完,你不太好找下一个节点,要去配置文件中先找到下一个节点的配置,然后才能找到具体的代码实现,所以不如硬编码来的更加直接。 还有就是频繁改动、不统一的业务场景不适合流程引擎,那样就会导致流程爆炸,一大堆流程,每一个新场景都加一个流程,基本没啥可复用性,那就没意义了。 扩展知识 主流框架 Activiti:轻量级,支持BPMN 2.0标准,与Spring集成友好,社区活跃。 - **<font style="color:rgb(64, 64, 64);">适用场景</font>**<font style="color:rgb(64, 64, 64);">:中小型项目,快速实现工作流自动化。</font> Camunda:基于Activiti分支,增强了对BPMN和DMN(决策模型)的支持,提供强大的运维监控工具(Cockpit)。 - **<font style="color:rgb(64, 64, 64);">适用场景</font>**<font style="color:rgb(64, 64, 64);">:企业级复杂流程管理,需深度监控和优化的场景。</font> Flowable:Activiti的另一分支,简化了核心模块,性能更优,支持CMMN(案例管理模型)。 - **<font style="color:rgb(64, 64, 64);">适用场景</font>**<font style="color:rgb(64, 64, 64);">:需要高性能和轻量级引擎的中大型项目。</font> ...

March 22, 2026 · 1 min · santu

DO、DTO、VO都是干什么的?

典型回答 DO、DTO、VO 是三个常见的 Java 对象,它们都是用来承载数据的,但是在不同的场景下有着不同的用途。 DO(Domain Object):**领域对象,也称为实体对象。**DO 通常用于数据库表的映射,DO中包含了实体的属性以及对实体的操作方法。DO 对应的是系统中的数据模型,通常与数据库表一一对应。 DTO(Data Transfer Object):**数据传输对象。**DTO 通常用于在不同层之间传输数据,例如在前端页面和后端服务之间传输数据时使用。DTO 对象封装了要传输的数据,避免了对数据的频繁访问和传输,从而提高了应用程序的性能。 VO(View Object):**视图对象,也称为展示对象。**VO 通常用于表示前端页面显示的数据,例如在 MVC 架构中的 View 层,VO 对应的是用户界面模型,通常与页面一一对应。 总的来说,DO、DTO、VO 都是用来承载数据的对象,它们在不同的场景下有着不同的作用。DO 用于表示实体对象,DTO 用于在不同层之间传输数据,VO 用于表示前端页面显示的数据。使用这三个对象可以有效地组织应用程序的数据模型,并且提高了应用程序的可维护性和可扩展性。 扩展知识 举一个简单的例子,假设我们有一个 User 实体类,包含了 id、username 和 password 三个属性。下面我们分别定义该实体类的 DO、DTO 和 VO。 UserDO(Domain Object):领域对象,对应数据库中的一条记录: 1 2 3 4 5 6 7 public class UserDO { private Long id; private String username; private String password; // getter 和 setter 方法 } UserDO 对象中包含了 id、username 和 password 三个属性,它对应着数据库中的一条记录。 ...

March 22, 2026 · 1 min · santu

你平常是怎么查看日志和做分析的?

典型回答 通常我们会使用ELK收集并查看日志,查询日志通过ES语法实现。但是有的时候,还是免不了要去服务器上查看日志。在Linux下,常用的有2种方式查看日志: 使用tail -f 日志文件名滚动输出日志文件。适用于实时观察日志的场景。 使用less 日志文件名查看整个日志文件,并按空格向下翻页,按ctrl+b向上翻页,按/并输入关键词向下搜索,按?并输入关键词向上搜索,按q退出。适用于通篇查看日志的场景。 除了日志的查看,有的时候我们还需要做一些分析,比如统计QPS,按照耗时排序等。 在不用ELK或者其他第三方日志平台的情况下,我们使用Linux命令是完全可以做到的。但只是tail和less命令完成不了上述需求,此时我们需要使用grep、awk、sort、uniq、wc等命令进行组合才能达到目的。这些命令组合不只用于分析日志,也可以用到其他分析场景(如统计磁盘、CPU使用情况)。 如以下需要做数据分析场景: 统计httpClient日志文件http_access.log中,某个接口的一天总请求量是多少。 统计客户端访问日志access.log中,返回http状态码为500的接口平均QPS是多少。 统计access.log中,某个接口耗时大于500ms,并按照耗时排序。 下面介绍几个常用的命令及使用方式。 扩展知识 grep命令:用于查找关键词,常用玩法: 1 2 3 4 grep '/xxx.json' http_access.log #查找http_access.log中包含xxx.json的接口 grep -C10 'NullPointException' warng.log #查找warn.log中包含NullPointException的前后10行 grep -i "asc" info.log #查找info.log中包含asc的行,忽略字符大小写 grep "ASC|asc" info.log #使用正则表达式匹配asc或者ASC wc命令:用于字词统计,常用玩法: 1 grep '/xxx.json' http_access.log | wc -l #查找http_access.log中接口名包含xxx.json的请求总共有多少条,wc -l起到统计行数的作用 sort命令:用于排序,常用玩法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 # 若test.txt文件内容如下 aa 1 cc 2 bb 0 sort test.txt #按字符顺序排序,结果为 aa 1 bb 0 cc 2 sort -r test.txt #按字符顺序降序,结果为 cc 2 bb 0 aa 1 sort -n -k2 test.txt #按第二列排序(-k2的作用) -n按数字顺序排序,结果为 bb 0 aa 1 cc 2 # 若test.txt文件内容如下 aa,1 cc,2 bb,0 sort -n -k2 -t ',' test.txt #以,作为分隔符(-t ','的作用)并按第二列排序(-k2的作用) -n按数字顺序排序 ,结果为 bb,0 aa,1 cc,2 uniq命令:用于去重,常用玩法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 grep 'Exception' warn.log| uniq -c #统计warn.log中的异常,去重并显示每种异常有多少个,uniq -c起到去重并统计相同字符出现的次数 #uniq经常与sort一起使用,玩法: # 若test.txt文件如下: aa,1 aa,1 cc,2 bb,0 bb,0 sort -k2 -t ',' -n test.txt|uniq -D #按第二列数字排序,并且只输出重复的行(uniq -D的作用),结果为 bb,0 bb,0 aa,1 aa,1 sort -k2 -t ',' -n test.txt|uniq -D #按第二列数字排序,并且只输出重复的行,只输出一次(uniq -d的作用),结果为 bb,0 aa,1 sort -k2 -t ',' -n test.txt|uniq #按第二列数字排序,并且去重,结果为 bb,0 aa,1 cc,2 sort -u -k2 -t ',' -n test.txt #输出的结果与上面|uniq相同(sort -u的作用) sort -k2 -t ',' -n test.txt|uniq -u #按第二列数字排序,只输出不重复的行,结果为(uniq -u的作用) cc,2 sort -k2 -t ',' -n test.txt|uniq -c #按第二列数字排序,统计重复行数(uniq -c的作用),结果为(第一列为相同行出现几次) 2 bb,0 2 aa,1 1 cc,2 awk命令:用于处理文本,awk是个非常强大的命令,能够处理输入的每一行字符串,玩法众多(够写一本书了),这里只介绍常用的: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # 若test.txt文件如下: aa 1 bb 1 cc 2 awk '{print $1}' test.txt #按空白字(默认)符拆分每一行为多列,这里$1代表输出第1列,$0代表一整行所有列,$NF代表最后一列,以上命令结果为: aa bb cc awk -F ',' #-F参数可以修改列的分隔符,这里改为按逗号分割 awk 'BEGIN{print "开始处理每行"}{print $1}END{print "结束处理"}' test.txt #特殊模式,BEGIN在处理每一行之前执行,END在处理每一行完成后执行,以上命令结果为: 开始处理每行 aa bb cc 结束处理 我们利用以上的命令,来回答扩展阅读开头的三个问题: ...

March 22, 2026 · 3 min · santu

CodeReview都会关注哪些问题?

Code Review 的目的是发现代码中可能存在的缺陷、漏洞和问题,并提出建设性的意见和建议。在 Code Review 过程中,通常会关注以下几个方面的问题: 代码质量:包括代码的可读性、可维护性、可扩展性、健壮性等方面。检查代码是否符合编码规范、是否存在代码冗余、是否使用了不恰当的数据结构或算法等。 易于理解: 代码是写给机器执行的,但是也是写给人看的。所以,在CR的时候也需要关注代码是否易于理解、是否清晰易懂、是否有注释等方面,以便其他开发人员可以快速了解代码的实现细节和逻辑。 潜在错误: 比如是否有空指针异常、是否有内存泄漏、分支是否完整等问题,以避免出现在生产环境中。 代码逻辑:检查代码是否正确实现了预期的业务逻辑,是否存在逻辑错误、边界条件处理不当等问题。 安全性:检查代码是否存在安全漏洞,如 SQL 注入、跨站脚本攻击等,是否使用了加密、防护措施等。 性能:检查代码是否存在性能问题,如循环嵌套过多、频繁的数据库读写等,是否使用了合适的算法和数据结构以及合理的缓存策略等。 注释和文档:检查代码是否有充分的注释和文档,是否符合编码规范、命名规范、文档规范等,以便于其他开发人员能够更好地理解和维护代码。 通过对这些问题的关注,可以帮助开发人员发现并解决代码中存在的问题,提高代码的质量和可维护性,从而保证应用程序的可靠性和稳定性。

March 22, 2026 · 1 min · santu

什么是状态机,能描述一下状态机的实现原理吗?

典型回答 状态机用于描述一个系统在不同状态之间的转换和行为,是状态模式的一种具体应用。状态机是一种抽象的计算模型,它包含有限个状态和转换规则,用于描述系统在不同状态下如何响应输入以及在不同输入下如何进行状态转换。 在我们日常开发中,我们提到的状态机基本都是有限状态机,用于解决状态相关的问题。有限状态机可以通过状态转换和事件触发来描述程序的行为和状态迁移。 ✅什么是状态模式,有哪些应用? 一个状态机通常包含以下几个要素: 状态(States):代表系统可能处于的各种状态,例如 “已下单”、“已支付”、“已发货” 等。 事件(Events):触发状态转换的事件,例如 “下单”、“支付”、“发货” 等。 转换(Transitions):定义状态之间的转换规则,即在某个事件发生时,系统从一个状态转换到另一个状态的规则。 动作(Actions):在状态转换发生时执行的操作或行为。 一般我们在工作中,我们的主要的业务单据都会有一个状态的设计,我们会通过状态图画出他的状态流转情况,而控制这些状态如何流转,就是状态机干的事儿。 状态机的实现,有很多种方式,可以用一些状态机的框架,如Spring StateMachine,也可以用状态模式,也可以自己封装一个工具类都行。 如果没有一个严格的状态机控制的话,我们是可以随便修改订单的状态的,我们可以在已下单状态直接推进到已发货状态,这显然是不对的。 而状态机就是来控制这个状态的流转的他的目的都是把状态、事件、转换以及动作封装在一起的,他把这些东西内聚在一起了。有了它,一个已下单状态的订单,只能通过支付事件来驱动,并且还会有一些其他的约束,比如支付金额>0(转移条件)等,然后他的下一个状态只能是已支付这样的。 如以下,是我们自己简单实现的一个状态机: 先定义订单状态的枚举: 1 2 3 4 5 6 7 8 public enum OrderState { PLACED, PAID, SHIPPED, REFUNDED, CANCELED, CONFIRMED } 然后,定义一个枚举来表示状态转换的事件。 1 2 3 4 5 6 7 8 public enum OrderEvent { PAY, CONFIRM, SHIP, CANCEL, REFUND, CANCEL } 创建一个状态机类,该类包含当前状态和处理状态转换的方法: ...

March 22, 2026 · 2 min · santu

Java中的随机是真随机吗?

典型回答 随机数在计算机应用中使用的比较广泛,最为熟知的便是在通信安全和现代密码学等领域中的应用。 随机数分为真随机数和伪随机数,我们程序中使用的基本都是伪随机数。 真随机数,通过物理实验得出,比如掷钱币、骰子、转轮、使用电子元件的噪音、核裂变等。需要满足随机性、不可预测性、不可重现性。 伪随机数,通过一定算法和种子得出。软件实现的是伪随机数。 只要这个随机数是由确定算法生成的,那就是伪随机。只能通过不断算法优化,使你的随机数更接近随机。 有限状态机不能产生真正的随机数的。所以,现代计算机中,无法通过一个纯算法来生成真正的随机数。无论是哪种语言,单纯的算法生成的数字都是伪随机数,都是由可确定的函数通过一个种子,产生的伪随机数。 扩展知识 真随机 真正的随机数是使用物理现象产生而不是计算机程序产生的。生成随机数的设备我们称之为真随机数生成器。 这样的设备通常是基于一些能生成低等级、统计学随机的“噪声”信号的微观现象,如热力学噪声、光电效应和量子现象。 从某种程度上来说,基于经典热噪声的随机数芯片读取当前物理环境中的噪声,并据此获得随机数。这类装置相对于基于软件算法的实现,由于环境中的变量更多,因此更难预测。 然而在牛顿力学的框架下,即使影响随机数产生的变量非常多,但在每个变量的初始状态确定后,整个系统的运行状态及输出在原理上是可以预测的,因此这一类装置也是基于确定性的过程,只是某种更难预测的伪随机数(pseudo random number)。 量子力学的发现从根本上改变了这一局面,因为其基本物理过程具有经典物理中所不具有的内禀随机性,从而可以制造出真正的随机数(true random number)产生器。 据美国国家标准与技术研究院(NIST)官网消息,该机构研究人员在2018年4月出版的《自然》杂志上撰文指出(原文地址:https://www.nature.com/articles/s41586-018-0019-0.epdf ),他们开发出一种新方法,可生成由量子力学保证的随机数字。新技术超越了此前获得随机数字的所有方法,得到了“真正的随机数字”,有助增强密码系统的安全性。 NIST数学家彼特·比尔霍斯特进一步解释说:“诸如翻转硬币之类的情况似乎是随机的,但如果能看到硬币确切的下落路径,最终结果也是可以预测的。因此,很难保证给定经典来源真正不可预测。量子力学在产生随机性方面表现更好,量子随机是真正的随机,因为对处于‘叠加’状态的量子粒子进行测量,得到的结果基本上是不可预测的。” 强随机数发生器 强随机数发生器依赖于操作系统底层提供的随机事件。强随机数生成器的初始化速度和生成速度都较慢,而且由于需要一定的熵累积才能生成足够强度的随机数,所以可能会造成阻塞。熵累积通常来源于多个随机事件源,如敲击键盘的时间间隔,移动鼠标的距离与间隔,特定中断的时间间隔等。所以,只有在需要生成加密性强的随机数据的时候才用它。 Java提供的强随机数发生器是java.security.SecureRandom类,该类也是一个线程安全类,使用synchronize方法保证线程安全,但jdk并没有做出承诺在将来改变SecureRandom的线程安全性。因此,同Random一样,在高并发的多线程环境中可能会有性能问题。

March 22, 2026 · 1 min · santu

什么是Java Dump,如何获取?

Dump是Java虚拟机的运行时快照。将Java虚拟机运行时的状态和信息保存到文件。 线程Dump,包含所有线程的运行状态。纯文本格式。 堆Dump,包含线程Dump,并包含所有堆对象的状态。二进制格式。 Java Dump有什么用? 补足传统Bug分析手段的不足: 可在任何Java环境使用;信息量充足。 针对非功能正确性的Bug,主要为:多线程幵发、内存泄漏。 扩展知识 如何制作Java Dump 使用Java虚拟机制作Dump 指示虚拟机在发生内存不足错误时,自动生成堆Dump 1 -XX:+HeapDumpOnOutOfMemoryError 使用图形化工具制作Dump 使用JDK(1.6)自带的工具:Java VisualVM。 使用命令行制作Dump jstack:打印线程的栈信息,制作线程Dump。 jmap:打印内存映射,制作堆Dump。

March 22, 2026 · 1 min · santu

留言给博主