http://events.jianshu.io/p/011f0e3a39ff

一、jcmd 用法

1.1 基本知识

jcmd 是在 JDK1.7 以后,新增了一个命令行工具。

jcmd 是一个多功能的工具,相比 jstat 功能更为全面的工具,可用于获取目标 Java 进程的性能统计、JFR、内存使用、垃圾收集、线程堆栈、JVM 运行时间,也可以手动执行 GC、导出(TODO 能导出线程信息?)线程信息、堆信息等信息。

1.2 注意

1.2.1 jcmd 在 JDK1.7 以后才出现

1.2.2 jcmd 在旧的 jdk 版本中有些命令不支持

示例:

在1.8.0_73中不支持 GC.heap_info 参数:

# java -version
java version "1.8.0_73"
Java(TM) SE Runtime Environment (build 1.8.0_73-b02)
Java HotSpot(TM) 64-Bit Server VM (build 25.73-b02, mixed mode)
# jcmd 94666 GC.heap_info
94666:
java.lang.IllegalArgumentException: Unknown diagnostic command

但是 JDK 1.8.0_282 中支持 GC.heap_info 参数:

# java -version
openjdk version "1.8.0_282"
OpenJDK Runtime Environment (build 1.8.0_282-b08)
OpenJDK 64-Bit Server VM (build 25.282-b08, mixed mode) # jcmd 20399 GC.heap_info
20399:
PSYoungGen total 155136K, used 149434K [0x00000000ec400000, 0x00000000fb880000, 0x0000000100000000)
eden space 154624K, 96% used [0x00000000ec400000,0x00000000f559aa80,0x00000000f5b00000)
from space 512K, 65% used [0x00000000fb800000,0x00000000fb854010,0x00000000fb880000)
to space 11264K, 0% used [0x00000000fa280000,0x00000000fa280000,0x00000000fad80000)
ParOldGen total 52736K, used 25072K [0x00000000c4c00000, 0x00000000c7f80000, 0x00000000ec400000)
object space 52736K, 47% used [0x00000000c4c00000,0x00000000c647c218,0x00000000c7f80000)
Metaspace used 42333K, capacity 43838K, committed 43992K, reserved 1087488K
class space used 5070K, capacity 5347K, committed 5376K, reserved 1048576K

二、jcmd 用法

下面以 1.8.0_282 版本 JDK 的 jcmd 命令进行说明。

2.1 查看 help

# jcmd -help
Usage: jcmd <pid | main class> <command ...|PerfCounter.print|-f file>
or: jcmd -l
or: jcmd -h command must be a valid jcmd command for the selected jvm.
Use the command "help" to see which commands are available.
If the pid is 0, commands will be sent to all Java processes.
The main class argument will be used to match (either partially
or fully) the class used to start Java.
If no options are given, lists Java processes (same as -p). PerfCounter.print display the counters exposed by this process
-f read and execute commands from the file
-l list JVM processes on the local machine
-h this help

参数描述

  • pid:[常用] 接收诊断命令请求的进程ID。

  • main class :**[不常用] **接收诊断命令请求的进程的main类。匹配进程时,main类名称中包含指定子字符串的任何进程均是匹配的。

    如果多个正在运行的Java进程共享同一个main类,诊断命令请求将会发送到所有的这些进程中。

  • command:[常用] 支持的子命令,示例:GC.class_stats、GC.class_histogram。

    注意: 如果任何参数含有空格,你必须使用英文的单引号或双引号将其包围起来。 此外,你必须使用转义字符来转移参数中的单引号或双引号,以阻止操作系统shell处理这些引用标记。当然,你也可以在参数两侧加上单引号,然后在参数内使用双引号(或者,在参数两侧加上双引号,在参数中使用单引号)。

  • Perfcounter.print:[不常用] 打印目标Java进程上可用的性能计数器。性能计数器的列表可能会随着Java进程的不同而产生变化。

  • -f file:[不常用] 从文件file中读取命令,然后在目标Java进程上调用这些命令。在file中,每个命令必须写在单独的一行。以"#"开头的行会被忽略。当所有行的命令被调用完毕后,或者读取到含有stop关键字的命令,将会终止对file的处理。

  • -l:[常用] 查看所有的进程列表信息。

  • -h:[常用] 查看帮助信息。(同 -help)

