查看当前进程的堆使用情况:
# jmap -histo:live 14416 | less
num #instances #bytes class name----------------------------------------------
1: 260861 29216432 java.net.SocksSocketImpl
2: 268685 28249496 [B
3: 1332147 21314352 java.lang.Object
4: 278044 16152952 [Ljava.lang.Object;
5: 260854 12520992 java.net.SocketInputStream
6: 260854 12520992 java.net.SocketOutputStream
7: 123610 11274280 [C
8: 262744 10509760 java.lang.ref.Finalizer
9: 260899 8348768 java.io.FileDescriptor
10: 260855 8347360 java.net.Socket
11: 270081 6481944 java.util.ArrayList
12: 121312 3881984 java.util.HashMap$Node
13: 122592 2942208 java.lang.String
......
# jmap -histo:live 31312 | grep Socket
1000ms统计一次gc情况,一共统计100次。下面两条命令,前者统计的是k字节,后者统计的是百分比:
# jstat -gc 14416 1000 5
# jstat -gcutil 14416 1000 5
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT75.51 0.00 63.93 6.01 97.30 96.50 258 108.940 7 2.067 111.007
75.51 0.00 71.94 6.01 97.30 96.50 258 108.940 7 2.067 111.007
75.51 0.00 81.93 6.01 97.30 96.50 258 108.940 7 2.067 111.007
75.51 0.00 89.92 6.01 97.30 96.50 258 108.940 7 2.067 111.007
75.51 0.00 97.91 6.01 97.30 96.50 258 108.940 7 2.067 111.007
查看三代使用情况:
# jstat -gccapacity 14416
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC1638400.0 1638400.0 1638400.0 382464.0 381440.0 874496.0 3276800.0 3276800.0 3276800.0 3276800.0 0.0 1112064.0 70104.0 0.0 1048576.0 8448.0 270 7
查看堆的使用状况信息:
# jmap -heap 14416
Attaching to process ID 14416, please wait...Debugger attached successfully.
Server compiler detected.
JVM version is 25.77-b03
using thread-local object allocation.
Parallel GC with 8 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 5033164800 (4800.0MB)
NewSize = 1677721600 (1600.0MB)
MaxNewSize = 1677721600 (1600.0MB)
OldSize = 3355443200 (3200.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 937426944 (894.0MB)
used = 75179160 (71.6964340209961MB)
free = 862247784 (822.3035659790039MB)
8.019735349104709% used
From Space:
capacity = 370147328 (353.0MB)
used = 368914224 (351.8240203857422MB)
free = 1233104 (1.1759796142578125MB)
99.66686129907711% used
To Space:
capacity = 370147328 (353.0MB)
used = 0 (0.0MB)
free = 370147328 (353.0MB)
0.0% used
PS Old Generation
capacity = 3355443200 (3200.0MB)
used = 2391475280 (2280.6885528564453MB)
free = 963967920 (919.3114471435547MB)
71.27151727676392% used
33058 interned Strings occupying 3315272 bytes.
Linux系统的最大文件句柄数(Linux下一切皆文件),系统默认1024个,ulimit -n 可查看用户级的。当存在句柄泄露没有释放时,系统会报错:Too many open files。
当前shell的用户级限制
# ulimit -n [cnt]
查看/设置当前shell的当前用户所有进程最大能打开的最大文件数。
设置所有shell的用户级限制
/etc/security/limits.conf
root soft nofile 4096
root hard nofile 4096
修改文件,可设置所有shell的当前用户所有进程最大能打开的最大文件数,比如一个用户登录多个shell,该用户的所有shell打开的最大数限制受此限制。
设置系统级限制
查看整个系统的最大文件句柄数限制(非用户级别的):
# cat /etc/sysctl.conf
fs.file-max=2000000 #限制整个系统最大文件句柄数
如果要修改以后,需要执行下面命令,使配置生效:
# sysctl -p
查看Linux系统打开的文件句柄数:
# lsof -n | awk '{print $2}'| sort | uniq -c | sort -nr
3009 3131215 7364
14 8002
14 7777
14 7382
14 665
14 6308
...
第一列:进程打开的文件句柄数
第二列:PID
如果没有该命令,可以用yum安装:yum install -y lsof