一、jmap找出占用内存较大的实例
先给个示例代码:
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
/**
* Created by 菩提树下的杨过 on 05/09/2017.
*/
public class OOMTest {
public static void main(String[] args) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(1);
int max = 10000;
List list = new ArrayList<>(max);
for (int j = 0; j < max; j++) {
Person p = new Person();
p.setAge(100);
p.setName("菩提树下的杨过");
list.add(p);
}
System.out.println("ready!");
latch.await();
}
public static class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
}
List中放了1w个Person对象的实例,先把这段程序跑起来
javac OOMTest.java
java OOMTest
然后再开一个窗口,jps -l 找出该程序的pid
然后执行 jmap -histo:live 7320 (注:如果输出内容太多,只想看排名前10的,可以加 | head -10)
输出结果,会按内存使用量,从大到小依次把对象的实际个数,占用内存数量(字节数)打印出来,最后还会输出汇总信息
以上面的示例来说,OOMTest$Person这个类的实例数为10000个,总共占用240000字节(注:即每个实例24字节),这个程序总占用内存数为725464字节,约:0.69M。
另外还有一些[C,[B这类class name,大概意思为:
[C is a char[]
[S is a short[]
[I is a int[]
[B is a byte[]
[[I is a int[][]
[C对象往往跟String有关,String其内部使用final char[]数组来保存数据的
constMethodKlass/ methodKlass/ constantPoolKlass/ constantPoolCacheKlass/ instanceKlassKlass/ methodDataKlass
与Classloader相关,常驻与Perm区。
二、