java內存使用情況
❶ java內存佔用大堆內存少
首先java內存可以大體分為堆內存和棧內存。一般收的內存使用過大是指堆內存使用過大。一般分步驟分析。
現在內存過大到底到何種程度。是否引起了GC或者FUll GC。是否影響了正常工作。
1.明白現在內存有多大,可以通過工具看,和使用的內存比例。如果項目中需要緩存很多緩存,孫耐可以理解使用是合理的。如果伺服器內存夠大,應用可以適當調整XMX xms參數進行JVM調整。者帆
2.如果系統中沒有使用緩存,和大對象內存過高,那就考慮是否有內存泄漏。可以使用jmap等jVM調優工具進行對象分析。然後定位過高原因修改代碼。
jmap -mp:format=b,file=文件名 [pid]
mp當前系統,根據mp文件我們可以分析當前系統中存在的內存問題。
分析mp文件的工具很多,JDK自帶的Jhat,Eclipse也有相關的插件。
我使用的是Eclipse Memory Analyzer,功能很強大,能夠生成各種報表,另外可以在不同的時間生成不同的mp,然後通過工具分析兩個mp的內存變化。
大家專注我,我寫了好多JVM 原理和調優的文章。
文版權歸是三僡然所有,轉載請標明出處。歡迎轉載,歡迎評論首凱雹,歡迎分享。如果你有文章想分享可以聯系我。
❷ java 如何獲得一個進程的內存使用情況,cpu運行的時間
首先有個基本問題需要了解一下:
這里所說java里獲得一個進程的內存使用情況和cpu運行時間,是指在java內部獲取一個純外部進程的內存與cpu時間呢,還是指在java內部,由java啟動的進程的內存與cpu時間。
如果是第一種情況,那你還需要在java內部再起一個進程,通過執行操作系統的shell命令來查看那個進程的運行狀態。比如那個外部進程的ID為3119,則執行cat /proc/3119/status | grep VmRSS就可以過濾出該進程的物理內存佔用量。
如果是第二種情況,(假定你問的就是這種情況)。
先說內存佔用量:一般說來,你可以使用這兩種方式獲取內存使用情況
方式一:
MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
MemoryUsage memoryUsage = memoryMXBean.getHeapMemoryUsage(); //椎內存使用情況
long totalMemorySize = memoryUsage.getInit(); //初始的總內存
long maxMemorySize = memoryUsage.getMax(); //最大可用內存
long usedMemorySize = memoryUsage.getUsed(); //已使用的內存
方式二:
Runtime rt = Runtime.getRuntime();
long totalMemorySize = rt.totalMemory(); //初始的總內存
long maxMemorySiz = t.maxMemory(); //最大可用內存
long freeMemorySize = rt.freeMemory(); //當前可用內存
需要說明的是,這種方式獲取的是整個jvm的內存使用情況,並不是某一個進程的內存使用情況,事實上,在java內部,可以使用Rumtime.getRuntime().exec(${SHELL})來開啟一個外部進程(這里${SHELL}代表一個可操作系統的shell命令)。而運行Java程序整個jvm,對於操作系統而言,也僅僅只是一個進程。也就是說,一個jvm就是一個進程,你通過java程序開啟的進程都是外部進程,java內部目前還提供了一個destroy方法來銷毀該進程,對於該進程的其它信息,都無法直接獲取,這些信息的獲取,顯然需要本地化(Local)的實現。既然標准jdk庫沒有,就不可能再通過平台無關的代碼來實現了。典型的做法就是使用前面第一種情況的方式,再啟一個進程,執行shell命令來獲取。
不過對於cpu使用時間,採用標准java代碼倒是可以拿到。由於java的語法很啰嗦,舉一個較完全的例子需要太多的代碼,我這里就只寫最關鍵的代碼:
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
① long currentCpuTime = threadMXBean.getCurrentThreadCpuTime(); //當前線程的cpu使用時間
long someThreadId = 709817L; //假定有某個線程的ID是709817
② long someThreadCpuTime = threadMXBean.getThreadCpuTime(someThreadId); //獲取ID為someThreadId即709817的線程的cpu時間
基於上面的核心api,你可以把由java啟動的外部進程放到一個單獨的線程中執行,再用代碼②的方式來獲取該進程的cpu使用時間,也可以將外部進程放入到當前線程中執行,用① 的方式來獲得進程的cpu使用時間。
❸ Java獲得內存使用,磁碟情況
遲孝import java io File;
/**
*
* jdk 下的磁碟使用情況例子
*/
public class Diskfree {
public static void main(String[] args) {
File[] roots = File listRoots();//獲取磁碟分區列表
for (File file : roots) {
System out println(file getPath()+ 信息如下: );
System out println( 空閑未使用 = + file getFreeSpace()/ / / + G );//空閑空間
System out println( 已經使用 = + file getUsableSpace()/ / / + G );//可用空間
System out println( 總容量 = + file getTotalSpace()/ / / + G );//總空間
System out println();
}
}
}
java獲得當前系統內存情況的代碼如下
Java code
import java lang management ManagementFactory;
import sun management OperatingSystemMXBean;
public class OSTest {
public static void main(String[] args)
{
OperatingSystemMXBean o *** b = (OperatingSystemMXBean) ManagementFactory getOperatingSystemMXBean();
System out println( 系統物理內存總計 + o *** b getTotalPhysicalMemorySize() / / + MB );
System out println( 系統物理可用內存總計 + o *** b getFreePhysicalMemorySize() / / + MB ); }
}
ManagementFactory getOperatingSystemMXBean()返回的是java lang management裡面的OperatingSystemMXBean
我們要用的是 sun management OperatingSystemMXBean;
在java類庫中可頌凱以查到
public abstract Interface sun management OperatingSystemMXBean extends java lang management OperatingSystemMXBean
所以我們可以強制轉換一下
想得到磁碟使用情況的話 可以看 樓的例子 要得到系統信息的話 使用System getProperty(String key);
方法
內存使野旦喚用可以使用Runtime getRuntime() getTotalMemory() Runtime getRuntime() getFreeMemory()
純JAVA是不能同操作系統打交到得 比如你要看CPU使用率 一般就是使用JNI技術(一些簡單得系統熟悉 可以通過System getProperties()獲得)
lishixin/Article/program/Java/hx/201311/27126
❹ 發布即巔峰!萬字長文:Java性能調優六大工具:MAT內存分析工具
MAT內存分析工具,簡稱MAT,是一種功能強大的Java堆內存頌睜分析器。它可以幫助用戶查找內存泄漏,查看內存消耗情況。MAT是基於Eclipse開發的一款免費性能分析工具,用戶可以在eclipse.org/mat/上下載並使用。
在分析堆快照之前,首先需要導出應用程序的堆快照。可以使用jmap、JConsole和VisualVM等工具獲得Java應用程序的堆快照文件,MAT也具備這個功能。在MAT中,通過File菜單的AcquireHeapDump命令,選擇要分析的應用程序即可。
除了在MAT中導出正在運行的Java應用程序堆快照,也可以通過File菜單的OpenHeapDump命令打開一個已存在的堆快照文件。MAT可以打開已有的堆快照,也可以直接從活動Java程序中導出堆快照。
在MAT界面右側,可以查看堆快照文件的大小、類、實例和ClassLoader的總數。餅圖顯示了當前堆快照中最大的對象。通過餅圖,可以在Inspector界面中查看對象的詳細信息,也可以對選中的對象進行更多操作。
通過柱狀圖界面,可以查找引用選中對象的對象集合以及選中對象所引用的對象集合。在MAT中,可以根據對象間的引用關系對內存中的對象進行分析。
淺堆和深堆是兩個非常重要的概念。淺堆是指一個對象所消耗的內存,深堆是指對象的保留集中所有對象的淺堆之和。理解這兩個概念有助於分析內存使用情況。
支配樹是MAT提供的一個對象圖,體現了對象實例間的支配關系。在MAT中,可以查看對象支配樹視圖,了解對象的直接支配者。
垃圾回收根可能是系統類、JNI局部變數、JNI全局變數、線程等。通過MAT,可以列出所有的根對象。
內存泄漏檢測是MAT提供的功能之一。通過選擇LeakSuspects命令,MAT會自動生成一份報告,羅列系統內可能存在內存泄漏的問題點。
最大對象報告可以幫助開發者找到系統中佔用內存最大的幾個枝旅對象。通過選擇TopConsumers命令,可以打開消耗內存最多的對象的報告。
查找支配者也是MAT的一個功能。通過選擇ImmediateDominators命令,可以輸出選中對象的直接支配者。
線程分析和集合使用情況分析是MAT提供的其他功能。通過這些功能,可以更好地了解系統的內存使用情況。
擴展MAT可以讓它野搭歲更貼近實際生產環境,提高堆內存分析的效率。
❺ jmapmp內存的命令是
jmap命令是查看Java內存信息的工具,其中jmap mp內存的命令是「jmap -mp」。
關於這個命令的詳細解釋如下:
Jmap是Java的一個命令行工具,用於查看Java應用程序的內存使用情況。它可鄭和以生成堆轉儲快照,以幫助開發人員分析內存中的問題。特別是在解決內存泄漏或者調優JVM時,jmap是一個非常重要的工具。其中,「jmap -mp」命令是用於將JVM的內存轉儲到文件的。
當使用「jmap -mp」命令時,通常需要指定一些參數來獲取特定的內存信息。這些參數包括堆轉儲文件的輸出路徑、JVM進程的PID以及可能的選項設置等。通過這個命令,開發者可以獲取到關於Java對象的詳細信息,包括對象的大小、類的類型以及對象之間的關系等。這對於分析內存中的對象結構以及查找潛在的內存問題非常有幫助。
在實際使用中,為了獲取准敏瞎確的內存轉儲信息,需要確保在執行jmap命令時JVM進程處於穩定狀態。此外,對於大型系統的內存轉儲操作可能會消耗一定的時間和資源,因此在實際操作中需橋叢空要注意對系統性能的影響。
總之,「jmap -mp」命令是Java開發中用於分析內存使用情況的重要工具之一,通過它可以獲取到詳細的內存轉儲信息,幫助開發者解決內存相關問題。使用前要確保理解相關參數的意義和操作注意事項,以保證結果的准確性和有效性。