關(guān)于jvm內(nèi)存如何查看
jvm內(nèi)存如何查看
在 Java 虛擬機(jī) (JVM) 中,內(nèi)存管理是性能調(diào)優(yōu)和排查問(wèn)題的重要部分。
JVM 的內(nèi)存分為多個(gè)區(qū)域,如堆內(nèi)存(Heap)、方法區(qū)(Method Area)、堆外內(nèi)存(Off-Heap Memory)等。
查看 JVM 的內(nèi)存情況可以通過(guò)多種工具和方法,以下是常用的方法和工具。
1. 使用 JDK 自帶工具查看 JVM 內(nèi)存
a. jps + jstat
- jps:用于查看當(dāng)前系統(tǒng)中正在運(yùn)行的 Java 進(jìn)程。
- jstat:用于監(jiān)控 JVM 的內(nèi)存使用情況。
查看正在運(yùn)行的 Java 進(jìn)程:
jps
假設(shè)你得到的 Java 進(jìn)程 ID 是 1234,你可以使用以下命令查看該進(jìn)程的堆內(nèi)存使用情況:
jstat -gc 1234 1000 5
這將輸出 JVM 中堆內(nèi)存和垃圾回收的相關(guān)信息,每 1 秒輸出一次,總共輸出 5 次。
輸出示例:
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
1536.0 1536.0 0.0 0.0 8192.0 2500.0 10240.0 2048.0 2400.0 2200.0 400.0 350.0 5 0.045 2 0.030 0.075
- S0C, S1C:第一個(gè)和第二個(gè) Survivor 區(qū)的容量。
- S0U, S1U`:第一個(gè)和第二個(gè) Survivor 區(qū)的使用量。
- EC:Eden 區(qū)的容量。
- EU:Eden 區(qū)的使用量。
- OC:Old Generation(老年代)的容量。
- OU:Old Generation(老年代)的使用量。
- YGC, YGCT`:年輕代 GC 次數(shù)及其時(shí)間。
- FGC, FGCT:老年代 GC 次數(shù)及其時(shí)間。
b. jmap
jmap 可以生成堆轉(zhuǎn)儲(chǔ)文件,也可以查看 JVM 的內(nèi)存情況。
查看堆內(nèi)存分布:
bash jmap -heap <進(jìn)程ID>
輸出示例:
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 536870912 (512.0MB)
NewSize = 1310720 (1.25MB)
MaxNewSize = 17592186044415 MB
OldSize = 54525952 (52.0MB)
MetaspaceSize = 134217728 (128.0MB)
CompressedClassSpaceSize = 16777216 (16.0MB)
MaxMetaspaceSize = 536870912 (512.0MB)
c. jconsole
jconsole 是 JDK 自帶的 GUI 工具,可以用來(lái)監(jiān)控 JVM 內(nèi)存使用、線程、類加載等信息。
運(yùn)行以下命令啟動(dòng):
bash jconsole
選擇需要監(jiān)控的 Java 進(jìn)程,即可實(shí)時(shí)查看 JVM 內(nèi)存的使用情況,包括堆內(nèi)存和非堆內(nèi)存。
d. jvisualvm
jvisualvm 是另一個(gè)強(qiáng)大的 GUI 工具,它集成了性能監(jiān)控、內(nèi)存分析、垃圾回收分析等功能。
運(yùn)行以下命令啟動(dòng):
bash jvisualvm
選擇需要分析的 Java 進(jìn)程,可以查看堆內(nèi)存使用情況、生成堆轉(zhuǎn)儲(chǔ)、分析內(nèi)存泄漏等。
2. 通過(guò) Java 命令行參數(shù)查看 JVM 內(nèi)存配置
使用以下命令查看 JVM 的啟動(dòng)參數(shù),包括內(nèi)存配置:
bash java -XX:+PrintFlagsFinal -version | grep -Ei 'Heap|PermSize|MetaspaceSize'
該命令會(huì)顯示 JVM 當(dāng)前的內(nèi)存配置,例如:
intx InitialHeapSize := 268435456 intx MaxHeapSize := 4294967296 intx MaxMetaspaceSize := 1073741824
3. 查看運(yùn)行時(shí)內(nèi)存信息
在 Java 程序中,可以使用以下代碼來(lái)查看 JVM 內(nèi)存使用情況:
public class JVMInfo { public static void main(String[] args) { Runtime runtime = Runtime.getRuntime(); // 總內(nèi)存 long totalMemory = runtime.totalMemory(); // 最大內(nèi)存 long maxMemory = runtime.maxMemory(); // 空閑內(nèi)存 long freeMemory = runtime.freeMemory(); System.out.println("Total Memory: " + totalMemory / 1024 / 1024 + " MB"); System.out.println("Max Memory: " + maxMemory / 1024 / 1024 + " MB"); System.out.println("Free Memory: " + freeMemory / 1024 / 1024 + " MB"); } }
4. 使用第三方監(jiān)控工具
- Prometheus + Grafana:通過(guò) Prometheus 監(jiān)控 Java 應(yīng)用(通常與 jmx_exporter 配合使用),并使用 Grafana 可視化展示 JVM 的內(nèi)存使用情況。
- Elastic Stack (ELK):可以集成 Java 應(yīng)用的監(jiān)控?cái)?shù)據(jù),通過(guò) Kibana 展示內(nèi)存使用情況。
- New Relic、Datadog、Zabbix:這些工具提供豐富的 JVM 監(jiān)控和告警功能。
總結(jié)
通過(guò)使用 JDK 自帶的工具(如 jstat、jmap、jconsole 等)、代碼、命令行參數(shù)以及第三方監(jiān)控工具,可以全面監(jiān)控和分析 JVM 的內(nèi)存使用情況。
掌握這些工具有助于在實(shí)際開(kāi)發(fā)和生產(chǎn)環(huán)境中快速定位和解決內(nèi)存相關(guān)問(wèn)題。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java設(shè)計(jì)模式之構(gòu)建者模式知識(shí)總結(jié)
這幾天剛好在復(fù)習(xí)Java的設(shè)計(jì)模式,今天就給小伙伴們?nèi)婵偨Y(jié)一下開(kāi)發(fā)中最常用的設(shè)計(jì)模式-建造者模式的相關(guān)知識(shí),里面有很詳細(xì)的代碼示例及注釋哦,需要的朋友可以參考下2021-05-05Java中的Random()函數(shù)及兩種構(gòu)造方法
Java中存在著兩種Random函數(shù)分別是java.lang.Math.Random和java.util.Random,文中給大家介紹了random()的兩種構(gòu)造方法,感興趣的朋友跟隨小編一起看看吧2018-11-11springboot的LogbackLoggingSystem配置加載流程解析
這篇文章主要介紹了springboot的LogbackLoggingSystem配置加載流程源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11一篇文章學(xué)會(huì)java死鎖與CPU 100%的排查
這篇文章主要介紹了一篇文章學(xué)會(huì)java死鎖與CPU 100%的排查,文中主要介紹了Java死鎖以及服務(wù)器CPU占用率達(dá)到100%時(shí)的排查和解決方法,感興趣的朋友一起來(lái)看一看吧2021-08-08IDEA使用jformdesigner插件做管理系統(tǒng)MVC架構(gòu)的步驟和實(shí)現(xiàn)思路
在?IntelliJ?IDEA?中結(jié)合?JFormDesigner?插件,通過(guò)?Swing?框架實(shí)現(xiàn)一個(gè)管理系統(tǒng)的?MVC?架構(gòu)是一種經(jīng)典的開(kāi)發(fā)方式,以下是具體的步驟和實(shí)現(xiàn)思路,包含從項(xiàng)目創(chuàng)建到?MVC?架構(gòu)的核心代碼實(shí)現(xiàn),需要的朋友可以參考下2024-12-12詳解Java如何通過(guò)裝飾器模式擴(kuò)展系統(tǒng)功能
這篇文章主要為大家詳細(xì)介紹了Java如何通過(guò)裝飾器模式擴(kuò)展系統(tǒng)功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-04-04Spring Boot Admin 動(dòng)態(tài)修改日志級(jí)別的方法步驟
這篇文章主要介紹了Spring Boot Admin 動(dòng)態(tài)修改日志級(jí)別的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08java四種訪問(wèn)權(quán)限實(shí)例分析
這篇文章主要介紹了java四種訪問(wèn)權(quán)限實(shí)例分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10