JDK的bin目录中有各种小工具,这些故障处理工具并不单纯是被Oracle公司作为“礼物”附赠给JDK的使用者,根据软件可用性和授 权的不同,可以把它们划分成三类:

  • 商业授权工具:主要是JMC(Java Mission Control)及它要使用到的JFR(Java Flight Recorder),JMC这个原本来自于JRockit的运维监控套件从JDK 7 Update 40开始就被集成到OracleJDK 中,JDK 11之前都无须独立下载,但是在商业环境中使用它则是要付费的[1]。
  • 正式支持工具:这一类工具属于被长期支持的工具,不同平台、不同版本的JDK之间,这类工具 可能会略有差异,但是不会出现某一个工具突然消失的情况[2]。
  • 实验性工具:这一类工具在它们的使用说明中被声明为“没有技术支持,并且是实验性质 的”(Unsupported and Experimental)产品,日后可能会转正,也可能会在某个JDK版本中无声无息地 消失。但事实上它们通常都非常稳定而且功能强大,也能在处理应用程序性能问题、定位故障时发挥 很大的作用。

各个工具的体积基本上都稳定在21KB左右。并非 JDK开发团队刻意把它们制作得如此精炼、统一,而是因为这些命令行工具大多仅是一层薄包装而已,真正的功能代码是实现在JDK的工具类库中的,假如使用的是Linux版本的JDK,还可以发现这些工具中不少是由Shell脚本直接写成,可以用文本编辑器打开并编辑修改它们。

JDK开发团队选择采用Java语言本身来实现这些故障处理工具是有特别用意的:当应用程序部署 到生产环境后,无论是人工物理接触到服务器还是远程Telnet到服务器上都可能会受到限制。借助这些 工具类库里面的接口和实现代码,开发者可以选择直接在应用程序中提供功能强大的监控分析功能 [4]。

注意 如果读者在工作中需要监控运行于JDK 5的虚拟机之上的程序,在程序启动时请添加参 数“-Dcom.sun.management.jmxremote”开启JMX管理功能,否则由于大部分工具都是基于或者要用到 JMX(包括下一节的可视化工具),它们都将无法使用,如果被监控程序运行于JDK 6或以上版本的 虚拟机之上,那JMX管理默认是开启的,虚拟机启动时无须再添加任何参数。

[1] 无论是GPL、BCL还是OTN协议,JMC在个人开发环境中使用是免费的。
[2] 这并不意味着永久存在,只是被移除前会有“deprecated”的过渡期,正式工具被移除的数量并不比 实验性工具来得少。
[3] 图4-2中展示的是JDK 9模块化改造之后的类库形式,在JDK 9前,这些代码实现在jdk\lib\tools.jar 中。
[4] 有一部分工具的实现并不属于Java SE的标准API,如果引入这些类库,就意味着你的程序只能运行 于HotSpot(或一些从Oracle买了JDK的源码许可证的虚拟机)上面,又或者在部署程序时需要一起部 署这些工具类库。

jps:虚拟机进程状况工具

JDK的很多小工具的名字都参考了UNIX命令的命名方式,jps(JVM Process Status Tool)是其中的典型。除了名字像UNIX的ps命令之外,它的功能也和ps命令类似:可以列出正在运行的虚拟机进 程,并显示虚拟机执行主类(Main Class,main()函数所在的类)名称以及这些进程的本地虚拟机唯一 ID(LVMID,Local Virtual Machine Identifier)。虽然功能比较单一,但它绝对是使用频率最高的JDK 命令行工具,因为其他的JDK工具大多需要输入它查询到的LVMID来确定要监控的是哪一个虚拟机进程。对于本地虚拟机进程来说,LVMID与操作系统的进程ID(PID,Process Identifier)是一致的,使用Windows的任务管理器或者UNIX的ps命令也可以查询到虚拟机进程的LVMID,但如果同时启动了 多个虚拟机进程,无法根据进程名称定位时,那就必须依赖jps命令显示主类的功能才能区分了。

jps命令格式:

jps [ options ] [ hostid ] jps

执行样例: jps -l
2388 D:\Develop\glassfish\bin…\modules\admin-cli.jar
2764 com.sun.enterprise.glassfish.bootstrap.ASMain
3788 sun.tools.jps.Jps

jps还可以通过RMI协议查询开启了RMI服务的远程虚拟机进程状态,参数hostid为RMI注册表中 注册的主机名。jps的其他常用选项见表4-1。
表4-1 jps工具主要选项

选项 作用
-q 只输出LV MID, 省略主类的名称
-m 输出虚拟机进程启动时传递给主类main() 函数的参数
-l 输出主类的全名, 如果进程执行的是JAR包, 则输出JAR路径
-v 输出虚拟机进程启动时的JVM参数

jstat:虚拟机统计信息监视工具

jstat(JVM Statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程[1]虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据,在没有 GUI图形界面、只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的常用工 具。

jstat命令格式为: jstat [ option vmid [interval[s|ms] [count]] ]

对于命令格式中的VMID与LVMID需要特别说明一下:如果是本地虚拟机进程,VMID与LVMID 是一致的;如果是远程虚拟机进程,那VMID的格式应当是:
[protocol:][//]lvmid[@hostname[:port]/servername]
参数interval和count代表查询间隔和次数,如果省略这2个参数,说明只查询一次。假设需要每250 毫秒查询一次进程2764垃圾收集状况,一共查询20次,那命令应当是:

jstat -gc 2764 250 20

选项option代表用户希望查询的虚拟机信息,主要分为三类:类加载、垃圾收集、运行期编译状况。详细请参考表4-2中的描述。

表4-2 jstat工具主要选项

选项 作用
-class 监视类加载、卸载数量、总空间以及类装载所耗费的时间
-gc 监视Java堆状况, 包括Eden区、2个Survivor区、老年代、永久代等的容量,已用空间,垃圾收集时间合计等信息
-gccapacity 监视内容与-gc基本相同, 但输出主要关注Java堆各个区域使用到的最大、最小空间
-gcutil 监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比
-gccause 与-gcutil功能一样, 但是会额外输出导致上一次垃圾收集产生的原因
-gcnew 监视新生代垃圾收集状况
-gcnewcapacity 监视内容与-gcnew基本相同, 输出主要关注使用到的最大、最小空间
-gcold 监视老年代垃圾收集状况
-gcoldcapacity 监视内容与-g cold基本相同, 输出主要关注使用到的最大、最小空间
-gcpermcapacity 输出永久代使用到的最大、最小空间
-compiler 输出即时编译器编译过的方法、耗时等信息
-printcompilation 输出已经被即时编译的方法

代码清单4-1 jstat执行样例

查询结果表明:这台服务器的新生代Eden区(E,表示Eden)使用了6.2%的空间,2个Survivor区 (S0、S1,表示Survivor0、Survivor1)里面都是空的,老年代(O,表示Old)和永久代(P,表示 Permanent)则分别使用了41.42%和47.20%的空间。程序运行以来共发生Minor GC(YGC,表示Young GC)16次,总耗时0.105秒;发生Full GC(FGC,表示Full GC)3次,总耗时(FGCT,表示Full GC Time)为0.472秒;所有GC总耗时(GCT,表示GC Time)为0.577秒。

使用jstat工具在纯文本状态下监视虚拟机状态的变化,在用户体验上也许不如后文将会提到的 JMC、VisualVM等可视化的监视工具直接以图表展现那样直观,但在实际生产环境中不一定可以使用 图形界面,而且多数服务器管理员也都已经习惯了在文本控制台工作,直接在控制台中使用jstat命令 依然是一种常用的监控方式。

[1] 需要远程主机提供RMI支持,JDK中提供了jstatd工具可以很方便地建立远程RMI服务器。

jinfo:Java配置信息工具

jinfo(Configuration Info for Java)的作用是实时查看和调整虚拟机各项参数。使用jps命令的-v参数可以查看虚拟机启动时显式指定的参数列表,但如果想知道未被显式指定的参数的系统默认值,除了去找资料外,就只能使用jinfo的-flag选项进行查询了(如果只限于JDK 6或以上版本的话,使用java- XX:+PrintFlagsFinal查看参数默认值也是一个很好的选择)。jinfo还可以使用-sysprops选项把虚拟机 进程的System.getProperties()的内容打印出来。这个命令在JDK 5时期已经随着Linux版的JDK发布,当 时只提供了信息查询的功能,JDK 6之后,jinfo在Windows和Linux平台都有提供,并且加入了在运行期修改部分参数值的能力(可以使用-flag[+|-]name或者-flag name=value在运行期修改一部分运行期可写的虚拟机参数值)。在JDK 6中,jinfo对于Windows平台功能仍然有较大限制,只提供了最基本的-flag选项。

jinfo命令格式: jinfo [ option ] pid
执行样例:查询CMSInitiatingOccupancyFraction参数值

jinfo -flag CMSInitiatingOccupancyFraction 1444

jmap:Java内存映像工具

jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为heapdump或dump文件)。如果不使用jmap命令,要想获取Java堆转储快照也还有一些比较“暴力”的手段:譬如- XX:+HeapDumpOnOutOfMemoryError参数,可以让虚拟机在内存溢出异常出现之后自动生成堆转储快照文件,通过-XX:+HeapDumpOnCtrlBreak参数则可以使用[Ctrl]+[Break]键让虚拟机生成堆转储快照文件,又或者在Linux系统下通过Kill-3命令发送进程退出信号“恐吓”一下虚拟机,也能顺利拿到堆转储快照。

jmap的作用并不仅仅是为了获取堆转储快照,它还可以查询finalize执行队列、Java堆和方法区的详细信息,如空间使用率、当前用的是哪种收集器等。 和jinfo命令一样,jmap有部分功能在Windows平台下是受限的,除了生成堆转储快照的-dump选项和用于查看每个类的实例、空间占用统计的-histo选项在所有操作系统中都可以使用之外,其余选项都只能在Linux/Solaris中使用。
jmap命令格式: jmap [ option ] vmid option选项的合法值与具体含义如表4-3所示。

表4-3 jmap工具主要选项

选项 作用
-dump 生成Java堆转储快照。格式为-dump:[live,] format=b,file=, 其中live子参
数说明是否只dump出存活的对象
-finalizerinfo 显示在F-Queue中等待Finalizer线程执行finalize方法的对象。只在Linux/Solaris平台下有效
-heap 显示Java堆详细信息, 如使用哪种回收器、参数配置、分代状况等。只在Linux/Solaris平台下有效
-histo 显示堆中对象统计信息,包括类、实例数量、合计容量
-permstat 以ClassLoader为统计口径显示永久代内存状态。只在Linux/Solaris平台下有效
-F 当虚拟机进程对-dump选项没有响应时,可使用这个选项强制生成dump快照。只在Linux/Solaris平台下有效

使用jmap生成dump文件

jmap -dump:format=b,file=eclipse.bin 3500

Dumping heap to C:\Users\IcyFenix\eclipse.bin …
Heap dump file created

jhat:虚拟机堆转储快照分析工具

JDK提供jhat(JVM Heap Analysis Tool)命令与jmap搭配使用,来分析jmap生成的堆转储快照。 jhat内置了一个微型的HTTP/Web服务器,生成堆转储快照的分析结果后,可以在浏览器中查看。不过 实事求是地说,在实际工作中,除非手上真的没有别的工具可用,否则多数人是不会直接使用jhat命令 来分析堆转储快照文件的,主要原因有两个方面。一是一般不会在部署应用程序的服务器上直接分析 堆转储快照,即使可以这样做,也会尽量将堆转储快照文件复制到其他机器[1]上进行分析,因为分析 工作是一个耗时而且极为耗费硬件资源的过程,既然都要在其他机器上进行,就没有必要再受命令行 工具的限制了。另外一个原因是jhat的分析功能相对来说比较简陋,后文将会介绍到的VisualVM,以 及专业用于分析堆转储快照文件的Eclipse Memory Analyzer、IBM HeapAnalyzer[2]等工具,都能实现 比jhat更强大专业的分析功能。

jhat eclipse.bin

用户在浏览器中输入http://localhost:7000/可以看到分析结果。 分析结果默认以包为单位进行分组显示,分析内存泄漏问题主要会使用到其中的“Heap Histogram”(与jmap-histo功能一样)与OQL页签的功能,前者可以找到内存中总容量最大的对象,后 者是标准的对象查询语言,使用类似SQL的语法对内存中的对象进行查询统计。如果读者需要了解具体OQL的语法和使用方法,可参见本书附录D的内容。

[1] 用于分析的机器一般也是服务器,由于加载dump快照文件需要比生成dump更大的内存,所以一般在64位JDK、大内存的服务器上进行。
[2] IBM HeapAnalyzer用于分析IBM J9虚拟机生成的映像文件,各个虚拟机产生的映像文件格式并不一致,所以分析工具也不能通用。

jstack:Java堆栈跟踪工具

jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者 javacore文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的 目的通常是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间挂 起等,都是导致线程长时间停顿的常见原因。线程出现停顿时通过jstack来查看各个线程的调用堆栈, 就可以获知没有响应的线程到底在后台做些什么事情,或者等待着什么资源。

jstack命令格式: jstack [ option ] vmid option
选项的合法值与具体含义如表4-4所示。

表4-4 jstack工具主要选项

选项 作用
-F 当正常输出的请求不被响应时,强制输出线程堆栈
-l 除堆栈外,显示关于锁的附加信息
-m 如果调用到本地方法的话,可以显示C/C++的堆栈

从JDK 5起,java.lang.Thread类新增了一个getAllStackTraces()方法用于获取虚拟机中所有线程的 StackTraceElement对象。使用这个方法可以通过简单的几行代码完成jstack的大部分功能,在实际项目 中不妨调用这个方法做个管理员页面,可以随时使用浏览器来查看线程堆栈。

<%@ page import="java.util.Map"%>
<html> <head> <title>服务器线程信息</title> </head> <body> <pre> <% for (Map.Entry<Thread, StackTraceElement[]> stackTrace : Thread.getAllStack-Traces().entrySet()) { Thread thread = (Thread) stackTrace.getKey(); StackTraceElement[] stack = (StackTraceElement[]) stackTrace.getValue(); if (thread.equals(Thread.currentThread())) { continue; }out.print("\n线程:" + thread.getName() + "\n"); for (StackTraceElement element : stack) { out.print("\t"+element+"\n"); } } %></pre> </body>
</html>

基础工具总结

基础工具:用于支持基本的程序创建和运行

名称 主要作用
appletviewer 在不使用Web浏览器的情况下运行和调试Applet, JDK 11中被移除
extcheck 检查JAR冲突的工具, 从JDK 9中被移除
jar 创建和管理JAR文件
java Java运行工具, 用于运行Class文件或JAR文件
javac 用于Java编程语言的编译器
javadoc Java的API文档生成器
javah C语言头文件和Stub函数生成器, 用于编写JNI方法
javap Java字节码分析工具
jlink 将Module和它的依赖打包成一个运行时镜像文件
jdb 基于JPDA协议的调试器, 以类似于GDB的方式进行调试Java代码
jdeps Java类依赖性分析器
jdeprscan 用于搜索JAR包中使用了“deprecated”的类, 从JDK 9开始提供

安全:用于程序签名、设置安全测试等

名称 主要作用
keytool 管理密钥库和证书。主要用于获取或缓存Kerberos协议的票据授权票据。允许用户
查看本地凭据缓存和密钥表中的条目(用于Kerberos协议)
jarsigner 生成并验证JAR签名
policytool 管理策略文件的GUI工具, 用于管理用户策略文件(.java.policy) , 在JDK 10中被移除

国际化:用于创建本地语言文件

名称 主要作用
native2ascii 本地编码到ASCII编码的转换器(Native-to-ASCII Converter) , 用于“任意受支持的字符编码”和与之对应的“ASCII编码和Unicode转义”之间的相互转换

远程方法调用:用于跨Web或网络的服务交互

名称 主要作用
rmic Java RMI编译器, 为使用JR MP或IIOP协议的远程对象生成Stub、Skeleton和Tie类, 也用于生成OMG IDL
rmiregistry 远程对象注册表服务,用于在当前主机的指定端口上创建并启动一个远程对象注册表
rmid 启动激活系统守护进程,允许在虚拟机中注册或激活对象
serialver 生成并返回指定类的序列化版本ID

Java IDL与RMI-IIOP:在JDK 11中结束了十余年的CORBA支持,这些工具不再提供

名称 主要作用
tnameserv 提供对命名服务的访问
idlj IDL转Java编译器(IDL-to-Java Compiler) , 生成映射OMG IDL接口的Java源文件, 并启用以Java编程语言编写的使用CORBA功能的应用程序的Java源文件。IDL意即接口定义语言(Interface Definition Language)
orbd 对象请求代理守护进程(Object Request Broker Daemon) , 提供从客户端查找和调用CORBA环境服务 端上的持久化对象的功能。使用ORBD代替瞬态命名服务tnameserv。ORBD包括瞬态命名服务和持久命名服务。ORBD工具集成了服务器管理器、互操作命名服务和引导名称服务器的功能。当客户端想进行服务器时定位、注册和激活功能时, 可以与server tool一起使用
servertool 为应用程序注册、注销、启动和关闭服务器提供易用的接口

部署工具:用于程序打包、发布和部署

名称 主要作用
javapackager 打包、签名Java和Java FX应用程序, 在JDK 11中被移除
pack200 使用Java GZIP压缩器将JAR文件转换为压缩的Pack 200文件。压缩的压缩文件是高度压缩的JAR,可以直接部署,节省带宽并减少下载时间
unpack200 将Pack200生成的打包文件解压提取为JAR文件

Java Web Start

名称 主要作用
javaws 启动Java Web Start并设置各种选项的工具。在JDK 11中被移除

性能监控和故障处理:用于监控分析Java虚拟机运行信息,排查问题

名称 主要作用
jps JVM Process Status Tool, 显示指定系统内所有的HotSpot虚拟机进程
jstat JVM Statistics Monitoring Tool, 用于收集Hotspot虚拟机各方面的运行数据
jstatd JVM Statistics Monitoring Tool Daemon, jst at的守护程序, 启动一个RMI服务器应用程序,用于监视测试的HotSpot虚拟机的创建和终止, 并提供一个界面,允许远程监控工具附加到在本地系统上运行的虚拟机。在JDK 9中集成到了JHSDB中
jinfo Configuration Info for Java, 显示虚拟机配置信息。在JDK 9中集成到了JHSDB中
jmap Memory Map for Java, 生成虚拟机的内存转储快照(heap dump文件) 。在JDK 9中集成到了JHSDB中
jhat JVM Heap Analysis Tool, 用于分析堆转储快照, 它会建立一个HTTP/Web服务器, 让用户可以在浏览器上查看分析结果。在JDK 9中被JHSDB代替
jstack StackTrace for Java,显示虚拟机的线程快照。在JDK 9中集成到了J HSDB中
jhsdb Java HotSpot Debugger, 一个基于Serviceability Agent的HotSpot进程调试器, 从JDK 9开始提供
jsadebugd Java Serviceability Agent Debug Daemon, 适用于Java的可维护性代理调试守护程序, 主要用于附加到指定的Java进程、核心文件, 或充当一个调试服务器
jcmd JVM Command,虚拟机诊断命令工具, 将诊断命令请求发送到正在运行的Java虚拟机。从JDK 7开始提供
jconsole Java Console, 用于监控Java虚拟机的使用JMX规范的图形工具。它可以监控本地和远程Java虚拟机, 还可以监控和管理应用程序
jmc Java Mission Control, 包含用于监控和管理Java应用程序的工具, 而不会引入与这些工具相关联的性能开销。开发者可以使用jmc命令来创建JMC工具, 从JDK7 Update 40开始集成到Oracle JDK中
jvisualvm Java Visual VM, 一种图形化工具, 可在Java虚拟机中运行时提供有关基于Java技术的应用程序(Java应用程序) 的详细信息。Java Visual VM提供内存和CPU分析、堆转储分析、内存泄漏检测、MBean访问和垃圾收集。从JDK6 Update 7开始提供; 从JDK 9开始不再打包人JDK中,但仍保持更新发展,可以独立下载

WebService工具:与CORBA一起在JDK 11中被移除

名称 主要作用
schemagen 用于XML绑定的Schema生成器, 用于生成XMLSchema文件
wsgen XML WebService 2.0的Java API, 生成用于JAX-WS WebService的JAX-WS便携式产物
wsimport XML WebService 2.0的Java API, 主要用于根据服务端发布的WSDL文件生成客户端
xjc 主要用于根据XMLSchema文件生成对应的Java类

REPL和脚本工具

名称 主要作用
jshell 基于Java的Shell REPL(Read-Eval-Print Loop) 交互工具
jjs 对Nas horn引擎的调用入口。Nashorn是基于Java实现的一个轻量级高性能JavaScript运行环境
jrunscript Java命令行脚本外壳工具(CommandLine Script Shell) , 主要用于解释执行JavaScript、Groovy、Ruby等脚本语言

JDK基础故障处理工具相关推荐

  1. 深入理解java虚拟机(九)基础故障处理工具(jmap、jhat、jstack等)

    文章目录 前言 一.jps:虚拟机进程状况工具 二.jstat:虚拟机统计信息监视工具 三.jinfo: Java配置信息工具 四.jmap: Java内存映像工具 五.jhat:虚拟机堆转储快照分析 ...

  2. JDK基础脚本工具总结

    本文摘自<深入理解Java虚拟机 第三版>,如此书的作者所说,虽然现在已经有个各种可视化工具实现了对命令行工具的封装,方便且体验良好.但是不论JDK发展到什么版本,或者工具如何封装,这些底 ...

  3. 第4章 虚拟机性能监控、故障处理工具(上)

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 4.1 概述 经过前面两章对于虚拟机内存分配与回收技术各方面的介绍,相信读者已经建立了一个比 ...

  4. JVM2-性能监控故障处理工具

    给一个系统定位问题的时候,知识.经验是关键的基础,数据是依据,工具是运用知识处理数据的手段.这里的数据包括但是不限于异常堆栈.虚拟机运行日志.垃圾收集器.线程快照.堆转存储快照等. 四.虚拟机性能监控 ...

  5. 《深入理解JAVA虚拟机》周志明 第三版 - 第四章 虚拟机性能监控、故障处理工具

    4.1 概述 恰当地使用虚拟机故障处理.分析的工具可以提升我们分析数据.定位并解决问题的效率. 4.2 基础故障处理工具 JDK的bin目录中有java.exe.javac.exe这两个命令行工具,还 ...

  6. 虚拟机性能监控、故障处理工具

    目录 基础故障处理工具 jps:虚拟机进程状况工具 jstat:虚拟机统计信息监视工具 jinfo:Java配置信息工具 jmap:Java内存映像工具 jhat:虚拟机堆转储快照分析工具 jstac ...

  7. 《深入理解Java虚拟机第3版》垃圾收集器与内存分配策略、虚拟机性能监控故障处理工具

    目录 往期博客:Java课堂篇3_初识JMM.常量池简单理解(字符串常量池.静态常量池.大整型常量池) 为什么要了解垃圾收集和内存分配? 如何判断对象已死? 引用计数算法 可达性分析算法 JDK1.2 ...

  8. JVM-10虚拟机性能监控与故障处理工具之【JDK的命令行】

    文章目录 思维导图 概述 命令行工具 jps 虚拟机进程状况工具 概述 语法及使用 jstat 虚拟机统计信息监视工具 概述 语法及使用 jinfo Java配置信息工具 概述 语法及使用 jmap ...

  9. JVM-11虚拟机性能监控与故障处理工具之【JDK的可视化工具-JConsole】

    文章目录 思维导图 概述 JConsole: Java监视与管理平台 启动jconsole 内存监控示例 VM ARGS 代码 JConsole监控展示及说明 扩展问题 没有指定-Xmn,如何确定新生 ...

最新文章

  1. oracle 两层table of,ORACLE中嵌套表的基本知识
  2. 计算机二级为什么无法登录,解决因登录失败而无法启动SQL服务
  3. 设置域名_详解在nginx中设置三级域名的方法示例
  4. Deep Compression阅读理解及Caffe源码修改
  5. GIAC 2020 全球互联网架构大会演讲实录:基于TarsGo的微服务技术架构实践
  6. ABAP应用服务器的HTTP响应状态码(Status Code)
  7. python如何分成两行_python将文本分每两行一组并保存到文件
  8. 使用JS实现将GridView中的TextBox列的值博给GridView外的一个文本筐
  9. 平衡二叉树的旋转_平衡二叉树的旋转
  10. linux内核阅读感悟,读Kernel感悟-Linux内核启动-从hello world说起
  11. html登陆部分项目答辩演讲稿,D-POTDR项目答辩讲稿材料
  12. 读“让你的软件飞起来”持续更新代码运行效率之路
  13. 6-28小组会议记录
  14. 加密软件pgp 使用教程
  15. 关于mysql出现java.sql.SQLException错误!
  16. linux怎么切换键盘布局,Ubuntu 切换键盘布局(colemak - workman - norman)
  17. 海量数据时代,磁带存储的“涅槃重生”
  18. GPU Skinning旋转指定骨骼
  19. Java对象与json转换
  20. 七岁的OpenStack成熟了?企业就绪了?

热门文章

  1. MYSQL三:数据操作(含中文数据错误问题)
  2. Windows系统文件名查询
  3. 如何移植valgrind到arm开发板
  4. 剑三千岛湖服务器是不是维护了,剑网3千岛秘辛成就怎么做 探知千岛湖不为人知的秘密...
  5. 经典数学问题“空瓶换酒”求解(C/C++)
  6. 云原生小课堂 | 一文入门性能凶悍的开源分析数据库ClickHouse
  7. log4j2日志滚动和定期清理
  8. 敏感肌的最佳选择,你还不pick吗??
  9. [转] WEB设计趋势与潮流
  10. 使用JavaFx实现的俄罗斯方块小游戏