Java内存泄露和内存溢出、JVM命令行工具、.JDK可视化工具、Java Class文件
1.Java內存泄露和內存溢出對比
1.1 Java?內存泄露
內存泄露是指一個不再被程序使用的對象或變量還在內存中占用空間。
1.1.1判斷內存空間是否符合垃圾回收的標準
在Java語言中,判斷一個內存空間是否符合垃圾回收的標準有兩個:
1.1.2內存泄漏的情況
一般來說,內存泄露主要有兩種情況:
垃圾回收機制的引入可以有效地解決第一種情況,但是對第二種情況卻沒有辦法解決,因此Java語言中內存泄露主要指的是第二種情況。
1.1.3造成內存泄露的對象的特點
在Java中,內存泄漏就是存在一些被分配的對象,這些對象有下面兩個特點,
如果對象滿足這兩個條件,這些對象就可以判定為Java中的內存泄漏,這些對象不會被GC所回收,然而它卻占用內存。
1.1.4 引起內存泄露的原因
在Java語言中,容易引起內存泄露的原因有很多,主要可以分為以下幾種。
1.2內存溢出
內存溢出是指程序要求的內存,超出了系統所能分配的范圍,從而發生溢出。
2.JVM命令行工具
2.1 jps
虛擬機進程狀況工具;
只運行jps輸出的是當前運行的java進程(Java程序的進程ID,main函數);
運行jps –q只輸出進程ID,而不輸出類的名稱;
jps –m輸出傳遞給Java進程(主函數)的短名稱;
jps –l輸出主函數的完整路徑;
jps –v輸出傳遞給JVM的參數。
2.2 jstat
虛擬機統計信息監視工具;可以用于觀察Java應用程序運行時信息的工具。
jstat可以實時顯示本地或遠程JVM進程中類裝載、內存、垃圾收集、JIT編譯等數據(如果要顯示遠程JVM信息,需要遠程主機開啟RMI支持)。
如果在服務啟動時沒有指定啟動參數-verbose:gc,則可以用jstat實時查看gc情況。
在沒有GUI圖形界面,只提供了純文本控制臺環境的服務器上,jstat是運行期定位虛擬性能問題的首選工具。
如jstat –gc 2764 250 20表示查詢進程2764垃圾收集狀況,每250ms查詢一次,一共查詢20次。后面兩個參數省略時表示只查詢一次。
命令格式為jstat option vmid interval count.
其中option主要分為3類:類裝載、垃圾收集、運行期編譯。
| -class | 監視類裝載、卸載數量、總空間以及類裝載耗費的時間。 |
| -gc | 監視java堆狀況,包括Eden區、兩個survivor區、老年代、永久代等的容量、已用空間、GC時間合計等信息。 |
| -gccapacity | 監視內容與-gc相同,但輸出主要關注Java堆各個區域使用到的最大、最小空間 |
| -gcutil | 監視內容與-gc相同,但輸出主要關注已經使用的空間占總空間的百分比 |
| -gnew | 監視新生代GC狀態 |
| -gold | 監視老年代GC狀態 |
| -gcompiler | 輸出JIT編譯器編譯過的方法、耗時等信息。 |
2.3 jinfo
Java配置信息工具;用于查詢當前運行時的JVM屬性和參數的值。
jinfo可以使用如下選項:
- ?? -flag:顯示未被顯示指定的參數的系統默認值
- ?? -flag [+|-]name或-flag name=value: 修改部分參數
- ?? -sysprops:打印虛擬機進程的System.getProperties()
?命令格式:jinfo [option] pid
2.4 jmap
java內存映像工具;
用于顯示當前Java堆和永久代的詳細信息(如當前使用的收集器,當前的空間使用率等).
- jmap –heap:顯示java堆的相信信息,如使用哪種收集器、參數配置、分代狀態等。
- jmap-dump:生成java堆轉儲快照。
2.5jhat
虛擬機堆轉儲快照分析工具;
用于分析使用jmap生成的dump文件,是JDK自帶的工具,使用方法為: jhat -J -Xmx512m [file]
2.6 jstack
Java堆棧跟蹤工具;
?用于生成當前JVM的所有線程快照,線程快照是虛擬機每一條線程正在執行的方法,目的是定位線程出現長時間停頓的原因,如線程間死鎖、死循環、請求外部資源導致的長時間等待等都是導致線程長時間停頓的原因。線程出現停頓的時候通過jstack來查看各個線程的調用堆棧,就可以知道沒有響應的線程到底在后臺做些什么事情或者是在等待什么資源。
- ?-F:當正常輸出的請求不被響應時,強制輸出線程堆棧
- ?-l:除堆棧外,顯示關于鎖的附加信息
- ?-m:如果調用到本地方法的話,可以顯示C/C++的堆棧
命令格式:jstack [option] vmid
例如jstack –l 3500會顯示3500編號的進程的帶有鎖信息的堆棧信息。
2.7HSDIS
JIT生成代碼反匯編。
2.8?現在JVM中有一個線程掛起了,如何用工具查出原因?
線程出現停頓的時候通過jstack來查看各個線程的調用堆棧,就可以知道沒有響應的線程到底在后臺做些什么事情或者是在等待什么資源。用于生成當前JVM的所有線程快照,線程快照是虛擬機內每一條線程正在執行的方法堆棧集合,目的是定位線程出現長時間停頓的原因,如線程間死鎖、死循環、請求外部資源導致的長時間等待等都是導致線程長時間停頓的原因。
3.JDK可視化工具
3.1JConsole工具
是JDK自帶的圖形化性能監控工具。通過JConsole工具,可以查看Java應用程序的運行概況,監控堆信息、永久區使用情況、類加載情況。
在JConsole中可以查看堆的詳細信息,包括堆的大小、使用率、eden區大小、survivor區大小、永久區大小。
JConsole可以方便地查看系統內的線程信息,并且可以快速定位死鎖問題。
JConsole的類頁面可以顯示系統已經裝載的類數量。
JConsole的VM摘要顯示了當前Java應用程序的基本信息,如虛擬機類型、虛擬機版本、系統線程信息、操作系統內存信息、堆信息、垃圾回收器信息以及路徑信息等。
3.2VisualVM
3.3?用什么工具調試程序?
JConsole工具
4.Java Class文件
4.1格式
Class文件是一組以8位字節為基礎單位的二進制流。
各個數據項目嚴格按照順序緊湊地排列在Class文件中,中間沒有添加任何分隔符,這使得整個Class文件中存儲的內容幾乎全部是程序運行的必要數據,沒有空隙存。
當遇到需要占用8位字節以上空間的數據項時,則會按照高位在前的方式分割成若干個8位字節進行存儲。
4.2內容
每個Class文件的頭4個字節稱為魔數,它的唯一作用就是確定這個文件是否為一個能被虛擬機接收的Class文件。
緊著著魔數之后的4個字節存儲的Class文件的版本號,后面是常量池入口。
后面是代表訪問標志的兩個字節,這個表示用于識別一些類或者接口層次的訪問信息。
再往后就是類索引、父索引與接口索引集合。
字段表集合用戶描述接口或者類中聲明的變量。
方法表集合、屬性表集合。
魔數--->版本號--->常量池入口--->訪問標志--->類索引、父索引與接口索引集合
?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Java内存泄露和内存溢出、JVM命令行工具、.JDK可视化工具、Java Class文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 类加载器、双亲委派模型
- 下一篇: java美元兑换,(Java实现) 美元