javawindows查看內存分布,windows java內存哪裡調

本文目錄一覽:

怎樣查看JAVA內存的大小?

首先先說一下JVM內存結構問題,JVM為兩塊:PermanentSapce和HeapSpace,其中

Heap = }。PermantSpace負責保存反射對象,一般不用配置。JVM的Heap區可以通過-X參數來設定。

當一個URL被訪問時,內存申請過程如下:

A. JVM會試圖為相關Java對象在Eden中初始化一塊內存區域

B. 當Eden空間足夠時,內存申請結束。否則到下一步

C. JVM試圖釋放在Eden中所有不活躍的對象(這屬於1或更高級的垃圾回收), 釋放後若Eden空間仍然不足以放入新對象,則試圖將部分Eden中活躍對象放入Survivor區

D. Survivor區被用來作為Eden及OLD的中間交換區域,當OLD區空間足夠時,Survivor區的對象會被移到Old區,否則會被保留在Survivor區

E. 當OLD區空間不夠時,JVM會在OLD區進行完全的垃圾收集(0級)

F. 完全垃圾收集後,若Survivor及OLD區仍然無法存放從Eden複製過來的部分對象,導致JVM無法在Eden區為新對象創建內存區域,則出現」out of memory錯誤」

JVM調優建議:

ms/mx:定義YOUNG+OLD段的總尺寸,ms為JVM啟動時YOUNG+OLD的內存大小;mx為最大可佔用的YOUNG+OLD內存大小。在用戶生產環境上一般將這兩個值設為相同,以減少運行期間系統在內存申請上所花的開銷。

NewSize/MaxNewSize:定義YOUNG段的尺寸,NewSize為JVM啟動時YOUNG的內存大小;MaxNewSize為最大可佔用的YOUNG內存大小。在用戶生產環境上一般將這兩個值設為相同,以減少運行期間系統在內存申請上所花的開銷。

PermSize/MaxPermSize:定義Perm段的尺寸,PermSize為JVM啟動時Perm的內存大小;MaxPermSize為最大可佔用的Perm內存大小。在用戶生產環境上一般將這兩個值設為相同,以減少運行期間系統在內存申請上所花的開銷。

SurvivorRatio:設置Survivor空間和Eden空間的比例

內存溢出的可能性

1. OLD段溢出

這種內存溢出是最常見的情況之一,產生的原因可能是:

1) 設置的內存參數過小(ms/mx, NewSize/MaxNewSize)

2) 程序問題

單個程序持續進行消耗內存的處理,如循環幾千次的字元串處理,對字元串處理應建議使用StringBuffer。此時不會報內存溢出錯,卻會使系統持續垃圾收集,無法處理其它請求,相關問題程序可通過Thread Dump獲取(見系統問題診斷一章)單個程序所申請內存過大,有的程序會申請幾十乃至幾百兆內存,此時JVM也會因無法申請到資源而出現內存溢出,對此首先要找到相關功能,然後交予程序員修改,要找到相關程序,必須在Apache日誌中尋找。

當Java對象使用完畢後,其所引用的對象卻沒有銷毀,使得JVM認為他還是活躍的對象而不進行回收,這樣累計佔用了大量內存而無法釋放。由於目前市面上還沒有對系統影響小的內存分析工具,故此時只能和程序員一起定位。

2. Perm段溢出

通常由於Perm段裝載了大量的Servlet類而導致溢出,目前的解決辦法:

1) 將PermSize擴大,一般256M能夠滿足要求

2) 若別無選擇,則只能將servlet的路徑加到CLASSPATH中,但一般不建議這麼處理

3. C Heap溢出

系統對C Heap沒有限制,故C Heap發生問題時,Java進程所佔內存會持續增長,直到佔用所有可用系統內存

參數說明:

JVM 堆內存(heap)設置選項

參數格式

說 明

設置新對象生產堆內存(Setting the Newgeneration heap size)

-XX:NewSize

通過這個選項可以設置Java新對象生產堆內存。在通常情況下這個選項的數值為1 024的整數倍並且大於1MB。這個值的取值規則為,一般情況下這個值-XX:NewSize是最大堆內存(maximum heap size)的四分之一。增加這個選項值的大小是為了增大較大數量的短生命周期對象