2.2 查看进程 jcmd -l【常用】

命令: jcmd -l

作用:查看 当前机器上所有的 jvm 进程信息。

同类作用的命令:jcmd、 jcmd -l 、 jps -lm 这三个命令作用相同

示例:

# jcmd
5075 sun.tools.jcmd.JCmd
1255 org.tanukisoftware.wrapper.WrapperSimpleApp CloudResetPwdUpdateAgent
20399 /etc/java-app/springtest-0.0.1-SNAPSHOT.jar # jps -lm
1255 org.tanukisoftware.wrapper.WrapperSimpleApp CloudResetPwdUpdateAgent
20399 /etc/java-app/springtest-0.0.1-SNAPSHOT.jar
5087 sun.tools.jps.Jps -lm

2.3 列出当前运行的 java 进程可以执行的操作【常用】

命令:jcmd <pid> help

作用:列出当前运行的 java 进程可以执行的操作

说明:不同的 jvm 进程 支持的操作可能是不一样的

示例:

# jcmd 20399 help
20399:
The following commands are available:
VM.unlock_commercial_features
JFR.configure
JFR.stop
JFR.start
JFR.dump
JFR.check
VM.native_memory
ManagementAgent.stop
ManagementAgent.start_local
ManagementAgent.start
VM.classloader_stats
GC.rotate_log
Thread.print
GC.class_stats
GC.class_histogram
GC.heap_dump
GC.finalizer_info
GC.heap_info
GC.run_finalization
GC.run
VM.uptime
VM.dynlibs
VM.flags
VM.system_properties
VM.command_line
VM.version
help For more information about a specific command use 'help <command>'.

2.4 查看具体命令的选项

命令:jcmd <pid> help command

作用:列出当前运行的 java 进程可以执行的操作

说明:不同的 jvm 进程 支持的操作可能是不一样的

示例:

# jcmd 20399 help GC.class_stats
20399:
GC.class_stats
Provide statistics about Java class meta data. Requires -XX:+UnlockDiagnosticVMOptions. Impact: High: Depends on Java heap size and content. Syntax : GC.class_stats [options] [<columns>] Arguments:
columns : [optional] Comma-separated list of all the columns to show. If not specified, the following columns are shown: InstBytes,KlassBytes,CpAll,annotations,MethodCount,Bytecodes,MethodAll,ROAll,RWAll,Total (STRING, no default value) Options: (options must be specified using the <key> or <key>=<value> syntax)
-all : [optional] Show all columns (BOOLEAN, false)
-csv : [optional] Print in CSV (comma-separated values) format for spreadsheets (BOOLEAN, false)
-help : [optional] Show meaning of all the columns (BOOLEAN, false)

2.5 查看内存信息【常用】

命令:jcmd <pid> GC.heap_info
作用:查看JVM内存信息,虽然名称为heap_info,但是除了堆内存信息,也会有堆外内存之一的Metaspace的信息。相比jstat命令结果会更直观一些。

示例:

# jcmd 6339 GC.heap_info
6339:
PSYoungGen total 162816K, used 72120K [0x00000000f5580000, 0x00000000fff80000, 0x0000000100000000)
eden space 152576K, 43% used [0x00000000f5580000,0x00000000f96a3f68,0x00000000fea80000)
from space 10240K, 52% used [0x00000000ff580000,0x00000000ffaca460,0x00000000fff80000)
to space 10752K, 0% used [0x00000000fea80000,0x00000000fea80000,0x00000000ff500000)
ParOldGen total 53760K, used 16098K [0x00000000e0000000, 0x00000000e3480000, 0x00000000f5580000)
object space 53760K, 29% used [0x00000000e0000000,0x00000000e0fb8a00,0x00000000e3480000)
Metaspace used 37388K, capacity 38864K, committed 39040K, reserved 1083392K
class space used 4676K, capacity 4964K, committed 4992K, reserved 1048576K

2.6 查看性能统计信息

命令:jcmd <pid> PerfCounter.print
作用:查看指定进程的性能统计信息。

示例:

