用這個(gè)工具查到了內(nèi)存浪費(fèi)的地方
簡(jiǎn)單的科普一下吧
windows下的使用方法
命令行輸入tasklist找到要檢測(cè)的java進(jìn)程的pid
(linux下直接ps -ax找到進(jìn)程的pid)
如果把jdk的bin配到path里邊的話
直接輸入
jmap -histo pid > E:\output.txt
就可以把得到的內(nèi)容到E:\output.txt了,
打開后會(huì)發(fā)現(xiàn)內(nèi)容格式是類似這樣的:
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
他的輸出是按照總占用內(nèi)存排序的
num是排序
#instance是對(duì)象的實(shí)例個(gè)數(shù)
#bytes是總占用的字節(jié)數(shù)
class name對(duì)應(yīng)的就是Class文件里的class的標(biāo)識(shí)
B代表byte
C代表char
D代表double
F代表float
I代表int
J代表long
Z代表boolean
前邊有[代表數(shù)組,[I 就相當(dāng)于int[]
對(duì)象用[L+類名表示
具體可以參考JVM的規(guī)范
有幾個(gè)方法可以用
1、通過(guò)#instance和#bytes可以得到每個(gè)對(duì)象的占用內(nèi)存平均值
注意這個(gè)只是對(duì)象本身占用的內(nèi)存
比如你有個(gè)類
A{
int i;
B b;
public A(){
b = new B()
}
}
則A a = new A();
a實(shí)例占用內(nèi)存的字節(jié)數(shù)為16字節(jié)(int 4字節(jié)+B引用 4字節(jié)+對(duì)象本身8字節(jié))
不包含內(nèi)部引用b的實(shí)例的內(nèi)存占用字節(jié)數(shù)
2、可以通過(guò)對(duì)#instance或者#bytes進(jìn)行排序,觀察每個(gè)對(duì)象的數(shù)目
對(duì)程序中生成的實(shí)例過(guò)多或者內(nèi)存占用過(guò)多的對(duì)象進(jìn)行優(yōu)化或者找到內(nèi)存泄漏的地方