天天看點

ccJVMJVM常用的分析工具

JVM是Java Virtual Machine(Java虛拟機)的縮寫,JVM是一種用于計算裝置的規範,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模拟各種計算機功能來實作的。JVM包括一套位元組碼指令集、一組寄存器、一個棧、一個垃圾回收堆和一個存儲方法域。 JVM屏蔽了與具體作業系統平台相關的資訊,使Java程式隻需生成在Java虛拟機上運作的目标代碼(位元組碼),就可以在多種平台上不加修改地運作。JVM在執行位元組碼時,實際上最終還是把位元組碼解釋成具體平台上的機器指令執行。
JVM的核心是由類加載器(Class Loader)、執行引擎(Execute Engine)和Java Memory Management(JVM記憶體管理器)共同組成

JVM管理(JVM Memory Management)的記憶體段可分為兩大類:線程共享記憶體和線程私有記憶體

程式計數寄存器(Program Counter Register): 每個線程有自己的計數寄存器,存儲目前線程執行位元組碼的位址

jvm棧(JVM Stack): jvm會為每個運作線程配置設定一個棧區,線程調用方法時和方法傳回時會進行入棧和出棧操作

本地方法棧區(Native Stack): 與jvm stack類似,隻不過此區域是為調用本地方法服務(系統調用)

方法區(Method Area): 存儲jvm加載的class、常量、靜态變量、即時編譯器編譯後的代碼等

java堆(Java Heap): 存儲java的所有對象執行個體、數組等

線程共享記憶體

線程私有記憶體

在Java世界中使用記憶體不需要程式員手動申請,隻需定義變量,由JVM自動為其配置設定相應的記憶體,GC負責記憶體垃圾回收。

年輕代(Young Generation): 也叫Survivor Generation

eden: 存放新建立的對象。

to|from: 存放年輕代執行minor GC後存活下來的對象

老年代(Old Generation): 存放多次年輕代執行minor GC後存活下來的對象

持久代(Permanent Generation): 存放java class類和meta資料

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

# 配置設定了一個又一個對象

放到Eden區

# 不好,Eden區滿了,隻能GC(新生代GC:Minor GC)了

把Eden區的存活對象copy到from區,然後清空Eden區(本來to區也需要清空的,不過本來就是空的)

# 又配置設定了一個又一個對象

# 不好,Eden區又滿了,隻能GC(新生代GC:Minor GC)了

把Eden區和from區的存活對象copy到to區,然後清空Eden區和from區

把Eden區和to區的存活對象copy到from區,然後清空Eden區和to區

# ...

# 有的對象來回在Survivor區呆了比如15次,就被配置設定到老年代Old區

# 有的對象太大,超過了Eden區,直接被配置設定在Old區

# 有的存活對象,放不下Survivor區,也被配置設定到Old區

# 在某次Minor GC的過程中突然發現:

# 不好,老年代Old區也滿了,這是一次大GC(老年代GC:Major GC)

Old區慢慢的整理一番,空間又夠了

# 繼續Minor GC

優化tomcat程序使用的Java Heap記憶體空間

# 修改catalina.sh檔案中的JAVA_OPTS

JAVA_OPTS="-server -Xms512m -Xmx512m -XX:NewSize= -XX:MaxNewSize= -XX:PermSize= -XX:MaxPermSize="

  -server  # 伺服器模型

  -Xms  # 堆記憶體初始化大小

  -Xmx  # 堆記憶體空間上限

  -XX:NewSize=  # 新生代空間初始化大小

  -XX:MaxNewSize=  # 新生代空間最大值

  -XX:PermSize=  # 持久代空間初始化大小

  -XX:MaxPermSize=  # 持久代空間最大值

線程池設定:

# 修改server.xml檔案

<Connector port="8080" protocol="HTTP/1.1"  connectionTimeout="20000" redirectPort="8443"

    maxThreads=  # 最大線程數

    minSpareThreads=  # 最小空閑線程數

    maxSpareThreads=  # 最大空閑線程數

    acceptCount=  # 等待隊列的最大長度

    URIEncoding=  # URI位址編碼格式,建議使用UTF-8

    enableLookups=  # 是否啟用dns解析,建議禁用

    compression=  # 是否啟用傳輸壓縮機制,建議“on"

    compressionMinSize=  # 啟用壓縮傳輸的資料流最小值,機關是位元組

    compressableMimeType=  # 定義啟用壓縮功能的MIME類型。如text/html, text/xml, text/css, text/javascript

    Server=  # 修改tomcat版本資訊

/>

禁用8005端口

<Server port="-1" shutdown="SHUTDOWN">

jps: 用來檢視運作的所有jvm程序

jps [-q] [-mlvV] [<hostid>]

-q:靜默模式

-v:顯示傳遞給jvm的指令行參數

-m:輸出傳入main方法的參

-l:輸出main類或jar完全限定名稱

-V:顯示通過flag檔案傳遞給jvm的參數

[<hostid>]:主機id,預設為localhost

jinfo: 檢視程序的運作環境參數,主要是jvm指令行參數

jinfo [option] <pid>

-flags:to print VM flags

-sysprops:to print Java system properties

-flag <name>:to print the value of the named VM flag

jstat: 對jvm應用程式的資源和性能進行實時監控

jstat -help|-options

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

常見用法 jstat -gc PID

jstack: 檢視所有線程的運作狀态

jstack [-l] <pid>

jstack -F [-m] [-l] <pid>

    -l:long listings,會顯示額外的鎖資訊,是以,發生死鎖時常用此選項

    -m:混合模式,既輸出java堆棧資訊,也輸出C/C++堆棧資訊

    -F:當使用“jstack -l PID"無響應,可以使用-F強制輸出資訊

jmap: 檢視jvm占用實體記憶體的狀态

jconsole:JVM記憶體圖形化監控工具

jvisualvm:JVM記憶體圖形化監控工具

版權聲明:原創作品,如需轉載,請注明出處。否則将追究法律責任

本文轉自    懿懿懿   51CTO部落格,原文連結: