① 如何查看當前linux系統給JVM分配了多大的內存
以WAS為例:
[tmp]$ ps -ef | grep java
root 9787 1 0 Sep17 ? 00:02:48 /opt/IBM/WebSphere/AppServer/java/bin/java -Xms50m -Xmx256m
-Xms 和 -Xmx 分別代表分配JVM的最小內存和最大內存。
堆棧信息你可以用 kill -3 後面跟上java進程的pid,這樣就能生成 thread mp 了。
具體如下:
1、簡介C語言是一門通用計算機編程語言,應用廣泛。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。盡管C語言提供了許多低級處理的功能,但仍然保持著良好跨平台的特性,以一個標准規格寫出的C語言程序可在許多電腦平台上進行編譯,甚至包含一些嵌入式處理器(單片機或稱MCU)以及超級電腦等作業平台。
2、基本介紹
C語言,是一種通用的、過程式的編程語言,廣泛用於系統與應用軟體的開發。具有高效、靈活、功能豐富、表達力強和較高的移植性等特點,在程序員中備受青睞。最近25年是使用最為廣泛的編程語言。
3、運算
C語言的運算非常靈活,功能十分豐富,運算種類遠多於其它程序設計語言。在表達式方面較其它程序語言更為簡潔,如自加、自減、逗號運算和三目運算使表達式更為簡單,但初學者往往會覺的這種表達式難讀,關鍵原因就是對運算符和運算順序理解不透不全。當多種不同運算組成一個運算表達式,即一個運算式中出現多種運算符時,運算的優先順序和結合規則顯得十分重要。在學習中,對此合理進行分類,找出它們與數學中所學到運算之間的不同點之後,記住這些運算也就不困難了,有些運算符在理解後更會牢記心中,將來用起來得心應手,而有些可暫時放棄不記,等用到時再記不遲。
② 如何查看java虛擬機堆內存的參數值
今天在載入一幅圖片時,eclipse報出如下錯誤:
「Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 」
google了一下原來是圖片太大了。可以設置jvm堆的最大值來解決。
首先, 打開Eclipse軟體,選擇菜單欄run,在二級菜單中選擇 Debug Configurations,然後:在彈出的窗口中選擇(x)=arguments選項卡,VM arguments中輸入所需要的內存最大佔用量,比如輸入-Xmx800m即可。
以下詳細的介紹下jvm的幾個參數:
「MyEclipse has detected that less than 5% of the 64MB of Perm Gen (Non-heap memory) space remains.」意思是說當前只有小於5%的非堆內存是空閑的。所以我們只要將這個值設置大一些就可以了。
提示中給出了設置的參數:
-vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M
這里有幾個問題:
1. 各個參數的含義什麼?
2. 為什麼有的機器我將-Xmx和-XX:MaxPermSize都設置為512M之後Eclipse可以啟動,而有些機器無法啟動?
3. 為何將上面的參數寫入到eclipse.ini文件Eclipse沒有執行對應的設置?
下面我們一一進行回答
1. 各個參數的含義什麼?
參數中-vmargs的意思是設置JVM參數,所以後面的其實都是JVM的參數了,我們首先了解一下JVM內存管理的機制,然後再解釋每個參數代表的含義。
堆(Heap)和非堆(Non-heap)內存
按照官方的說法:「Java 虛擬機具有一個堆,堆是運行時數據區域,所有類實例和數組的內存均從此處分配。堆是在 Java 虛擬機啟動時創建的。」「在JVM中堆之外的內存稱為非堆內存(Non-heap memory)」。可以看出JVM主要管理兩種類型的內存:堆和非堆。簡單來說堆就是Java代碼可及的內存,是留給開發人員使用的;非堆就是JVM留給自己用的,所以方法區、JVM內部處理或優化所需的內存(如JIT編譯後的代碼緩存)、每個類結構(如運行時常數池、欄位和方法數據)以及方法和構造方法的代碼都在非堆內存中。
堆內存分配
JVM初始分配的內存由-Xms指定,默認是物理內存的1/64;JVM最大分配的內存由-Xmx指定,默認是物理內存的1/4。默認空餘堆內存小於40%時,JVM就會增大堆直到-Xmx的最大限制;空餘堆內存大於70% 時,JVM會減少堆直到-Xms的最小限制。因此伺服器一般設置-Xms、-Xmx相等以避免在每次GC 後調整堆的大小。
非堆內存分配
JVM使用-XX:PermSize設置非堆內存初始值,默認是物理內存的1/64;由XX:MaxPermSize設置最大非堆內存的大小,默認是物理內存的1/4。
JVM內存限制(最大值)
首先JVM內存限制於實際的最大物理內存(廢話!呵呵),假設物理內存無限大的話,JVM內存的最大值跟操作系統有很大的關系。簡單的說就32位處理器雖然可控內存空間有4GB,但是具體的操作系統會給一個限制,這個限制一般是2GB-3GB(一般來說Windows系統下為1.5G-2G,Linux系統下為2G-3G),而64bit以上的處理器就不會有限制了。
2. 為什麼有的機器我將-Xmx和-XX:MaxPermSize都設置為512M之後Eclipse可以啟動,而有些機器無法啟動?
通過上面對JVM內存管理的介紹我們已經了解到JVM內存包含兩種:堆內存和非堆內存,另外JVM最大內存首先取決於實際的物理內存和操作系統。所以說設置VM參數導致程序無法啟動主要有以下幾種原因:
1) 參數中-Xms的值大於-Xmx,或者-XX:PermSize的值大於-XX:MaxPermSize;
2) -Xmx的值和-XX:MaxPermSize的總和超過了JVM內存的最大限制,比如當前操作系統最大內存限制,或者實際的物理內存等等。說到實際物理內存這里需要說明一點的是,如果你的內存是1024MB,但實際系統中用到的並不可能是1024MB,因為有一部分被硬體佔用了。
3. 為何將上面的參數寫入到eclipse.ini文件Eclipse沒有執行對應的設置?
那為什麼同樣的參數在快捷方式或者命令行中有效而在eclipse.ini文件中是無效的呢?這是因為我們沒有遵守eclipse.ini文件的設置規則:
參數形如「項 值」這種形式,中間有空格的需要換行書寫,如果值中有空格的需要用雙引號包括起來。比如我們使用-vm C:\Java\jre1.6.0\bin\javaw.exe參數設置虛擬機,在eclipse.ini文件中要寫成這樣:
-vm
C:\Java\jre1.6.0\bin\javaw.exe
按照上面所說的,最後參數在eclipse.ini中可以寫成這個樣子:
-vmargs
-Xms128M
-Xmx512M
-XX:PermSize=64M
-XX:MaxPermSize=128M
實際運行的結果可以通過Eclipse中「Help」-「About Eclipse SDK」窗口裡面的「Configuration Details」按鈕進行查看。
另外需要說明的是,Eclipse壓縮包中自帶的eclipse.ini文件內容是這樣的:
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
-vmargs
-Xms40m
-Xmx256m
其中–launcher.XXMaxPermSize(注意最前面是兩個連接線)跟-XX:MaxPermSize參數的含義基本是一樣的,我覺得唯一的區別就是前者是eclipse.exe啟動的時候設置的參數,而後者是eclipse所使用的JVM中的參數。其實二者設置一個就可以了,所以這里可以把–launcher.XXMaxPermSize和下一行使用#注釋掉。
③ linux系統怎麼對JAVA應用程序進行性能分析
1. top命令:可以查看實時的CPU使用情況。
2. ps -ef命令:可以查看雹凳纖進程以及進程中線程的當前CPU使用情況以及屬於當前狀態的采樣數據。
3. jstack:Java提供的命令。可以查看某個進程的當前線程棧運行情況。根據這個命令的輸出可以定位某個進程的所有線程的當前運行狀態、運行代碼,以及是否死鎖等等粗寬。
4. pstack:Linux命令。可以查看某個進程的當前線程棧運行情況
1.top命令:可以查看實時的內存使用情況。
2.jmap -histo:live [pid],然後分析具體的對象源仿數目和佔用內存大小,從而定位代碼。
jmap -mp:live,format=b,file=xxx.xxx [pid],然後利用MAT工具分析是否存在內存泄漏等等。
④ 如何用linux命令查詢java進程
使用ps命令就可以了,格式如下:
ps -A | grep java
解釋一下這個命令的意思,ps 是查看系統當前進程的命令,參數 -A(注意,是大寫,linux中是區分大小寫的)是顯示所有程序, | 這個是管道符,用來把前面的命令結果交給後面做篩選的,grep java就是通過grep篩選命令篩選出包含java的程序。
⑤ Linux下如何定位JAVA進程直接內存的泄漏及top和jmap查看內存的關系
問題1:top的RES值和JAVA堆內存之間到底是一個什麼關系?
——大概1、2個月有個帖子討論過,挺長的,不過一下子找不到了;總的來說,兩者很難找到非常精確匹配的計算關系,因為兩者統計的口徑是不同的;操作系統關心的是被應用程序所佔用的,而JVM則只是關心堆中被分配出去的;這裡面有JVM自己開銷的、有碎片內存無法使用的、還有已使用完畢待回收的 等等問題。
——總的來說,我覺得如果不是為了底層開發之類的問題,不值得在此問題進行深入研究。
問題2:橋賣如何定位JAVA進程直接內存的泄檔答漏?
——很遺憾,並沒有什麼招數來直接定位,否則內存泄露就不會是一個讓大家聞風喪膽的問題了;各類工具都只行消慧是提供給你一定的手段去發現徵兆、縮小懷疑范圍,沒有說直接幫你定位,那聽起來就不是IT而是神話了。
——常規招數就是:范圍 與 層次,兩個方向不斷通過測試和監控來縮小 懷疑范圍,從而最終定位內存泄漏點。
⑥ 如何看linux下tomcat內存使用情況
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
export JAVA_HOME=/usr/java/jdk1.6.0_13
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin
export LANG=en_US.UTF-8
ram_max=25
pid_ram=`ps -ef | grep java| grep -v "grep"|awk '{print $2}'|xargs|awk '{print $1}'`
ram=`ps -e -o 'user,pid,%cpu,%mem,vsz,rss,tty,stat,start,time,command' |grep java|grep -v grep |awk '{print $4}'|xargs|awk '{print $1}'`
#echo $pid_ram
#echo $ram
#echo $ram_max
if(echo $ram $ram_max | awk '!($1>$2){exit 1}')
then
#echo 1
kill -9 $pid_ram
sleep 2
cd /usr/java/tomcat5.5/bin
./startup.sh
fi
關於基礎和伺服器的服務可以網路《Linux就該這樣學》官網的技術幹活裡面有Linuxs中安裝Oracle11g安裝過程講解,希望可以幫到你