增加Java新對象生產堆內存相當於增加了處理器的數目。並且可以並行地分配內存,但是請注意內存的垃圾回收卻是不可以並行處理的

設置最大新對象生產堆內存(Setting the maximum New generation heap size)

-XX:MaxNewSize

通過這個選項可以設置最大Java新對象生產堆內存。通常情況下這個選項的數值為1 024的整數倍並且大於1MB

其功用與上面的設置新對象生產堆內存-XX:NewSize相同

設置新對象生產堆內存的比例(Setting New heap size ratios)

-XX:SurvivorRatio

新對象生產區域通常情況下被分為3個子區域:伊甸園,與兩個殘存對象空間,這兩個空間的大小是相同的。通過用-XX:SurvivorRatio=X選項配置伊甸園與殘存對象空間(Eden/survivor)的大小的比例。你可以試著將這個值設置為8,然後監控、觀察垃圾回收的工作情況

設置堆內存池的最大值(Setting maximum heap size)

-Xmx

通過這個選項可以要求系統為堆內存池分配內存空間的最大值。通常情況下這個選項的數值為1 024的整數倍並且大於1 MB

一般情況下這個值(-Xmx)與最小堆內存(minimum heap size –Xms)相同,以降低垃圾回收的頻度

取消垃圾回收

-Xnoclassgc

這個選項用來取消系統對特定類的垃圾回收。它可以防止當這個類的所有引用丟失之後,這個類仍被引用時不會再一次被重新裝載,因此這個選項將增大系統堆內存的空間

設置棧內存的大小

-Xss

這個選項用來控制本地線程棧的大小,當這個選項被設置的較大(2MB)時將會在很大程度上降低系統的性能。因此在設置這個值時應該格外小心,調整後要注意觀察系統的性能,不斷調整以期達到最優

最後說一句,你的機器的連接數設置也至關重要,連接的關閉最好把時間設置的少些,那些連接非常耗費資源。也是引起內存泄露的主要原因。

如何查看java進程大量佔用內存

如何查看java進程大量佔用內存

你好,方法如下:

可以直接使用top命令後,查看%MEM的內容。可以選擇按進程查看或者按用戶查看,如想查看oracle用戶的進程內存使用情況的話可以使用如下的命令:

(1)top

top命令是Linux下常用的性能分析工具,能夠實時顯示系統中各個進程的資源佔用狀況,類似於Windows的任務管理器

可以直接使用top命令後,查看%MEM的內容。可以選擇按進程查看或者按用戶查看,如想查看oracle用戶的進程內存使用情況的話可以使用如下的命令:

$ top -u oracle

內容解釋:

PID:進程的ID

USER:進程所有者

PR:進程的優先順序別,越小越優先被執行

NInice:值

VIRT:進程佔用的虛擬內存

RES:進程佔用的物理內存

SHR:進程使用的共享內存

S:進程的狀態。S表示休眠,R表示正在運行,Z表示僵死狀態,N表示該進程優先值為負數

%CPU:進程佔用CPU的使用率

%MEM:進程使用的物理內存和總內存的百分比

TIME+:該進程啟動後佔用的總的CPU時間,即佔用CPU使用時間的累加值。

COMMAND:進程啟動命令名稱

常用的命令:

P:按%CPU使用率排行

T:按MITE+排行

M:按%MEM排行

(2)pmap

可以根據進程查看進程相關信息佔用的內存情況,(進程號可以通過ps查看)如下所示:

$ pmap -d 14596

(3)ps

如下例所示:

$ ps -e -o ‘pid,comm,args,pcpu,rsz,vsz,stime,user,uid’ 其中rsz是是實際內存

$ ps -e -o ‘pid,comm,args,pcpu,rsz,vsz,stime,user,uid’ | grep oracle | sort -nrk5

其中rsz為實際內存,上例實現按內存排序,由大到小

求問Java怎樣查看系統物理內存大小?還有可用內存

我來解釋一下你遇到的不解:

你所看到的現象也是真的。之所以RunTime的函數報告的內存與你看到的不一樣是因為java運行是以虛擬機為單位。她報告的都是虛擬機的情況。

