tar -zxvf apache-tomcat-8.5.87.tar.gz
或者
tar -xvf apache-tomcat-8.5.87.tar.gz
tar -cf apache-tomcat-8.5.87.tar.gz apache-tomcat-8.5.87
du -h
free -h
第一行Mem: 系统物理内存的使用情况 第二行Swap: swap交换内存的使用情况 total: 系统中内存的总量, used:
已用内存总量(used = total-free-buffers-cache) free: 空闲内存容量(真正尚未被使用的物理内存数)
shared: 共享内存使用的容量 buff/cache:
buffers和cache所用总量的总和(buffers为内核缓冲区所用的内存,cache为页缓存和slabs所用的内存容量)
available:为估算值,是在不需要swapping内存的情况下,可用物理内存容量。它是从应用程序的角度看到的可用内存数量。
内核为了提升磁盘操作的性能,会消耗一部分内存去缓存磁盘数据(就是buffer和cache),所以对于内核来说buffer和cache都属于已经被使用的内存。
当应用程序需要内存时,如没有足够的 free 内存可用,内核就会从 buffer 和 cache
中回收内存来满足应用程序的请求。所以从应用程序的角度来说,available = free + buffer + cache。 注:
这只是一个很理想的计算方式,实际中的数据往往有较大的误差。
cached” 表示 Linux 系统缓存的文件和目录占用的内存大小。Linux 系统默认会将空闲的内存用作缓存,以提高系统性能。因此,在很多情况下, “cached” 占用高并不是问题,因为这些缓存会在需要时自动释放。
如果你需要手动释放缓存,可以运行以下命令:
sync
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
注意:在执行这三条命令之前一定要先执行sync命令(描述:sync 命令运行 sync 子例程。如果必须停止系统,则运行sync 命令以确保文件系统的完整性。sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-Node、已延迟的块 I/O 和读写映射文件)
检查应用程序的日志文件,看是否有任何报错信息。
检查应用程序是否使用了适当的 JVM 参数。例如,可以使用 -Xmx 和 -Xms 参数来设置最大堆大小和最小堆大小。
使用 jstat 命令来监测 JVM 的内存使用情况。
使用 jstack 命令来生成线程堆栈跟踪信息,可以看到线程之间的调用关系。
使用 jmap 命令生成内存快照,可以看到对象的分配情况。
使用 jconsole 命令来连接到 JVM,可以查看 JVM 的运行情况。
使用 gcviewer 工具来分析 JVM 的 GC 日志。
使用第三方工具,例如 VisualVM 或 jProfiler,来进行更加全面的性能分析。
jps -lv 可以查看部署的java项目的pid,项目名称,JVM参数
Jstat是JDK自带的一个轻量级小工具。全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。
jstat 用法
option: 参数选项
-t: 可以在打印的列加上Timestamp列,用于显示系统运行的时间
-h: 可以在周期性数据数据的时候,可以在指定输出多少行以后输出一次表头
vmid: Virtual Machine ID( 进程的 pid)
interval: 执行每次的间隔时间,单位为毫秒
count: 用于指定输出多少次记录,缺省则会一直打印
option 可以从下面参数中选择
-class 显示ClassLoad的相关信息;
-compiler 显示JIT编译的相关信息;
-gc 显示和gc相关的堆信息;
-gccapacity 显示各个代的容量以及使用情况;
-gcmetacapacity 显示metaspace的大小
-gcnew 显示新生代信息;
-gcnewcapacity 显示新生代大小和使用情况;
-gcold 显示老年代和永久代的信息;
-gcoldcapacity 显示老年代的大小;
-gcutil 显示垃圾收集信息;
-gccause 显示垃圾回收的相关信息(通-gcutil),同时显示最后一次或当前正在发生的垃圾回收的诱因;
-printcompilation 输出JIT编译的方法信息;
示例一:-class
显示加载class的数量,及所占空间等信息。
jstat -class
Loaded : 已经装载的类的数量
Bytes : 装载类所占用的字节数
Unloaded:已经卸载类的数量
Bytes:卸载类的字节数
Time:装载和卸载类所花费的时间
示例二: -compiler
显示VM实时编译(JIT)的数量等信息。
jstat -compiler
Compiled:编译任务执行数量
Failed:编译任务执行失败数量
Invalid :编译任务执行失效数量
Time :编译任务消耗时间
FailedType:最后一个编译失败任务的类型
FailedMethod:最后一个编译失败任务所在的类及方法
示例三: -gc
显示gc相关的堆信息,查看gc的次数,及时间。
jstat –gc
S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
S0U :年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U :年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
EC :年轻代中Eden(伊甸园)的容量 (字节)
EU :年轻代中Eden(伊甸园)目前已使用空间 (字节)
OC :Old代的容量 (字节)
OU :Old代目前已使用空间 (字节)
MC:metaspace(元空间)的容量 (字节)
MU:metaspace(元空间)目前已使用空间 (字节)
YGC :从应用程序启动到采样时年轻代中gc次数
YGCT :从应用程序启动到采样时年轻代中gc所用时间(s)
FGC :从应用程序启动到采样时old代(全gc)gc次数
FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
示例四: -gccapacity
可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小
jstat -gccapacity
NGCMN :年轻代(young)中初始化(最小)的大小(字节)
NGCMX :年轻代(young)的最大容量 (字节)
NGC :年轻代(young)中当前的容量 (字节)
S0C :年轻代中第一个survivor(幸存区)的容量 (字节)
S1C : 年轻代中第二个survivor(幸存区)的容量 (字节)
EC :年轻代中Eden(伊甸园)的容量 (字节)
OGCMN :old代中初始化(最小)的大小 (字节)
OGCMX :old代的最大容量(字节)
OGC:old代当前新生成的容量 (字节)
OC :Old代的容量 (字节)
MCMN:metaspace(元空间)中初始化(最小)的大小 (字节)
MCMX :metaspace(元空间)的最大容量 (字节)
MC :metaspace(元空间)当前新生成的容量 (字节)
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
YGC :从应用程序启动到采样时年轻代中gc次数
FGC:从应用程序启动到采样时old代(全gc)gc次数
示例五:-gcmetacapacity
metaspace 中对象的信息及其占用量。
jstat -gcmetacapacity
MCMN:最小元数据容量
MCMX:最大元数据容量
MC:当前元数据空间大小
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
YGC :从应用程序启动到采样时年轻代中gc次数
FGC :从应用程序启动到采样时old代(全gc)gc次数
FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
示例六: -gcnew
年轻代对象的信息。
jstat -gcnew
S0C :年轻代中第一个survivor(幸存区)的容量 (字节)
S1C :年轻代中第二个survivor(幸存区)的容量 (字节)
S0U :年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U :年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
TT:持有次数限制
MTT:最大持有次数限制
DSS:期望的幸存区大小
EC:年轻代中Eden(伊甸园)的容量 (字节)
EU :年轻代中Eden(伊甸园)目前已使用空间 (字节)
YGC :从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
示例七: -gcnewcapacity
年轻代对象的信息及其占用量
jstat -gcnewcapacity
NGCMN :年轻代(young)中初始化(最小)的大小(字节)
NGCMX :年轻代(young)的最大容量 (字节)
NGC :年轻代(young)中当前的容量 (字节)
S0CMX :年轻代中第一个survivor(幸存区)的最大容量 (字节)
S0C :年轻代中第一个survivor(幸存区)的容量 (字节)
S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节)
S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
ECMX:年轻代中Eden(伊甸园)的最大容量 (字节)
EC:年轻代中Eden(伊甸园)的容量 (字节)
YGC:从应用程序启动到采样时年轻代中gc次数
FGC:从应用程序启动到采样时old代(全gc)gc次数
示例八: -gcold
old代对象的信息
jstat -gcold
MC :metaspace(元空间)的容量 (字节)
MU:metaspace(元空间)目前已使用空间 (字节)
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
OC:Old代的容量 (字节)
OU:Old代目前已使用空间 (字节)
YGC:从应用程序启动到采样时年轻代中gc次数
FGC:从应用程序启动到采样时old代(全gc)gc次数
FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
示例九:-gcoldcapacity
old代对象的信息及其占用量
jstat -gcoldcapacity
OGCMN :old代中初始化(最小)的大小 (字节)
OGCMX :old代的最大容量(字节)
OGC :old代当前新生成的容量 (字节)
OC :Old代的容量 (字节)
YGC :从应用程序启动到采样时年轻代中gc次数
FGC :从应用程序启动到采样时old代(全gc)gc次数
FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
示例十: - gcutil
统计gc信息
jstat -gcutil
S0 :年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1 :年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E :年轻代中Eden(伊甸园)已使用的占当前容量百分比
O :old代已使用的占当前容量百分比
P :perm代已使用的占当前容量百分比
YGC :从应用程序启动到采样时年轻代中gc次数
YGCT :从应用程序启动到采样时年轻代中gc所用时间(s)
FGC :从应用程序启动到采样时old代(全gc)gc次数
FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
示例十一:-gccause
显示垃圾回收的相关信息(通-gcutil),同时显示最后一次或当前正在发生的垃圾回收的诱因。
jstat -gccause
LGCC:最后一次GC原因
GCC:当前GC原因(No GC 为当前没有执行GC)
示例十二: -printcompilation
当前VM执行的信息。
jstat -printcompilation
Compiled :编译任务的数目
Size :方法生成的字节码的大小
Type:编译类型
Method:类名和方法名用来标识编译的方法。类名使用/做为一个命名空间分隔符。方法名是给定类中的方法。上述格式是由-XX:+PrintComplation选项进行设置的
概述
jstack是JVM自带的Java堆栈跟踪工具,它用于打印出给定的java进程ID、core file、远程调试服务的Java堆栈信息.
使用
jstack命令用于生成虚拟机当前时刻的线程快照。
线程快照是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因, 如线程间死锁、死循环、请求外部资源导致的长时间等待等问题。
线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。
如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。
另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现bug的状态,jstack是非常有用的。
命令
// 打印某个进程的堆栈信息
jstack [option] <pid>
选项 作用
-F 当正常输出的请求不被响应时,强制输出线程堆栈
-m 如果调用到本地方法的话,可以显示C/C++的堆栈
-l 除堆栈外,显示关于锁的附加信息,在发生死锁时可以用jstack -l pid来观察锁持有情况
使用命令可以把快照输出到指定的文件
jstack -l 19219 > temp.txt
分析
Dump 文件分析关注重点
runnable,线程处于执行中
deadlock,死锁(重点关注)
blocked,线程被阻塞 (重点关注)
Parked,停止
locked,对象加锁
waiting,线程正在等待
waiting to lock 等待上锁
Object.wait(),对象等待中
waiting for monitor entry 等待获取监视器(重点关注)
Waiting on condition,等待资源(重点关注)
一、概念
jmap -heap 是一个Java 命令行工具,用于获取Java 进程的堆内存信息。它会输出 Java 进程的整体堆内存使用情况,包括 heap 总大小、已使用大小、空闲大小等。同时还会输出堆内存中各种对象所占用的空间大小以及数量,如类、字符数组、字符串等。
二、作用
jmap -heap 命令通常用于诊断和调试 Java 应用程序的内存问题,例如内存泄漏、内存溢出等。
通过 jmap -heap 命令获取到的堆内存信息可以帮助开发人员更加全面地了解 Java 应用程序的内存使用情况,找出内存问题的根本原因,并进行相应的优化和改进。
在使用 jmap -heap 命令时,需要注意以下几点:
jmap -heap 命令会暂停 Java 进程的执行并进行内存快照,可能会对应用程序的性能产生一定的影响。
jmap -heap 命令只能用于 HotSpot 虚拟机,不适用于其他虚拟机实现。
jmap -heap 命令可能会产生较大的输出,建议将输出重定向到文件中以便后续分析。
三、参数
jmap -heap 命令是一个 Java 命令行工具,用于获取 Java 进程的堆内存信息。它包含以下参数:
-dump:导出 Java 堆内存中的内容到文件中。
-file:指定导出文件的文件名,如果不指定则默认为 java_pid[进程 ID].hprof。
-F:强制执行指令,即使 JVM 正在退出或者已经退出。
-histo:打印 Java 堆内存中各个对象类型的实例数目和大小。
-J:传递参数给 JVM,例如“-J-Xms512m”。
jmap -heap 24126
查看 24126 进程的堆内存使用情况
jmap -heap 24126
表示 jmap 正在尝试连接并附加到一个进程ID为 24126 的Java进程
Attaching to process ID 24126, please wait…
表示 jmap 已经成功附加到了该进程并成功连接了调试器
Debugger attached successfully.
表示该 Java 进程正在运行 Server 模式的编译器
Server compiler detected.
表示该 Java 程序的版本号为 25.121-b13
JVM version is 25.121-b13
表示 Java 进程正在使用线程本地对象分配的方式
using thread-local object allocation.
表示 Java 进程正在使用 4 个线程来进行并行垃圾回收
Parallel GC with 4 thread(s)
堆内存配置信息
Heap Configuration:
MinHeapFreeRatio = 0 # 表示在堆内存达到最大值之前,堆内存中不允许有任何自由空间
MaxHeapFreeRatio = 100 # 表示在堆内存达到最大值之后,堆内存中允许全部是自由空间
MaxHeapSize = 5368709120 (5120.0MB) # 表示堆内存的最大容量为 5GB
NewSize = 2684354560 (2560.0MB) # 表示新生代(Young Generation)的初始容量为 2.5GB
MaxNewSize = 2684354560 (2560.0MB) # 表示新生代的最大容量为 2.5GB
OldSize = 2684354560 (2560.0MB) # 表示老年代(Old Generation)的初始容量为 2.5GB
NewRatio = 1 # 表示新生代与老年代内存大小的比例为 1:1
SurvivorRatio = 8 # 表示 Eden 区域与 Survivor 区域之间内存大小的比例为 8:1
MetaspaceSize = 21807104 (20.796875MB) # 表示元数据区域的大小为 20.8MB
CompressedClassSpaceSize = 1073741824 (1024.0MB) # 表示压缩类空间的大小为 1GB
MaxMetaspaceSize = 17592186044415 MB # 表示元数据区域的最大容量为 16 EB(exabytes)
G1HeapRegionSize = 0 (0.0MB) # 表示 G1 垃圾回收器使用的内存段的大小为 0
堆内存的使用情况
Heap Usage:
PS Young Generation # 表示使用了 Parallel Scavenge(PS)年轻代内存的信息
Eden Space: # 表示 Eden 区域的使用情况
capacity = 1009254400 (962.5MB) # 表示 Eden 区域的最大容量为 962.5MB
used = 474955488 (452.9528503417969MB) # 表示 Eden 区域已使用的内存大小为 452.95MB
free = 534298912 (509.5471496582031MB) # 表示 Eden 区域尚未使用的内存大小为 509.55MB
47.06003639914773% used
From Space: # 表示 Survivor 0 区域的使用情况
capacity = 834142208 (795.5MB) # 表示 Survivor 0 区域的最大容量为 795.5MB
used = 326834600 (311.69376373291016MB) # 表示 Survivor 0 区域已使用的内存大小为 311.69MB
free = 507307608 (483.80623626708984MB) # 表示 Survivor 0 区域尚未使用的内存大小为 483.81MB
39.182119891000646% used
To Space: # 表示 Survivor 1 区域的使用情况
capacity = 793247744 (756.5MB) # 表示 Survivor 1 区域的最大容量为 756.5MB
used = 0 (0.0MB) # 表示 Survivor 1 区域尚未使用任何内存
free = 793247744 (756.5MB) # 表示 Survivor 1 区域尚未使用的内存大小为 756.5MB
0.0% used
PS Old Generation # 表示使用了 Parallel Scavenge(PS)老年代内存的信息
capacity = 2684354560 (2560.0MB) # 表示老年代的最大容量为 2.5GB
used = 1371482032 (1307.9471893310547MB) # 表示老年代已使用的内存大小为 1307.95MB
free = 1312872528 (1252.0528106689453MB) # 表示老年代尚未使用的内存大小为 1252.05MB
51.091687083244324% used # 表示老年代已使用内存占总内存的比例为 51.09%
53559 interned Strings occupying 6180024 bytes.
执行jmap -heap如果出现这种情况
可以使用命令:
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
再次执行就可以了
这是因为新版的Linux系统加入了 ptrace-scope 机制. 这种机制为了防止用户访问当前正在运行的进程的内存和状态, 而一些调试软件本身就是利用 ptrace 来进行获取某进程的内存状态的(包括GDB),所以在新版本的Linux系统, 默认情况下不允许再访问了. 可以临时开启. 如:
echo 0 > /proc/sys/kernel/yama/ptrace_scope
永久写到文件来持久化:
emacs /etc/sysctl.d/10-ptrace.conf
添加或修改为以下这一句:(0:允许, 1:不允许)
kernel.yama.ptrace_scope = 0