# jcmd 20399 PerfCounter.print
20399:
java.ci.totalTime=11018854737
java.cls.loadedClasses=7599
java.cls.sharedLoadedClasses=0
java.cls.sharedUnloadedClasses=0
java.cls.unloadedClasses=0
java.property.java.class.path="/etc/java-app/springtest-0.0.1-SNAPSHOT.jar"
java.property.java.endorsed.dirs="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.282.b08-1.el7_9.x86_64/jre/lib/endorsed"
java.property.java.ext.dirs="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.282.b08-1.el7_9.x86_64/jre/lib/ext:/usr/java/packages/lib/ext"
java.property.java.home="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.282.b08-1.el7_9.x86_64/jre"
java.property.java.library.path="/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib"
java.property.java.version="1.8.0_282"
.......省略.......
.......省略.......
sun.zip.zipFile.openTime=1494230
sun.zip.zipFiles=50

2.7 VM.uptime

命令:jcmd <pid> VM.uptime
作用:查看 JVM 的已启动时长。

示例:

# jcmd 20399 VM.uptime
20399:
18546050.327 s

2.8 GC.class_histogram【常用】

命令:jcmd <pid> GC.class_histogram
作用:查看系统中类统计信息。

同类作用的命令:和jmap -histo pid的效果是一样的,可以查看每个类的实例数量和占用空间大小。

示例:

