java:线上问题排查常用手段

一、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<Person> 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

java:线上问题排查常用手段

然后执行 jmap -histo:live 7320 (注:如果输出内容太多,只想看排名前10的,可以加 | head -10)

java:线上问题排查常用手段

输出结果,会按内存使用量,从大到小依次把对象的实际个数,占用内存数量(字节数)打印出来,最后还会输出汇总信息

java:线上问题排查常用手段

以上面的示例来说,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区。

 

二、

上一篇:数据库概论——SQL练习一(SPJ零件问题)


下一篇:数据库作业3:第二章课后题