日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java内存泄露和内存溢出、JVM命令行工具、.JDK可视化工具、Java Class文件

發布時間:2024/10/14 java 67 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java内存泄露和内存溢出、JVM命令行工具、.JDK可视化工具、Java Class文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.Java內存泄露和內存溢出對比

1.1 Java?內存泄露

內存泄露是指一個不再被程序使用的對象或變量還在內存中占用空間。

1.1.1判斷內存空間是否符合垃圾回收的標準

在Java語言中,判斷一個內存空間是否符合垃圾回收的標準有兩個:

  • 給對象賦予了空值null,以后再也沒有不會被使用;
  • 給對象賦予了新值,重新分配了內存空間。
  • 1.1.2內存泄漏的情況

    一般來說,內存泄露主要有兩種情況:

  • 在堆中申請的空間沒有被釋放;
  • 對象已不再使用但是還仍然在內存中保留著。
  • 垃圾回收機制的引入可以有效地解決第一種情況,但是對第二種情況卻沒有辦法解決,因此Java語言中內存泄露主要指的是第二種情況

    1.1.3造成內存泄露的對象的特點

    在Java中,內存泄漏就是存在一些被分配的對象,這些對象有下面兩個特點,

  • 這些對象是可達的,即在有向圖中,存在通路可以與其相連;
  • 這些對象是無用的,即程序以后不會再使用這些對象。
  • 如果對象滿足這兩個條件,這些對象就可以判定為Java中的內存泄漏,這些對象不會被GC所回收,然而它卻占用內存

    1.1.4 引起內存泄露的原因

    在Java語言中,容易引起內存泄露的原因有很多,主要可以分為以下幾種。

  • 靜態集合類。例如HashMap和Vector,如果這些容器是靜態的,那么它們的聲明周期與程序一樣,在程序結束之前這些容器所占的空間將得不到釋放,從而造成內存泄露;
  • 各種連接。比如Connection、Statement、ResultSet等如果使用之后不顯示地關閉,會造成大量的對象無法回收,造成內存泄露;
  • ?監聽器。在java中,往往一個程序使用多個監聽器,但是在釋放對象的時候卻沒有刪除相應的監聽器對象就會導致內存泄露;
  • 變量不合理的作用域。如果一個變量定義的作用范圍大于其使用范圍 ,就有可能造成內存泄露,另一個方面如果沒有及時地把一個對象設置為null,也有可能導致內存泄露;
  • 單例模式可能會造成內存泄露。如果以靜態的方式存儲單例對象的話,那么它在JVM的整個生命周期中都存在,就會導致內存泄露。
  • 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文件的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。