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部落格,原文連結: