獲取hprof命令
jmap -dump:format=b,file=/path/file.hprof pid
idea插件篇之java內存分析工具(JProfiler)
Eclipse下的mat差距進行分析 http://www.eclipse.org/mat
jhat C:\Users\xingminghui\file.hprof -J -Xmx512m http://localhost:7000/ http://localhost:7000/showInstanceCounts/includePlatform/
jmap -dump:format=b,file=mem.dat 7528 #將內存使用的詳細情況輸出到mem.dat 文件
通過 jhat -port 7000 C:\Users\xingminghui\mem.dat 可以將mem.dat的內容以web的方式暴露到網絡,訪問http://ip-server:7000查看。
window獲取進程命令
netstat -ano | findstr 8081
Eclipse Memory Analyzer,查看對象樹和對象空間占用非常的方便
tomcat 查看內存占用量 https://blog.csdn.net/jkler_doyourself/article/details/6033500
https://www.cnblogs.com/KingIceMou/p/6967754.html 內存監控
使用sudo -u admin -H jmap -dump:format=b,file=文件名.hprof pid 來dump內存,生成dump文件
jvisualvm 工具里面有 Heap Dump的功能
jmap -dump:format=b,file=file.hprof 7528
C:\Users\xingminghui\file.hprof

http://localhost:7000/showInstanceCounts/includePlatform/

java內存分區
****方法區
主要用來存儲已被虛擬機加載的類的信息、常量、靜態變量和即時編譯器編譯后的代碼等數據。
****堆
java堆是所有線程所共享的一塊內存,在虛擬機啟動時創建,幾乎所有的對象實例都在這里創建,因此該區域經常發生垃圾回收操作。
****虛擬機棧
1. 虛擬機棧也就是我們平常所稱的棧內存,它為java方法服務,每個方法在執行的時候都會創建一個棧幀,用於存儲局部變量表、操作數棧、動態鏈接和方法出口等信息。
2. 虛擬機棧是線程私有的,它的生命周期與線程相同。
finalize() 對象釋放會調用該方法
HashMap存進去的是t1跟t2指向的地址,t1=null,t2=null的時候,本來按照常理來說,Java回收機制會對那些沒有引用的堆內存對象進行回收,但不幸的是,HashMap依舊會強引用着t1跟t2的堆內存對象,導致GC無法對其進行回收
public class TestMy {
public static void main(String[] args) {
TestE t2 = new TestE();
TestE t3 = null;
System.out.println(t2+","+t3);
System.gc();
System.out.println(t2+","+t3);
t2=null;
System.gc();
//System.out.println(t2+","+t3);
}
@org.junit.Test
private void test1(){
HashMap map = new HashMap();
TestE t1 = new TestE();
TestE t2 = new TestE();
map.put("1", t1);
map.put("2", t2);
t1 = null;
System.gc();
System.out.println("第1步" + map);
t2 = null;
System.gc();
System.out.println("第2步" + map);
map.clear();
System.gc();
System.out.println("第3步" + map);
}
}
public class TestE {
private String strTest = "該Test對象還存在";
@Override
public String toString() {
return strTest;
}
@Override
protected void finalize() throws Throwable {
// TODO Auto-generated method stub
System.out.println("該Test對象被釋放了");
}
}
