Java调试工具
1. jps --查看当前进程ID
2. jstack --当前虚拟机每一条线程执行的方法堆栈的快照
3. jconsole --使用GUI界面对线程进行监控
4. top -H -p pid --查看CPU的使用情况(Linux)
5. jinfo --输出并修改进程的opts
可以修改运行时额java进程的运行参数
jinfo [-jvm opt] pid 查看信息
查看指定的参数
$ jinfo -flag MaxHeapSize 12772
-XX:MaxHeapSize=734003200
打印所有的信息
$ jinfo 12772
打印JVM参数
jinfo -flags 12772
6. jstat --用于查看JVM的内存使用以及GC情况
jstat -class pid 查看class数量和占用资源情况
$ jstat -class 12772
Loaded Bytes Unloaded Bytes Time
3931 7349.4 9 10.5 1.01
jstat -compiler pid 查看实时编译的数量
jstat -gc pid 查看gc的情况
$ jstat -gc 12772
..... YGC YGCT FGC FGCT GCT
..... 2 0.028 1 0.023 0.051
YGC: Young GC 发生2次
YGCT: 消耗时间0.028s
FGC:Full GC 1次
FGCT:Full GC耗费的时间0.023s,可以发现Full GC明显是Major GC耗费的时间多
GCT:GC消耗的总时间
jstat -gccapacity 显示vm内存三代对象的使用情况和占用大小
jstat -gcnew pid 新生代GC的情况
jstat -gcnewcapacity pid 新生代的内存使用情况
jstat -gcold pid 老年代的GC情况
jstat -gcoldcapacity pid 老年代的内存使用情况
jstat -gcpermcapatity pid 永久代的GC情况
jstat -gcutil pid 统计gc信息
jstat -printcompilation pid vm执行的信息
7. jmap --java内存映射信息
jmap -heap pid 可以查看堆内存的情况
jmap -histo 18936 --查看对象实例个数 占用资源情况 类名
$ jmap -heap 12772
Attaching to process ID 12772, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.171-b11
using thread-local object allocation.
Parallel GC with 8 thread(s)
Heap Configuration: --Heap的配置情况
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 734003200 (700.0MB)
NewSize = 89128960 (85.0MB)
MaxNewSize = 244318208 (233.0MB)
OldSize = 179306496 (171.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage: --Heap的使用情况
PS Young Generation
Eden Space:
capacity = 67108864 (64.0MB)
used = 11190136 (10.671745300292969MB)
free = 55918728 (53.32825469970703MB)
16.674602031707764% used
From Space:
capacity = 11010048 (10.5MB)
used = 0 (0.0MB)
free = 11010048 (10.5MB)
0.0% used
To Space:
capacity = 11010048 (10.5MB)
used = 0 (0.0MB)
free = 11010048 (10.5MB)
0.0% used
PS Old Generation
capacity = 109576192 (104.5MB)
used = 21402720 (20.411224365234375MB)
free = 88173472 (84.08877563476562MB)
19.532272119841508% used
7289 interned Strings occupying 626360 bytes
JVM调优
1. 为什么要对JVM调优
1)出现OOM,并且在代码层次无法再优化
2)需要更高的响应速度
2. JVM调优很大层次上是空间换时间
3. 对响应速度主要的影响是垃圾回收带来的停顿时间,也就是YGC和FGC的消耗时间
1)OOM的处理
通过jmap -heap pid或者jstat -gccapacity查看heap的内存情况
确定是哪块区域内存爆满,并进行调整内存
2)YGC和FGC太频繁,并且YGCT、FGCT的时间太长
发生GC的主要原因是内存不足,这个可以调整内存
如果需要更短的停顿时间,可以使用CMS或者G1垃圾收集器,使用jinfo查看JVM的参数
jinfo -flags pid
适当调整参数以达到优化的目的
4. 查看所有能被动态修改的参数
windows: java -XX:+PrintFlagsInitial | findstr manageable
Linux: java -XX:+PrintFlagsInitial | grep manageable
代码调优
1) 类如果不需要被其他类继承,指定为final
javac会内联所有的final方法,从而提高性能
2) 尽量重用对象,减少不必要的创建对象资源浪费
3) 尽量使用局部变量(栈中,速度快)
4) 不要重复初始化变量
5) 保证过期对象及时回收(设为null)
6) 减少变量重复计算,例如一个表达式,在if()中计算使用了多次,这个时候把表达式的结果提前计算,后面使用就行
7) 在需要的时候才创建对象和变量,延迟加载
8) 不在循环中使用try{}catch{}