jvm指令使用

发布时间:2026/10/29 2:08:05
jvm指令使用 性能监控一种以非强行或者入侵方式收集或查看应用运营性能数据的活动。监控通常是指一种在生产、质量评估或者开发环境下实施的带有预防或主动性的活动。当应用相关干系人提出性能问题却没有提供足够多的线索时首先我们需要进行性 能监控随后是性能分析。GC频繁cpu load过高OOM内存泄漏死锁程序响应时间较长概述openjdk中各个命令的源码https://hg.openjdk.org/jdk/jdk11/file/1ddf9a99e4ad/src/jdk.jcmd/share/classes/sun/toolsjps查看正在运行的java进程显示指定系统内所有的HotSpot虚拟机进程(查看虚拟机进程信息)可用于查询正在运行的虚拟机进程。和linux的ps命令类似说明:对于本地虚拟机进程来说进程的本地虚拟机ID与操作系统的进程ID是一致的是唯一的。​​​​​​​hhyhhydeMacBook-Pro ~ % jps 54259 Jps 54227 Main hhyhhydeMacBook-Pro ~ %jps命令本身也是一个进程Main是idea程序它的基本使用语法为:jps [options] [hostid]我们还可以通过追加参数来打印额外的信息。q参数是单独的,hostid可以监听远程java程序hhyhhydeMacBook-Pro ~ % jps -help usage: jps [-help] jps [-q] [-mlvV] [hostid] ​ Definitions: hostid: hostname[:port]-q:仅仅显示LVMID (local virtual machine id),即本地虚拟机唯一id。不显示主类的名称等-l:输出应用程序主类的全类名 或如果进程执行的是jar包则输出jar完整路径-m:输出虚拟机进程启动时传递给主类main()的参数-v:列出虚拟机进程启动时的JVM参数。比如:-Xms20m-Xmx50m是启动程序指定的jvm参数。只能查看手动设置的jvm参数默认的jvm参数值看不到得用jinfo命令说明:以上参数可以综合使用。如果某 Java进程关闭了默认开启的UsePerfData参数(即使用参数-XX:-UsePerfData)那么jps命令(以及下面介绍的jstat)将无法探知该Java 进程。测试-l参数hhyhhydeMacBook-Pro ~ % jps -l 54227 com.intellij.idea.Main 54316 sun.tools.jps.Jps测试-m参数//某个启动类参数太长将命令执行结果写入到txt文本中 jps -m a.txt ​ 54450 Jps -m 54227 Main 54437 Launcher /Users/hhy/Applications/IntelliJ IDEA.app/Contents/plugins/java/lib/jps-builders.jar:/Users/hhy/Applications/IntelliJ IDEA.app/Contents/plugins/java/lib/jps-builders-6.jar:/Users/hhy/Applications/IntelliJ IDEA.app/Contents/plugins/java/lib/jps-javac-extension.jar:/Users/hhy/Applications/IntelliJ IDEA.app/Contents/lib/util-8.jar:/Users/hhy/Applications/IntelliJ IDEA.app/Contents/lib/util_rt.jar:/Users/hhy/Applications/IntelliJ IDEA.app/Contents/lib/platform-loader.jar:/Users/hhy/Applications/IntelliJ IDEA.app/Contents/lib/annotations.jar:/Users/hhy/Applications/IntelliJ IDEA.app/Contents/lib/module-intellij.libraries.fastutil.jar:/Users/hhy/Applications/IntelliJ IDEA.app/Contents/lib/module-intellij.libraries.oro.matcher.jar:/Users/hhy/Applications/IntelliJ IDEA.app/Contents/lib/module-intellij.libraries.lz4.jar:/Users/hhy/Applications/IntelliJ IDEA.app/Contents/lib/module-intellij.libraries.aalto.xml.jar:/Users/hhy/Applications/IntelliJ IDEA.app/Contents/lib/module-intellij. 54406 RemoteMavenServer36 54438 Main atguigu测试-v参数4488 ScannerTest -javaagent:/Users/hhy/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar57904 -Dfile.encodingUTF-8hostid参数RMI注册表中注册的主机名。 如果想要远程监控主机上的java程序需要安装jstatd。对于具有更严格的安全实践的网络场所而言可能使用一个自定义的策略文件来显示对特定的可信主机或网络的访问尽管这种技术容易受到IP地址欺诈攻击。如果安全问题无法使用一个定制的策略文件来处理那么最安全的操作是不运行jstatd服务器而是在本地使用jstat和jps工具。jstat参看jvm统计信息jstat(JVM Statistics Monitoring Tool):用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。在没有GUI图形界面只提供了纯文本控制台环境的服务器上它将是运行期定位虚拟机性能问题的首选工具。常用于检测垃圾回收问题以及内存泄漏问题。官方文档http://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html基本语法Jstat -option [-t] [-hlines] vmid [interval [count]]generalOption: 一般选项 比如-helpoutputOptions 一个或多个输出选项由单个statOption以及任何-t、-h和-J选项组成。Vmid: 虚拟机标识符这是一个表示目标JVM的字符串。一般语法如下[协议][//]lvmid[hostname[:port]/servername]vmid就是进程pid可以直接用pid。Interval:间隔[s|ms], 样间隔以指定单位、秒s或毫秒ms为单位。默认单位是毫秒。必须是正整数。指定时jstat命令会在每个间隔内产生输出。Count(计数): 要显示的样本数量。默认值为无限这会导致jstat命令显示统计数据直到目标JVM终止或jstat命令终止。这个值必须是正整数。-t: 从程序启动到现在持续了多少s-h: head 打印命令输出的前n条。option有如下参数 前面带- :类加载器相关的class显示有关类加载器行为的统计数据。类的装载、卸载数量、总空间、类装载所消耗的时间等垃圾回收相关的gc显示垃圾收集堆行为的统计数据。包括Eden区、两个Survivor区、老年代、永久代等的容量、已用空间、Gc时间合计等信息。gccapacity显示有关各代人容量及其相应空间的统计数据。但输出主要关注java堆各个区域使用到的最大、最小空间gccause显示有关垃圾收集统计数据的摘要与-gcutil相同以及上次和当前如果适用垃圾收集事件的原因即额外输出导致最后一次或者当前正在发生的gc产生的原因。gcutil显示有关垃圾收集统计数据的摘要。与-gc基本相同输出主要关注已经使用空间占总空间的百分比gcnew显示新生代行为的统计数据。gcnewcapacity显示有关新一代及其相应空间大小的统计数据。输出内容主要关注使用到的最大、最小空间gcold显示有关旧一代行为和元空间统计数据的统计数据。gcoldcapacity显示有关旧一代尺寸的统计数据。gcmetacapacity显示有关元空间大小的统计数据。JIT相关的compiler显示有关Java HotSpot VM Just-in-Time编译器行为的统计数据。printcompilation显示Java HotSpot VM编译方法统计信息。测试- class参数先查看有哪些java进程和pidhhyhhydeMacBook-Pro ~ % jps -l 54227 com.intellij.idea.Main 54406 org.jetbrains.idea.maven.server.RemoteMavenServer36 54487 org.jetbrains.jps.cmdline.Launcher 54488 com.dubbo.ScannerTest 54732 sun.tools.jps.Jps查看com.dubbo.ScannerTest进程hhyhhydeMacBook-Pro ~ % jstat -class 54488 Loaded Bytes Unloaded Bytes Time 743 1452.0 0 0.0 0.08Loaded , 已加载类的个数第一个Bytes 已加载类占用内存的大小Unloaded已卸载类的个数第二个Bytes 已卸载类占用内存的大小Time 命令花费的时间测试interval参数默认单位是毫秒。必须是正整数。jstat命令会在每个间隔内产生输出。hhyhhydeMacBook-Pro ~ % jstat -class 54488 1000 Loaded Bytes Unloaded Bytes Time 743 1452.0 0 0.0 0.08测试count参数要显示的样本数量。默认值为无限这会导致jstat命令显示统计数据直到目标JVM终止或jstat命令终止。这个值必须是正整数。打印10次结束hhyhhydeMacBook-Pro ~ % jstat -class 54488 1000 10 Loaded Bytes Unloaded Bytes Time 743 1452.0 0 0.0 0.08测试-t参数输出Timestamp, 程序启动到现在持续了多少秒 每1000ms打印一次 10次后结束命令hhyhhydeMacBook-Pro ~ % jstat -class -t 54488 1000 10 Timestamp Loaded Bytes Unloaded Bytes Time 2522.0 743 1452.0 0 0.0 0.08 2523.0 743 1452.0 0 0.0 0.08 2524.0 743 1452.0 0 0.0 0.08 2525.0 743 1452.0 0 0.0 0.08 2526.0 743 1452.0 0 0.0 0.08 2527.0 743 1452.0 0 0.0 0.08 2528.0 743 1452.0 0 0.0 0.08 2529.0 743 1452.0 0 0.0 0.08 2530.0 743 1452.0 0 0.0 0.08 2531.0 743 1452.0 0 0.0 0.08测试-h打印前3条结果。hhyhhydeMacBook-Pro ~ % jstat -class -t -h3 54488 1000 10测试option参数-gc输出结果说明S0C: survivor0区容量S1Csurvivor1区容量S0U: survivor0区已经使用的容量S1U: survivor1区已经使用的容量EC: eden区容量EU:eden区已经使用的容量OC:old区容量OU:old区已经使用的容量MC: metadata元空间容量MUmetadata元空间已经使用的容量CCSC:压缩类容量CCSU:压缩类已经使用的容量YGC: youg gc次数YGCT: youg gc花费的时间FGC: full gc次数FGCT: full gc花费的时间GCT: 总的gc时间youg full下面的例子更直观。启动参数设置堆内存大小为60m。 默认新生代老年代 1:2 20m 40m。新生代中 eden区和survivor区比例为 8:1:1 , 则 eden:s0:s1 2m:2m:16mpackage com.dubbo; ​ import java.util.ArrayList; ​ /** * -Xms60m -Xmx60m -XX:SurvivorRatio8 */ public class GCTest { public static void main(String[] args) { ArrayListbyte[] list new ArrayList(); for (int i0; i1000; i) { byte[] arr new byte[1024 * 100]; //100kb list.add(arr); try { Thread.sleep(120); }catch (InterruptedException e) { e.printStackTrace(); } } } }​​​​​​​-gcutil显示有关垃圾收集统计数据的摘要。与-gc基本相同输出主要关注已经使用空间占总空间的百分比每隔1000ms打印一次共打印30次结束jstat -gcutil 55582 1000 30GCT YGCT FGCT , gc总时间-gccause显示有关垃圾收集统计数据的摘要与-gcutil相同以及上次和当前如果适用垃圾收集事件的原因即额外输出导致最后一次或者当前正在发生的gc产生的原因。Allocation Failure 新生代eden没有足够空间分配对象jstat经验我们可以比较 Java进程的启动时间以及总GC 时间(GCT 列)或者两次测量的间隔时间以及总 GC 时间的增量来得出 GC时间占运行时间的比例。如果该比例超过20%则说明目前堆的压力较大;如果该比例超过 90%则说明堆里几乎没有可用空间随时都可能抛出 OOM 异常。第1步: 在长时间运行的Java程序中我们可以运行jstat命令连续获取多行性能数据并取这几行数据中 OU列(即已占用的老年代内存)的最小值。第2步然后我们每隔一段较长的时间重复一次上述操作来获得多组 OU 最小值。如果这些值呈上涨趋势则说明该 Java程序的老年代内存已使用量在不断上涨这意味着无法回收的对象在不断增加因此很有可能存在内存泄漏。jinfo实时查看和修改jvm配置参数jinfoconfiguration info for java查看虚拟机配置参数信息也可用于调整虚拟机的配置参数。在很多情况下Java应用程序不会指定所有的Java虚拟机参数。而此时开发人员可能不知道某一个具体的Java虚拟机参数的默认值。在这种情况下可能需要通过查找文档获取某个参数的默认值。这个查找过程可能是非常艰难的。但有了jinfo工具开发人员可以很方便地找到Java虚拟机参数的当前值。基本语法jinfo [option] pidoption参数可分成两类查看-sysprops , 查看可以由System.getProperties()获取得的参数-flag 查看曾经赋值过的一些参数-flags 具体参数 查看某个java进程的具体参数修改针对boolean类型 -flag [|-]name针对非boolean类型, -flag 具体参数具体参数值注意macOS 的 SIPSystem Integrity Protection或代码签名权限拦截了调试请求 某些命令不能执行需要重签名在任意目录下执行cat debugger.entitlements EOF ?xml version1.0 encodingUTF-8? !DOCTYPE plist PUBLIC -//Apple//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd plist version1.0 dict keycom.apple.security.cs.debugger/key true/ /dict /plist EOF查看java的安装路径hhyhhydeMacBook-Pro jvmdemo % /usr/libexec/java_home -v 8 /Library/Java/JavaVirtualMachines/jdk1.8.0_501.jdk/Contents/Home在debugger.entitlements文件所在目录下执行codesign --entitlements debugger.entitlements --force --sign - /Library/Java/JavaVirtualMachines/jdk1.8.0_501.jdk/Contents/Home/bin/jinfo如果出现下面结果则覆盖成功/Library/Java/JavaVirtualMachines/jdk1.8.0_501.jdk/Contents/Home/bin/jinfo: replacing existing signaturejava8还需要执行下面命令hhyhhydeMacBook-Pro jvmdemo % codesign --entitlements debugger.entitlements --force --sign - /Library/Java/JavaVirtualMachines/jdk1.8.0_501.jdk/Contents/Home/lib/sa-jdi.jar-syspropsJinfo -sysprops pid总结jinfo不仅可以查看运行时某一个Java虚拟机参数的实际取值甚至可以在运行时修改部分参数并使之立即生效。但是并非所有参数都支持动态修改。参数只有被标记为manageable的flag可以被实时修改。其实这个修改能力是极其有限的。java -XX:PrintFlagsFinal -version grep manageable扩展命令jmap到处内存映像文件内存使用情况jmap(JVM Memory Map):作用一方面是获取lump文件(堆转储快照文件二进制文件)它还可以获取目标Java进程的内存相关信息包括Java堆各区域的使用情况、堆中对象的统计信息、类加载信息等。开发人员可以在控制台中输入命令“jmap -help”查阅jmap工具的具体使用方式和一些标准选项配置。官方文档jmap基本语法jmap [option] pidjmap [option] executable corejmap [option] [server_id]remote server IP or hostname其中option包括-dump生成java堆转储快照dump文件特别的dump:live只保存堆中的存活对象手动的方式-jmap -dump:formatb,filefilename.hprofpid-jmap -dump:live,formatb,filefilename.hprofpid 生产环境通常用live自动的方式-XX:HeapDumpOnOutOfMemoryError在程序发生0OM时导出应用程序的当前堆快照。-XX:HeapDumpPathfilename.hprof 可以指定堆快照的保存位置。当程序发生0OM退出系统时一些瞬时信息都随着程序的终止而消失而重现0OM问题往往比较困难或者耗时。此时若能在0OM时自动导出dump文件就显得非常迫切。一般来说使用jmap指令生成dump文件的操作算得上是最常用的jmap命令之一将堆中所有存活对象导出至一个文件之中。Heap Dump又叫做堆存储文件指一个Java进程在某个时间点的内存快照。Heap Dump在触发内存快照的时候会保存此刻的信息如下:说明1.通常在写Heap Dump文件前会触发一次FullGC自动的方式所以heap dump文件里保存的都是FullGC后留下的对象信息。2.由于生成dump文件比较耗时因此大家需要耐心等待尤其是大内存镜像生成dump文件则需要耗费更长的时间来完成。测试手动方式hhyhhydeMacBook-Pro ~ % jmap -dump:formatb,file1.hprof 58893 Dumping heap to /Users/hhy/1.hprof ... Heap dump file created ​ hhyhhydeMacBook-Pro ~ % jmap -dump:live,formatb,file1.hprof 58893 Dumping heap to /Users/hhy/1.hprof ... Heap dump file created-heap输出整个堆空间的详细信息包括GC的使用、堆配置信息以及内存的使用信息等。jmap -heap pid该命令只会显示当前时间点的堆内存情况比不上jps命令-histo输出堆中对象的统计信息包括类、实例数量和合计容量特别的:-histo:live只统计堆中的存活对象jmap -histo pid小结由于jmap将访问堆中的所有对象为了保证在此过程中不被应用线程干扰jmap需要借助安全点机制让所有线程停留在不改变堆中数据的状态。也就是说由jmap导出的堆快照必定是安全点位置的。这可能导致基于该堆快照的分析结果存在偏差。举个例子假设在编译生成的机器码中某些对象的生命周期在两个安全点之间那么:live选项将无法探知到这些对象。另外如果某个线程长时间无法跑到安全点jmap将一直等下去。与前面讲的jstat则不同垃圾回收器会主动将jstat所需要的摘要数据保存至固定位置之中而jstat只需直接读取即可。jhatjdk自带堆分析工具Sun JDK提供的jhat命令与jmap命令搭配使用用于分析jmap生成的heap dump文件(堆转储快照)。jhat内置了一个微型的HTTP/HTML服务器生成dump文件的分析结果后用户可以在浏览器中查看分析结果(分析虚拟机转储快照信息)。使用了jhat命令就启动了一个http服务端口是7000即http://1ocalhost:7000/,就可以在浏览器里分析。说明:jhat命令在JDK9、JDK10中已经被删除官方建议用VisualVM代替。jstack:查看堆中线程快照jstack(JVM StackTrace):用于生成虚拟机指定进程当前时刻的线程快照(虚拟机堆栈跟踪)。线程快照就是当前虚拟机内指定进程的每一条线程正在执行的方法堆栈的集合。生成线程快照的作用:可用于定位线程出现长时间停顿的原因如线程间死锁、死循环、请求外部资源导致的长时间等待等问题。这些都是导致线程长时间停顿的常见原因。当线程出现停顿时就可以用jstack显示各个线程调用的堆栈情况。官方文档jstack在thread dump中要留意下面几种状态死锁Deadlock(重点关注)等待资源Waiting(重点关注)conditionon等待获取监视器Waiting on monitor entry(重点关注)阻塞Blocked(重点关注)执行中Runnale暂停Suspended对象等待中Object.wait()或TIMED_WAITING停止Parked基本语法它的基本使用语法为:jstack option pidjstack管理远程进程的话需要在远程程序的启动参数中增加: -Djava.rmi.server.hostname.... -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port8888 -Dcom.sun.management.jmxremote.authenticatefalse -Dcom.sun.management.jmxremote.sslfalse测试package com.dubbo; ​ public class ThreadDeadLock { public static void main(String[] args) { StringBuilder s1 new StringBuilder(); StringBuilder s2 new StringBuilder(); ​ new Thread(){ Override public void run() { synchronized (s1) { s1.append(a); s2.append(1); try { Thread.sleep(100); }catch (InterruptedException e) { e.printStackTrace(); } ​ synchronized (s2) { s1.append(b); s2.append(2); try { Thread.sleep(100); }catch (InterruptedException e) { e.printStackTrace(); } } } } }.start(); ​ ​ new Thread(){ Override public void run() { synchronized (s2) { s1.append(c); s2.append(3); try { Thread.sleep(100); }catch (InterruptedException e) { e.printStackTrace(); } ​ synchronized (s1) { s1.append(d); s2.append(4); try { Thread.sleep(100); }catch (InterruptedException e) { e.printStackTrace(); } } } } }.start(); } }​执行jstack命令hhyhhydeMacBook-Pro ~ % jps 54227 Main 54406 RemoteMavenServer36 59384 Launcher 59385 ThreadDeadLock 59387 Jps hhyhhydeMacBook-Pro ~ % jstack 59385查看输出结果最后提示存在deadlock风险Thread-1 #20 prio5 os_prio31 tid0x00007f8b86843800 nid0xa213 waiting for monitor entry [0x000000030afc9000] java.lang.Thread.State: BLOCKED (on object monitor) at com.dubbo.ThreadDeadLock$2.run(ThreadDeadLock.java:47) - waiting to lock 0x000000066ac60278 (a java.lang.StringBuilder) - locked 0x000000066ac602c0 (a java.lang.StringBuilder) ​ Thread-0 #19 prio5 os_prio31 tid0x00007f8b86843000 nid0x8303 waiting for monitor entry [0x000000030aec6000] java.lang.Thread.State: BLOCKED (on object monitor) at com.dubbo.ThreadDeadLock$1.run(ThreadDeadLock.java:21) - waiting to lock 0x000000066ac602c0 (a java.lang.StringBuilder) - locked 0x000000066ac60278 (a java.lang.StringBuilder) Found one Java-level deadlock: Thread-1: waiting to lock monitor 0x00007f8b878578b8 (object 0x000000066ac60278, a java.lang.StringBuilder), which is held by Thread-0 Thread-0: waiting to lock monitor 0x00007f8b770b1808 (object 0x000000066ac602c0, a java.lang.StringBuilder), which is held by Thread-1 ​ Java stack information for the threads listed above: Thread-1: at com.dubbo.ThreadDeadLock$2.run(ThreadDeadLock.java:47) - waiting to lock 0x000000066ac60278 (a java.lang.StringBuilder) - locked 0x000000066ac602c0 (a java.lang.StringBuilder) Thread-0: at com.dubbo.ThreadDeadLock$1.run(ThreadDeadLock.java:21) - waiting to lock 0x000000066ac602c0 (a java.lang.StringBuilder) - locked 0x000000066ac60278 (a java.lang.StringBuilder) ​ Found 1 deadlock.补充使用代码获取线程信息package com.dubbo; ​ import java.util.Map; ​ /** * 获取所有线程的堆栈信息 */ public class AllStackTrace { public static void main(String[] args) { MapThread, StackTraceElement[] all Thread.getAllStackTraces(); for (Map.EntryThread, StackTraceElement[] threadEntry : all.entrySet()) { Thread key threadEntry.getKey(); StackTraceElement[] value threadEntry.getValue(); System.out.println(【Thread name is :】 key.getName()); for (StackTraceElement s : value) { System.out.println(\t s.toString()); } } } }​jcmd:多功能命令行在JDK1.7以后新增了一个命令行工具jcmd。 它是一个多功能的工具可以用来实现前面除了jstat之外所有命令的功能。比如:用它来导出堆、内存使用、查看Java进程、导出线程信息、执行Gc、JVM运行时间等。jcmd拥有jnma·的大部分功能并且在oracle的官方网站上也推荐使用jcmd命令代jmap命令官方文档jcmd基本语法jcmd -l : 列出所有的jvm进程类似jps -ljcmd pid help 针对指定进程列出支持的所有命令jcmd pid 具体命令 显示指定进程的指令命令的数据你可以探索jcmd中的下述功能看看有没有适合你项目的监控项:JFR.stop JFR.start JFR.dump JFR.check VM.native_memory VM.check_commercial_features VM.unlock_commercial_features ManagementAgent.stop ManagementAgent.start_local ManagementAgent.start VM.classloader_stats GC.rotate_log Thread.print JVMTI.data_dump VM.class_hierarchy GC.class_stats GC.class_histogram GC.heap_dump GC.finalizer_info GC.heap_info GC.run_finalization GC.run VM.info VM.uptime VM.dynlibs VM.set_flag VM.flags VM.system_properties VM.command_line VM.version help测试option选项查看类的直方图, 类似jmap -histojcmd 59385 GC.class_histogram查看jvm参数 类似jinfo -syspropsjcmd 59385 VM.system_propertiesGUI工具使用上一章命令行工具或组合能帮您获取目标Java应用性能相关的基础信息但它们存在下列局限:1.无法获取方法级别的分析数据如方法间的调用关系、各方法的调用次数和调用时间 等(这对定位应用性能瓶颈至关重要)。2.要求用户登录到目标 Java应用所在的宿主机上使用起来不是很方便。3.分析数据通过终端输出结果展示不够直观。为此JDK提供了一些内存泄漏的分析工具如jconsolejvisualvm等用于辅助开发人员定位问题但是这些工具很多时候并不足以满足快速定位的需求。所以这里我们介绍的工具相对多一些、丰富一些。Visual Vm在Visual Vm中安装 gc插件性能分析一种以侵入方式收集运行性能数据的活动它会影响应用的吞吐量或响应性。性能分析是针对性能问题的答复结果关注的范围通常比性能监控更加集中。性能分析很少在生产环境下进行通常是在质量评估、系统测试或者开发环境下进 行是性能监控之后的步骤。打开gc文件灵活运用命令行工具dump出队文件使用阿里的Arthas或jconsolejstack查看堆栈信息性能调优种为改善应用响应性或吞吐量而更改参数、源代码、属性配置的活动性能调优 是在性能监控、性能分析之后的活动。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询