jstat
jstac 主要用来查看GC情况
用法 jstat - [-t] [-h] [ []]
jstat -gcutil 21946 2000 5
21946 进程ID
2000 每2S采集一次
5 采集5次
Example
Summary of garbage collection statistics.
S0: s0使用率.
S1: s1使用率
E: Eden 使用率
O: 老年代使用率
M: Metaspace 使用率
CCS: 类指针压缩空间大小 使用率
YGC: 年轻代GC次数
YGCT: 年轻代GC总时间
FGC: full gc 次数
FGCT: full gc总时间
GCT: 总的GC时间
jmap
jmap主要用来分析内存中对象情况
- jmap -heap 21946 查看堆中内存使用情况,这里和jstat 不同的是这里能看到具体占用的值
-
jmap -dump:live,format=b,file=21946.bin 21946 打印堆信息到文件 ,可以用jvisualvm 分析
-
jmap -histo:live 21946 | more 分析class实例情况
- 实战内存泄漏
测试代码
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.Vector;
public class testleak {
public static void main(String[] args) {
ExecutorService service = Executors.newFixedThreadPool(20);
for (int i = 0; i < 20; i++) {
service.submit(new Runnable() {
@Override
public void run() {
Vector v = new Vector(10);
while (true) {
Object o = new Object();
// 对象O依然被 v引用
v.add(o);
o = null;
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
}
}
}
MAT工具分析
先看Historgram ,
Object 对象最多
再看支配树 dominator_tree
thread-3这个对象,引用了vector这个变量,又引用了object和代码中相同
还可以看内存泄露报告