# jcmd 20399 GC.class_histogram
20399:
num #instances #bytes class name
----------------------------------------------
1: 46386 7235264 [C
2: 2049 1781872 [B
3: 45242 1085808 java.lang.String
4: 8175 907288 java.lang.Class
5: 24964 798848 java.util.concurrent.ConcurrentHashMap$Node
6: 7448 655424 java.lang.reflect.Method
7: 7453 388704 [Ljava.lang.Object;
8: 7722 308880 java.util.LinkedHashMap$Entry
9: 18231 291696 java.lang.Object
10: 9050 289600 java.util.HashMap$Node
11: 3159 288272 [I
12: 3384 282568 [Ljava.util.HashMap$Node;
13: 133 239888 [Ljava.util.concurrent.ConcurrentHashMap$Node;
14: 3377 189112 java.util.LinkedHashMap
15: 5352 119768 [Ljava.lang.Class;
16: 3219 103008 java.lang.ref.WeakReference
.......省略.......
.......省略.......
3027: 1 16 sun.util.resources.LocaleData$LocaleDataResourceBundleControl
Total 284762 18014944

2.9 Thread.print

命令:jcmd <pid> Thread.print
作用:查看线程堆栈信息。

同类作用的命令:和jstack -l作用一样

# jcmd 20399 Thread.print
20399:
2021-11-14 12:31:28
Full thread dump OpenJDK 64-Bit Server VM (25.282-b08 mixed mode): "Attach Listener" #32 daemon prio=9 os_prio=0 tid=0x00007f89a0005000 nid=0x12ae waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE "DestroyJavaVM" #31 prio=5 os_prio=0 tid=0x00007f89c804b800 nid=0x4fb0 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE "http-nio-8099-AsyncTimeout" #29 daemon prio=5 os_prio=0 tid=0x00007f89c9e6c000 nid=0x4fcf waiting on condition [0x00007f897d9de000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at org.apache.coyote.AbstractProtocol$AsyncTimeout.run(AbstractProtocol.java:1133)
at java.lang.Thread.run(Thread.java:748)
.......省略.......
"VM Thread" os_prio=0 tid=0x00007f89c8158800 nid=0x4fb3 runnable
"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007f89c805e000 nid=0x4fb1 runnable
"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00007f89c8060000 nid=0x4fb2 runnable
"VM Periodic Task Thread" os_prio=0 tid=0x00007f89c81cb800 nid=0x4fba waiting on condition
JNI global references: 952

2.10 GC.heap_dump

命令:jcmd <pid> GC.heap_dump FILE_NAME
作用:查看 JVM 的Heap Dump。导出的 dump 文件,可以使用MAT 或者 Visual VM 等工具进行分析(如果只指定文件名,默认会生成在启动 JVM 的目录里)

同类作用的命令:和 jmap -dump:format=b,file=heapdump.phrof pid 作用一样

示例:

# jcmd 20399 GC.heap_dump /root/test/dump.hprof
20399:
Heap dump file created

2.11 VM.system_properties

命令:jcmd <pid> VM.system_properties
作用:查看 JVM 的属性信息。

同类作用的命令:和jinfo -sysprops pid作用一样。jinfo pid会输出 VM.system_properties 和 VM.flags,命令短,更好记住,所以推荐直接使用jinfo pid

示例:

# jcmd 20399 VM.system_properties
20399:
#Sun Nov 14 12:39:36 CST 2021
java.runtime.name=OpenJDK Runtime Environment
java.protocol.handler.pkgs=org.springframework.boot.loader
sun.boot.library.path=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.282.b08-1.el7_9.x86_64/jre/lib/amd64
java.vm.version=25.282-b08
java.vm.vendor=Red Hat, Inc.
java.vendor.url=https\://www.redhat.com/
.......省略.......
sun.io.unicode.encoding=UnicodeLittle
sun.cpu.endian=little
sun.cpu.isalist=

2.12 VM.flags

命令:jcmd <pid> VM.flags
作用:查看 JVM 的启动参数。

同类作用的命令:和jinfo -flags pid作用一样。jinfo pid会输出 VM.system_properties 和 VM.flags,命令短,更好记住,所以推荐直接使用jinfo pid

示例:

# jinfo -flags 20399
Attaching to process ID 20399, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.282-b08
Non-default VM flags: -XX:CICompilerCount=2 -XX:InitialHeapSize=62914560 -XX:MaxHeapSize=994050048 -XX:MaxNewSize=331350016 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=20971520 -XX:OldSize=41943040 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC

2.13 VM.command_line

命令:jcmd <pid> VM.command_line
作用:查看 JVM 的启动命令行。

示例:

# jcmd 6339 VM.command_line
6339:
VM Arguments:
jvm_args: -Xmx512m
java_command: /etc/java-app/springtest-0.0.1-SNAPSHOT.jar
java_class_path (initial): /etc/java-app/springtest-0.0.1-SNAPSHOT.jar
Launcher Type: SUN_STANDARD

2.14 GC.run_finalization

命令:jcmd <pid> GC.run_finalization
作用: 对 JVM 执行 java.lang.System.runFinalization()。执行一次 finalization 操作,相当于执java.lang.System.runFinalization()。调用已经失去引用的对象的finalize方法,但是JVM可以选择执行或者不执行。

示例:

# jcmd 6339 GC.run_finalization
6339:
Command executed successfully

2.15 GC.run

命令:jcmd <pid> GC.run
作用:对 JVM 执行 java.lang.System.gc()。同 GC.run_finalization 告诉垃圾收集器打算进行垃圾收集,但是JVM可以选择执行或者不执行。

$ jcmd 22912 GC.run
22912:
Command executed successfully

2.16 VM.version

命令:jcmd <pid> VM.version
作用:查看目标jvm进程的版本信息。

示例:

# jcmd 6339 VM.version
6339:
OpenJDK 64-Bit Server VM version 25.282-b08
JDK 8.0_282

2.17 VM.native_memory

命令:jcmd <pid> VM.native_memory

jcmd <pid> VM.native_memory [summary | detail | baseline | summary.diff | detail.diff | shutdown] [scale= KB | MB | GB]

# summary: 分类内存使用情况.
# detail: 详细内存使用情况,除了summary信息之外还包含了虚拟内存使用情况。
# baseline: 创建内存使用快照,方便和后面做对比
# summary.diff: 和上一次baseline的summary对比
# detail.diff: 和上一次baseline的detail对比
# shutdown: 关闭NMT

作用:查看目标jvm进程的Native Memory Tracking (NMT)信息,用于追踪JVM的内部内存使用。

注意:

打开NMT会带来5%-10%的性能损耗。

-XX:NativeMemoryTracking=xx参数必须放在 -jar 前面,示例:java -XX:NativeMemoryTracking=detail -jar -Xmn512m user.jar

使用 -XX:NativeMemoryTracking=summary 可以用于开启NMT,其中该值默认为off。
可以设置summary、detail来开启;开启的话,大概会增加5%-10%的性能消耗;使用-XX:+UnlockDiagnosticVMOptions -XX:+PrintNMTStatistics。
可以在jvm shutdown的时候输出整体的native memory统计;
其他的可以使用jcmd pid VM.native_memory相关命令进行查看、diff、shutdown等

整个memory主要包含了Java Heap、Class、Thread、Code、GC、Compiler、Internal、Other、Symbol、Native Memory Tracking、Arena Chunk这几部分;其中reserved表示应用可用的内存大小,committed表示应用正在使用的内存大小

示例:

备注:reserved表示应用可用的内存大小,committed表示应用正在使用的内存大小。

# jcmd 18787 VM.native_memory
18787: Native Memory Tracking: Total: reserved=1933966KB, committed=344310KB
- Java Heap (reserved=524288KB, committed=219136KB)
(mmap: reserved=524288KB, committed=219136KB) - Class (reserved=1087456KB, committed=43144KB)
(classes #7024) 说明:已经加载的classes个数
(malloc=4064KB #9142)
(mmap: reserved=1083392KB, committed=39080KB) - Thread (reserved=29918KB, committed=29918KB)
(thread #30) 说明:表示线程个数
(stack: reserved=29784KB, committed=29784KB)
(malloc=102KB #174)
(arena=32KB #56) - Code (reserved=251838KB, committed=12834KB)说明:表示JIT生成的或者缓存的instructions占用
(malloc=2238KB #3799)
(mmap: reserved=249600KB, committed=10596KB) - GC (reserved=22629KB, committed=21441KB)说明:目前已经占用的内存空间用于帮助GC
(malloc=3469KB #188)
(mmap: reserved=19160KB, committed=17972KB) - Compiler (reserved=147KB, committed=147KB)
(malloc=15KB #327)
(arena=133KB #5) - Internal (reserved=5156KB, committed=5156KB)说明:表示命令行解析、JVMTI等占用
(malloc=5124KB #9478)
(mmap: reserved=32KB, committed=32KB) - Symbol (reserved=10880KB, committed=10880KB) 说明:表示诸如string table及constant pool等symbol占用
(malloc=7771KB #70834)
(arena=3109KB #1) - Native Memory Tracking (reserved=1478KB, committed=1478KB)
(malloc=7KB #80) 说明:表示该功能自身占用
(tracking overhead=1472KB) - Arena Chunk (reserved=176KB, committed=176KB) 说明:表示arena chunk占用
(malloc=176KB)

更具体的使用方法参考:

JVM NativeMemoryTracking

2.18 JFR 相关命令

因为了解不多,暂且不介绍。

三、参考

JVM 性能调优工具 jcmd

十二、jdk工具之jcmd介绍(堆转储、堆分析、获取系统信息、查看堆外内存

JVM NativeMemoryTracking

[转帖]JVM-工具-jcmd的更多相关文章

  1. JVM工具jcmd实践

    暂时参考以下链接,后续补充自己的实践. https://www.jianshu.com/p/388e35d8a09b

  2. Linux ---> 监控JVM工具

    Linux ---> 监控JVM工具shkingshking 发布时间: 2013/10/10 01:27 阅读: 2642 收藏: 26 点赞: 1 评论: 0 JDK内置工具使用 jps(J ...

  3. jvm工具

    jvm工具 知识,经验是基础,数据是依据,工具是运营知识处理数据的手段 数据:运行日志.异常堆栈.GC日志.线程快照.堆转存储快照 JPS:虚拟机进程状况工具 jvm process status t ...

  4. 【原创】大叔经验分享(71)docker容器中使用jvm工具

    java应用中经常需要用到jvm工具来进行一些操作,如果java应用部署在docker容器中,如何使用jvm工具? 首先要看使用的docker镜像, 比如常用的openjdk镜像分为jdk和jre,只 ...

  5. [转帖]JVM总结--JVM体系结构

    JVM总结--JVM体系结构 https://blog.csdn.net/samjustin1/article/details/52215274 需要不断的学习才可以. 2016年08月15日 22: ...

  6. Java 7 命令/工具 jcmd 使用详细解释

    常见功能 列出 Java 进程 PID 以及 名称 列出进程的 thread dump 得到进程的 heap dump 得到进程的 JVM 参数 具体如下: 列出 Java 进程 PID 以及 名称 ...

  7. jvm工具及命令大全

      虚拟机栈 栈桢大小缺省为1M,可用参数 –Xss调整大小,例如-Xss256k 堆 -Xms:堆的最小值: -Xmx:堆的最大值: -Xmn:新生代的大小: -XX:NewSize:新生代最小值: ...

  8. 【深入理解JAVA虚拟机】第二部分.内存自动管理机制.4.JVM工具

    1.概述 工具作用:性能监控与故障处理 工作原理:分析数据 数据包含:运行日志. 异常堆栈. GC日志. 线程快照(threaddump/javacore文件). 堆转储快照(heapdump/hpr ...

  9. 【深入JVM】JVM工具之JMAP

    一.工具介绍 假设把java\bin文件夹配置到环境变量.在cmd输入jmap会有例如以下提示: 翻译:打印出某个java进程(使用pid)内存内的,全部'对象'的情况(如:产生那些对象,及其数量). ...

  10. 小试JVM工具

    一.前言 工欲善其事必先利其器,jdk自带了很多工具,利用好这些工具能够帮我们获取想要的数据(运行日志.异常堆栈.GC日志.线程快照.堆转储快照等),从而快速的分析数据.定位问题. 二.jps:虚拟机 ...

随机推荐

  1. 详解GaussDB(DWS)通信安全的小妙招:连接认证机制

    本文分享自华为云社区<GaussDB(DWS)数据库安全系列之通信安全>,作者:yd_262982826. 1. 前言 适用版本:[8.1.3及以上] 网络是一个开放的环境,仅仅依靠用户名 ...

  2. 华为云发布CodeArts Inspector漏洞管理服务,守护产品研发安全

    本文分享自华为云社区<华为云发布CodeArts Inspector漏洞管理服务,守护产品研发安全>,作者: 华为云头条. 2023年9月7日,华为云正式发布CodeArts Inspec ...

  3. Tarjan:这个算法大神

    摘要:图的算法是进行静态分析的基础数据算法,如何提高图的分析效率,就需要对图的算法有进一步的认识. 1. 引言 在静态分析技术中, 我们常用会将代码转成抽象语法树(AST), 然后采用深度遍历(DFS ...

  4. 如何用AscendCL的接口开发网络模型推理场景下应用?

    摘要:本期我们来深入讲解网络模型推理场景下,具体怎么做. 本文分享自华为云社区<[CANN文档速递09期]应用开发之推理场景>,作者: 昇腾CANN . 我们知道,使用AscendCL接口 ...

  5. 输入的查询SQL语句,是如何执行的?

    摘要:输入一条语句,返回一个结果,却不知道这条语句在 MySQL 内部的执行过程. 本文分享自华为云社区<一条查询SQL是如何执行的>,作者: 共饮一杯无 . 执行如下SQL,我们看到的只 ...

  6. 传统数据库改造难?华为云GaussDB“五心”解决

    摘要:快来看看华为云GaussDB奉上的"五心"诚意吧~ 本文分享自华为云社区<传统数据库改造难?华为云GaussDB"五心"解决>,作者: Gau ...

  7. 【鲲鹏 DevKit黑科技揭秘】│如何实现全链路系统问题90%精准诊断?

    摘要:DevKit系统诊断工具是鲲鹏性能分析工具的子工具之一,能够针对内存.网络.存储等常见故障和异常,提供精准定位和诊断能力,帮助用户识别出源代码中的问题点,提升程序的可靠性,故障定位准确率高达90 ...

  8. Spring Cloud整体架构解析

    Spring Cloud整体架构 Spring Cloud的中文名我们就暂且称呼它为"春云"吧,听上去是多么朴实无华的名字,不过呢一般名字起的低调的都是厉害角色,我们就看看Spri ...

  9. sed 流编辑器

    一.简介 非交互式的处理 一行一行的读入处理 占用系统空间少 大文件一般用sed节省内存 语法:语法 sed [选项] '行的定位 动作' 文件... 参数 说明 -e 允许进行多项编辑 -n 静默输 ...

  10. Spring 学习笔记(2)框架介绍

    本篇文章主要对 Spring 框架进行整体介绍,包括其核心功能模块与体系结构,让大家对该框架有个大体的认识. 1. 前景提要 如果你之前学过 Servlet 的话,那么一定会对 MVC 分层概念有所了 ...