而在一個windows系統里,你可以啟動安裝多個虛擬機。而每個虛擬機在啟動的時候,並不能得到windows系統的全部資源,jvm的資源也由windows來分配。windows所掌管的就是你硬體上的256M,

而jvm得到的僅是部分。

但對於運行在jvm里的java程序,當然只探測jvm的資源情況。

如果你非要讓java程序跑到jvm之外的環境去探測實際硬體環境,那就只有native code了。我暈~~還是不對啊我運行的結果和你的一模一樣

可我的內存是256M的而且可用內存肯定不對(不可能只有1M多)

如何監控Java應用程序的Windows內存使用情況

應用程序很高興對所有這些活動一無所知。它只知道自己的虛擬地址空間。但是,如果當前在主存中的頁面集(稱為 駐留集)少於實際要使用的頁面集(稱為 工作集),應用程序的性能很快就會顯著降低。(不幸的是,本文中您將看到,我們要討論的工具常常交換使用這兩個術語,儘管它們指的是完全不同的事物。)

Task Manager 和 PerfMon

我們首先考察兩種最常見的工具:Task Manager 和 PerfMon。這兩個工具都隨 Windows 一起提供,因此由此起步比較容易。

Task Manager

Task Manager 是一種非常見的 Windows 進程監控程序。您可以通過熟悉的 Ctrl-Alt-Delete 組合鍵來啟動它,或者右擊任務欄。Processes 選項卡顯示了最詳細的信息,如圖 2 所示。

圖 2. Task Manager 進程選項卡

圖 2 中顯示的列已經通過選擇 View — Select Columns 作了調整。有些列標題非常含糊,但可以在 Task Manager 幫助中找到各列的定義。和進程內存使用情況關係最密切的計數器包括:

Mem Usage(內存使用):在線幫助將其稱為進程的工作集(儘管很多人稱之為駐留集)——當前在主存中的頁面集。但是這個數值包含能夠和其他進程共享的頁面,因此要注意避免重複計算。比方說,如果要計算共享同一個 DLL 的兩個進程的總內存佔用情況,不能簡單地把「內存使用」值相加。

Peak Mem Usage(內存使用高峰值):進程啟動以來 Mem Usage(內存使用)欄位的最大值。

Page Faults(頁面錯誤):進程啟動以來要訪問的頁面不在主存中的總次數。

VM Size(虛擬內存大小):聯機幫助將其稱為「分配給進程私有虛擬內存總數。」更確切地說,這是進程所 提交的內存。如果進程保留內存而沒有提交,那麼該值就與總地址空間的大小有很大的差別。

雖然 Windows 文檔將 Mem Usage(內存使用)稱為工作集,但在該上下文中,它實際上指的是很多人所說的駐留集(resident set),明白這一點很重要。您可以在 Memory Management Reference 術語表(請參閱 參考資料)中找到這些術語的定義。 工作集 更通常的含義指的是一個邏輯概念,即在某一點上為了避免分頁操作,進程需要駐留在內存中的那些頁面。

PerfMon

隨 Windows 一起提供的另一種 Microsoft 工具是 PerfMon,它監控各種各樣的計數器,從列印隊列到電話。PerfMon 通常在系統路徑中,因此可以在命令行中輸入 perfmon 來啟動它。這個工具的優點是以圖形化的方式顯示計數器,很容易看到計數器隨時間的變化情況。

請在 PerfMon 窗口上方的工具欄中單擊 + 按鈕,這樣會打開一個對話框讓您選擇要監控的計數器,如圖 3a 所示。計數器按照 性能對象分成不同的類別。與內存使用關係最密切的兩個類是 Memory 和 Process。選中計數器然後單擊 Explain 按鈕,就可以看到計數器的定義。說明出現在主對話框下方彈出的單獨的窗口中。

原創文章,作者:JAPU,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/147256.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
JAPU的頭像JAPU
上一篇 2024-11-01 14:07
下一篇 2024-11-01 14:07

相關推薦

  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Python創建分配內存的方法

    在python中,我們常常需要創建並分配內存來存儲數據。不同的類型和數據結構可能需要不同的方法來分配內存。本文將從多個方面介紹Python創建分配內存的方法,包括列表、元組、字典、…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29

發表回復

登錄後才能評論