用這個工具查到了內存浪費的地方

簡單的科普一下吧

windows下的使用方法
命令行輸入tasklist找到要檢測的java進程的pid
(linux下直接ps -ax找到進程的pid)

如果把jdk的bin配到path里邊的話
直接輸入
jmap -histo pid > E:\output.txt

就可以把得到的內容到E:\output.txt了,

打開后會發(fā)現內容格式是類似這樣的:


num   #instances    #bytes  class name
--------------------------------------
  1:    427398    14458448  [I
  2:    178798     6830216  [C
  3:     50278     6668512  <constMethodKlass>
  4:    179924     4318176  java.lang.String
  5:     50278     4026648  <methodKlass>
  6:     15244     3894200  [B
  7:     47809     1773776  [Ljava.lang.Object;
...
...
...
Total  1645187    81806088

他的輸出是按照總占用內存排序的
num是排序

#instance是對象的實例個數

#bytes是總占用的字節(jié)數

class name對應的就是Class文件里的class的標識
B代表byte
C代表char
D代表double
F代表float
I代表int
J代表long
Z代表boolean
前邊有[代表數組,[I 就相當于int[]

對象用[L+類名表示

具體可以參考JVM的規(guī)范

有幾個方法可以用

1、通過#instance和#bytes可以得到每個對象的占用內存平均值

注意這個只是對象本身占用的內存
比如你有個類
A{
        int i;
        B b;
        public A(){
                b = new B()
        }
}
則A a = new A();
a實例占用內存的字節(jié)數為16字節(jié)(int 4字節(jié)+B引用 4字節(jié)+對象本身8字節(jié))
不包含內部引用b的實例的內存占用字節(jié)數

2、可以通過對#instance或者#bytes進行排序,觀察每個對象的數目
對程序中生成的實例過多或者內存占用過多的對象進行優(yōu)化或者找到內存泄漏的地方