java內存分析工具
1. 伺服器java虛擬機運行內存分析
總體來說也是正常的,內存總是有一個使用,回收而形成的波峰,波谷。而關於code cache這塊,jvm現在是使用時載入,故而初始應用啟用時會有一個較大的增長,隨後會較平穩。
另外你當前項目內存使用比較小,隨便使用-Xms 100m -Xmx100m調大到100M就可以解決大部分的問題。
如果你是想知道jconsole的各項說明要參考oracle的官方說明,那一個是比較清楚的。
如果你想知道的是如何分析內存使用,那就建議搜索下java gc log這個選項,使用HP jmeter這樣的專業工具分析gc日誌。
2. 常見的java堆存儲文件分析工具有哪些及其特點
使用Windows操作系統的人有時會遇到這樣的錯誤信息:「0X?指令引用的0x本文就來簡單分析這種錯誤的常見原因。 一、應用程序沒有檢查內存分配失敗
3. 怎麼查看java代碼是否內存泄露
第一階段 通過jdk的GC輸出進行測試
可以在 JAVA_OPTS增加以下參數打開jdk的GC輸出日誌:
-verbose:gc -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError
打開輸出日誌,jdk會在每一次的垃圾回收時列印相關日誌
第二階段 通過jmap命令
jmap命令可以獲得運行中的jvm的堆的快照,從而可以離線分析堆,以檢查內存泄漏,檢查一些嚴重影響性能的大對象的創建,檢查系統中什麼對象最多,各種對象所佔內存的大小等等
第三階段 通過Eclipse Memory Analyzer 分析工具來分析
Eclipse Memory Analyzer是一種快速的,功能豐富的Java堆分析工具,以下簡稱MAT,可以幫助查找內存泄露,並減少內存消耗。 這個工具可以對由堆轉儲產生的數以億計的對象進行分析,一旦堆轉儲被解析,可以在打開他的一瞬間,立即得到保留大小的單一對象,提取記錄詳細的信息,查看為什麼這些對象對象資料沒有被釋放掉。使用這些功能的報告,可以對這些對象進行跟蹤,找到內存泄露嫌疑人,也可以得到系統的性能指數,幫助優化系統。
4. 關於Java的內存佔用,有什麼詳細的分析方法或工具
可以查看gc日誌發現程序內存問題。
5. 怎樣查看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)時將會在很大程度上降低系統的性能。因此在設置這個值時應該格外小心,調整後要注意觀察系統的性能,不斷調整以期達到最優
最後說一句,你的機器的連接數設置也至關重要,連接的關閉最好把時間設置的少些,那些連接非常耗費資源。也是引起內存泄露的主要原因。
6. 如何分析java.lang.outofmemoryerror
Java.lang.OutOfMemoryError是java.lang.VirtualMachineError的子類。在堆耗盡內存的時候,jvm會拋出Java.lang.OutOfMemoryError。這個錯誤大多數出現在當你去創建一個對象,但是在堆中卻不能為這個對象分配足夠多空間的時候。而且在java
api文檔中,並沒有對這個錯誤做大量的解釋。
OutOfMemoryError的類型
在java中有兩種主要的OutOfMemoryError類型:
(1) Java.lang.OutOfMemoryError: Java heap space
(2) Java.lang.OutOfMemoryError: PermGen space
盡管它們都發生在內存耗盡的情況下,但它們之間是相當不同的,它們的解決辦法也是各不一樣。
兩種OutOfMemoryError之間的區別
如果你熟悉堆的歷代版本和垃圾收集器的工作原理,並且知道到新的,老的和永久的堆空間,那麼你將會非常容易解決OutOfMemoryError錯誤。永久的堆空間用於存儲jvm相關類,方法和其他實體的字元串池和各種元數據。因為大多數jvm默認的Perm
Space(永久的堆空間)的大小是64M左右,所以如果你的工程里有太多的類或者數量巨大的字元串的話,那麼很容易就會耗盡內存。需要指出的一點是它並不依賴」
Xmx」(譯者注:
-Xms 指JVM初始分配的堆內存,-Xmx 指 JVM最大允許分配的堆內存)的值,所以不管你的堆空間多麼大,一樣會耗盡Perm
Space。好的辦法是你可以根據工程的需要通過JVM的選項指定永久堆空間的大小,即"-XX:PermSize" and
"-XX:MaxPermSize"。
一個很小的事情是要記得在指定堆的Perm Space(永久的堆空間)的大小的時候需要用」=」來分離參數名稱和值,但在指定堆得最大值的時候是不需要「=」的,正如下面的例子一樣:
Export JVM_ARGS="-Xmx1024m -XX:MaxPermSize=256m"
"java.lang.OutOfMemoryError:
PermGen"的另一個原因是類載入器造成的內存泄漏,它經常出現在web伺服器和應用伺服器中,例如tomcat, webshere,
glassfish or
weblogic。在應用伺服器中,不同的類載入器用於載入不同的web應用,以便在相同的伺服器上部署和取消部署一個應用而且不會影響其他的應用程序。但是當取消部署的時候,如果容器持有類載入器已經載入的類的引用,那麼這個類和相關的類就不會被垃圾回收器回收。如果你部署和取消部署你的應用很多次,那麼很快PermGen
space就會被填滿。"java.lang.OutOfMemoryError:
PermGen」在我們的上一個項目中的tomcat里已經被發現多次,但是這個問題的解決辦法實在是令人捉摸不透。因為你首先知道哪個類引起了內存泄露,然後你才能修正它。這個問題的另一個原因是應用啟動了一些線程,但是當取消部署的時候,這些線程並沒有退出。
這只是一些臭名昭著的類載入器造成內存泄露的例子,任何人在編寫載入類和取消載入類的代碼的時候都要非常小心以避免這些問題。你也可以使用visualgc
監測PermGen space,這個工具會展示PermGen space的使用情況圖表,你可以看到PermGen
space是怎樣並且何時增長的。我建議在得出任何結論之前先使用這個工具。
關於"java.lang.OutOfMemoryError:
PermGen"的原因,我們發現另一個更加無知但有趣的是對於 JVM 的參數
"-Xnoclassgc"的介紹。這個選項用於避免載入和取消載入一些已經沒有被引用的類,這樣可以避免因為頻繁的載入和取消載入而影響性能。但是在J2EE環境中使用這個選項是很危險的,因為許多框架,例如struts,spring等使用反射機制去創建類,並且會頻繁的部署和取消部署,如果上一個引用沒有被清除,那麼很快PermGen
space就會被耗盡。這個例子也說明一些時候錯誤的JVM參數或配置也會引起OutOfMemoryError錯誤。
所以結論是不要在J2EE環境中使用"-Xnoclassgc",尤其是在應用伺服器上。
Tomcat解決Java.lang.OutOfMemoryError: PermGen space錯誤的辦法
對於tomcat6.0及其以上版本,提供了內存泄漏偵測的能力。它可以通過web應用視圖展示一些偵測到的平常的內存泄漏問題,例如web應用中的ThreadLocal內存泄漏,JDBC驅動注冊,RMI
,LogFactory和線程等。你可以在htp://wiki.apache.org/tomcat/MemoryLeakProtection
查看具體的細節,也可以通過tomcat提供的管理程序偵測內存泄漏。你如果想在web應用程序上檢驗內存泄漏問題,使用tomcat是個不錯的主意。
如何解決java.lang.OutOfMemoryError: Java heap space
1)
解決OutOfMemoryError的簡單方法是通過指定JVM參數"-Xmx512M"來指定最大的堆空間,這種方法效果立竿見影。當我使用eclipse,maven,ant編譯工程遇到OutOfMemoryError的時候,我更喜歡使用這種辦法。這里有一個增加JVM堆空間的例子,建議為你的程序增加堆空間的時候最好保持-Xmx
相比-Xms 是1:1或者1:1.5的比例。
例: export JVM_ARGS="-Xms1024m -Xmx1024m"
2)
第二種解決辦法是很困難的,當你擁有的內存並不多或者在你增加了堆內存但是你依然會遇到OutOfMemoryError錯誤時,這種情況下你可能想要去分析你的應用程序並且尋找內存泄漏的原因。你可以使用Eclipse
Memory Analyzer來檢查heap mp,或者可以使用Netbeans,
Jprobe等這些分析工具。這種方法比較困難,需要花費大量時間去分析找出內存泄漏的原因。
如何解決java.lang.OutOfMemoryError: PermGen space
正如前面講到的一樣,java.lang.OutOfMemoryError: PermGen
space發生在永久堆內存耗盡的情況下。要修正這個情況,需要通過JVM選項 "-XX:MaxPermSize"來增加Perm
space的最大大小,也可以通過"-XX:PermSize"指定Perm space的初始大小。同時設置這兩個值,可以避免在Perm
Space重置大小的時候發生完全的垃圾回收。下面是設置初始化和最大值的例子:
export JVM_ARGS="-XX:PermSize=64M -XX:MaxPermSize=256m"
有時候java.lang.OutOfMemoryError是莫名其妙的,這種情況下分析是最終的解決辦法。盡管你有增加堆內存的空間的自由,但還是建議遵循內存管理實踐,在編碼的時候將沒用的引用設置為null。以上我對OutOfMemoryError的全部理解,我也在其他的一些帖子中努力寫出java關於查找內存泄漏的文章和使用分析器的方法。希望你也能分享解決OutOfMemoryError的觀點。
注意:
對於tomcat6.0及其以上版本,提供了內存泄漏偵測的能力。它可以通過web應用視圖展示一些偵測到的平常的內存泄漏問題,例如web應用中的ThreadLocal內存泄漏,JDBC驅動注冊,RMI
,LogFactory和線程等。你可以在htp://wiki.apache.org/tomcat/MemoryLeakProtection
查看具體的細節,也可以通過tomcat提供的管理程序偵測內存泄漏。你如果想在web應用程序上檢驗內存泄漏問題並且找到PermGen
space造成的OutOfMemoryError的原因,使用tomcat是個不錯的主意。
調查修正OutOfMemoryError的工具
Java.lang.OutOfMemoryError是一種你需要做大量的調查才能找到根本原因的錯誤。沒有對內存工具的足夠了解,你不可能做某些事情,例如查找哪個對象在佔用內存,佔用了多少內存,以及找到可怕的內存泄漏等等。這里我列出一些免費的工具可以幫助你分析堆的使用情況,以及造成OutOfMemoryError的罪魁禍首。
1)Visualgc
Visualgc代表Visual
Garbage Collection Monitoring Tool 。你可以將它用於你的hostspot
JVM。Visualgc最大的優勢是能生動展現出各種關鍵數據,包括類載入器,垃圾回收和JVM編譯器性能數據。
JVM被識別是通過虛擬機的標識符,稱為: vmid。你可以在這了解更多關於visualgc和vmid的東西。
2)Jmap
Jmap是來自JDK6的命令行工具,它允許你將堆的內存轉儲信息保存到文件中。而且很方便使用,如:jmap -mp:format=b,file=heapmp 6054
這里指定的內存轉儲的文件名稱是heapmp,6054是java進程的PID。你可以通過"ps -ef」或者windows任務管理器或者「jps」工具(Java Virtual Machine Process Status Tool)查找PID.
3) Jhat
Jhat之前被稱為hat (heap analyzer tool),現在它是JDK6的一部分,你可
以使用Jhat去分析"jmap"生成的文件。Jhat也是一個命令行工具,你可以在windows命令行這樣使用它,如: jhat -J-Xmx256m heapmp
這里它會分析「heapmp」文件中的內存問題。當你啟動Jhat後,它就會讀取內存轉儲文件,並且在http埠監聽。只需要通過瀏覽器進入埠,你就可以開始分析內存轉儲文件中的對象。Jhat默認監聽7000埠。
4)Eclipse memory analyzer
Eclipse memory analyzer
(MAT)是來自eclipse基金會的一個分析java堆內存的工具。它能幫助你找到類載入器的泄漏,內存泄漏和減少內存消耗。你可以使用MAT分析內存轉儲中數以百萬計的對象,也可以幫助你提取懷疑的內存泄漏。
7. Java開發工具主要有哪些
一 看書已經是一種落後的學習方式
我上大學的時候學習Java,也是通過看書的方式學習的,當時學的很費勁,只有死板的文字,整了一本厚厚的書,啃了將近一年,也是迷迷瞪瞪的,有長進,但不是太大。在書里涉及到一些實際操作的步驟的時候,通過軟體表現,中間會遇到很多書里沒說的問題,讓人只能糾結。
二 與其看死板的書,不如看網上直播Java課程
現在我是一件公司的Java技術總監,技術實力那是一級棒的。在大學里,看了兩三年的書,沒什麼長進,差點放棄了Java,但是放棄的話總覺的太可惜了,只能回鍋在學習一些,但是當時面臨的問題是什麼呢,白天要工作,要創造利潤生活啊,又不好意思跟家裡要錢,所以導致我沒時間去提升自己的技術實力,只能每天混日子。後來我一個朋友讓我在網上看Java直播課程,每天晚上都是高手分享的,可以現場互動,我抱著試試看看的態度,在網上聽了幾天,都是晚上講課,也不耽誤我白天工作,讓我欣喜的是,當在直播中看著老師的實戰操作以及老師透徹的講解,讓我有一直茅塞頓開的感覺,很多困擾我很多年的問題,都解開了,原來看直播的學習效率,直接秒殺看書啊。當然好東西,要給大家一塊分享,如果你想提升自己的Java實力,晚上有時間也可以來聽聽的,在這個群里,開頭的前面幾位是:557,然後在中間的一組是:101,位於最後位置的是:916,按照前後的順序組合起來就ok了。
三 Java程序員新手老手都離不開八大開發工具
現在有很多庫、實用工具和程序任Java開發人員選擇。每個工具都有其優點,但其中有一些因它的知名度、多功能和有效力從眾多選項中脫穎而出。
以下這8個工具,從代碼構建到錯誤擠壓,覆蓋Java開發的全域。學習這些工具可以幫助你改善代碼質量,成為一個更高效的Java開發人員。
1.Eclipse
盡管IntelliJ IDEA、NetBeans和一些其他的IDE正在日益普及,但是有調查表明,Eclipse仍然是幾乎半數Java開發人員首選的開發環境。 Eclipse是IDE領域的瑞士軍刀,有著大量定製的介面和無數的插件。它無處不在,後面本文將推薦的其他所有工具都提供Eclipse插件。
Eclipse的工作流程可分為三個方面:工作台,工作空間和視角。工作台作為到IDE的出發點。工作空間將項目、文件和配置設置組合在一個單獨的 目錄下。視角定義工具、視圖和有效設置。雖然新手開發人員可能會覺得相比Netbeans和IntelliJ IDEA,Eclipse使用起來更難,但Eclipse的靈活,使其成為企業開發的首選IDE。
Luna,Eclipse的最新版本,支持Java 8、分屏編輯、新的黑色主題,以及一個功能齊全的命令行終端。
2.Gradle
Gradle是一個自動化項目工具,建立在Apache Maven和Apache Ant的功能上。雖然Gradle並不是非常流行的構建工具(超流行的是Maven,64%的Java開發人員會選擇它),但它的普及速度很快。它也可作為默認的Android構建工具。
Gradle引以為傲的是它的簡單。Gradle使用Groovy編程語言,與Maven和Ant使用XML語法截然相反。一個基本的Gradle構建文件由一行簡單的代碼組成:
3.Javadoc
Javadoc是Oracle提供的文檔生成器。它可以將特殊格式的注釋解析為HTML文檔。以下截圖就是Javadoc生成的Java SE 8 API規范:
Javadoc注釋使用開放標簽、關閉標簽,以及一個或多個描述性標簽的格式。開放式標簽類似於標准Java多行注釋標記,使用兩個星號的除外。Javadoc也解析普通的HTML標簽。
Javadoc自動格式化標簽和關鍵字,除非另有規定。Javadoc廣泛使用超鏈接,允許你參考和鏈接到代碼的不同區域。許多IDE——包括 Eclipse——可以自動添加Javadoc注釋模塊到變數、類和方法中。支持Maven、Gradle和Ant的插件在編譯代碼的同時也可以構建 Javadoc HTML。
4.JUnit
JUnit是用於編寫和運行單元測試的開源框架。一個基本的JUnit測試包括測試類、測試方法、以及執行測試的功能。 JUnit使用標注來確定測試如何構造和運行。例如,如果你的程序有一個類叫做MathClass,具有乘法和除法的方法,你可以創建JUnit測試來檢 查不符合預期的值。輸入數字2和5到乘法方法,你希望得到的結果為10。當輸入0作為除法方法的第二個參數時,你會期望給出一個數字計算異常的警告因為除 數不能為0:
@Test標注規定,MathClass方法是一個測試用例。 在JUnit提供額外的標注,比如@Before,這樣你就可以在測試運行之前設置環境。 JUnit還可以設置規則用於定義測試方法的行為。例如,TemporaryFolder規則使得一旦測試完成,由測試創建的文件或文件夾就會被刪除。
5.Cobertura
Cobertura可用於分析Java代碼的測試覆蓋率。Cobertura根據沒有被測試覆蓋的代碼生成基於HTML的報告。
Cobertura提供可用於插裝、檢查和測試代碼的工具。通過監控可測試的代碼,Cobertura允許你使用你選擇的測試框架,甚至不需要測試框架就可以運行程序。
Cobertura根據行、分支和程序包三個方面給出代碼覆蓋報告。每個類別都有一個可自定義的閾值,如果覆蓋面低於閾值,就會觸發警告。Cobertura還集成了Maven和Gradle的自動檢測功能。
6.FindBugs
FindBugs是一個匹配編譯代碼模式,而非使用bug資料庫的工具。當提供源代碼時,FindBugs還可高亮顯示檢測出bug的代碼行。
在它的3.0.1版本中,FindBugs繼續保持著數以百計的bug描述。根據bug的嚴重程度,FindBugs將bug分為四個水平:相關 的,令人困擾的,可怕的,以及最可怕的。除了圖形用戶界面,FindBugs還提供一個命令行界面,Ant任務,以及Eclipse插件。
7.VisualVM
包含在JDK中的VisualVM是監控和審查Java應用程序性能的工具。 VisualVM檢測並重視活躍的JVM實例來檢索有關進程的診斷信息。
VisualVM可以很容易地實時診斷性能問題。它提供了全套的分析工具,包括JConsole、jstack、jmap、jinfo和jstat等。此外,你還可以對JVM做一個快照,這樣以後在任何時都能審查。
8.Groovy
Groovy是一種編程語言,通過添加新的關鍵字,自動導入常用的類,以及可選類型變數聲明,既簡化又擴展了Java。
Groovy的核心優勢之一是它的腳本功能。類可以被編譯為Java位元組碼或使用Groovy Shell動態執行。Groovy的Java基礎使得它相較於Jython和JRuby更容易為Java開發人員所接受
三優秀Java程序員,應該養成哪些習慣
當我們評價一個程序員是否優秀時,要從多個方面進行評估。 專業技能、專業知識、創造力、經驗,這些都是重要的因素。當然,還有他們的工作態度、工作效率和工作質量。如果程序員的工作是沒有效率的,那就意味著他們所投入的時間和精力是沒有效果的。最近看到一篇博文中,他們總結了10個影響程序員工作效率的壞習慣。看完這篇文章後你會發現,裡面所列舉的壞習慣,總有一兩個可以在自己的身上找得到。從中你也可以學習到那些優秀的程序員是如何提高工作效率的。
1.專注於一個工作而不是同時處理多個任務同一時間處理多個工作任務,我們對這種情況並不陌生。有時候是迫不得已,但有時候也是個人的習慣造成的。「同一時間處理多個任務」看起來不錯,給人感覺你的工作出色,但實際上,由於要不斷轉換工作內容,它會影響了你的專注力和創造力。對於程序員來說,專注於某一個開發工作是很重要的。如果要同時處理幾個任務,你不得不為此消耗精力,這樣一來工作效率就會降低了。解決的方法是做好工作安排,把相似的工作放在一起,專心做好一個工作直到它完成了為止,再去做下一個工作。
2.建立一個有條理的工作系統程序員給很多人的感覺是有點神經質的,就是那種專注起來令人傾心,糊塗起來讓人抓狂的那種。他們可以投入到開發環境中不眠不休,但有很多人也會在工作中出現各種馬虎,健忘和凌亂的狀況。工作沒有條理可以直接影響工作效率。其實這個毛病是可以改掉的,從辦公桌上物件的擺放,到建立工作計劃,一步一步地作好安排,制定一個井井有條的工作系統可以有助提高工作效率。你可以在livecoding上看一下其他程序員的直播,不僅可以發現一些有趣的項目,還可以留意一下人家是如何把每一件事情都處理得有條不紊的。優秀的程序員也許在生活中會有各種丟三拉四的表現,但一旦投入到工作中時,他們會變得非常專注和注重條理。
8. java有哪些性能分析工具 能分析具體jar包
利用以下工具都可以實現對xml 文件的解析 ,dom4j, jdom, SAX,DOM 如果是在java程序中解析xml文件,主要使用dom4j和jdom,dom4j用的比較多,諸多MVC框架及orm框架都是使用dom4j來解析xml文件的。 dom 方式則和語言無關的xml文件操作的國際標准。
9. Java內存泄露檢測工具
1、Java的內存管理就是對象的分配和釋放問題。 在Java中,程序員需要通過關鍵字new為每個對象申請內存空間 (基本類型除外),所有的對象都在堆 (Heap)中分配空間。 對象的釋放是由GC決定和執行的。 在Java中,內存的分配是由程序完成的,而內存的釋放是有GC完成的,這種收支兩條線的方法簡化了程序員的工作。但也加重了JVM的工作。這也是Java程序運行速度較慢的原因之一。 GC釋放空間方法: 監控每一個對象的運行狀態,包括對象的申請、引用、被引用、賦值等。當該對象不再被引用時,釋放對象。 2、內存管理結構 Java使用有向圖的方式進行內存管理,對於程序的每一個時刻,我們都有一個有向圖表示JVM的內存分配情況。 將對象考慮為有向圖的頂點,將引用關系考慮為圖的有向邊,有向邊從引用者指向被引對象。另外,每個線程對象可以作為一個圖的起始頂點,例如大多程序從main進程開始執行,那麼該圖就是以main進程頂點開始的一棵根樹。在這個有向圖中,根頂點可達的對象都是有效對象,GC將不回收這些對象。如果某個對象 (連通子圖)與這個根頂點不可達(注意,該圖為有向圖),那麼我們認為這個(這些)對象不再被引用,可以被GC回收。 3、使用有向圖方式管理內存的優缺點 Java使用有向圖的方式進行內存管理,可以消除引用循環的問題,例如有三個對象,相互引用,只要它們和根進程不可達的,那麼GC也是可以回收它們的。 這種方式的優點是管理內存的精度很高,但是效率較低。++:另外一種常用的內存管理技術是使用計數器,例如COM模型採用計數器方式管理構件,它與有向圖相比,精度行低(很難處理循環引用的問題),但執行效率很高。★ Java的內存泄露 Java雖然由GC來回收內存,但也是存在泄露問題的,只是比C++小一點。 1、與C++的比較 c++所有對象的分配和回收都需要由用戶來管理。即需要管理點,也需要管理邊。若存在不可達的點,無法在回收分配給那個點的內存,導致內存泄露。存在無用的對象引用,自然也會導致內存泄露。 Java由GC來管理內存回收,GC將回收不可達的對象佔用的內存空間。所以,Java需要考慮的內存泄露問題主要是那些被引用但無用的對象——即指要管理邊就可以。被引用但無用的對象,程序引用了該對象,但後續不會再使用它。它佔用的內存空間就浪費了。 如果存在對象的引用,這個對象就被定義為「活動的」,同時不會被釋放。 2、Java內存泄露處理 處理Java的內存泄露問題:確認該對象不再會被使用。 典型的做法—— 把對象數據成員設為null 從集合中移除該對象 注意,當局部變數不需要時,不需明顯的設為null,因為一個方法執行完畢時,這些引用會自動被清理。例子:List myList=new ArrayList();for (int i=1;i<100; i++)//此時,所有的Object對象都沒有被釋放,因為變數myList引用這些對象。 當myList後來不再用到,將之設為null,釋放所有它引用的對象。之後GC便會回收這些對象佔用的內存。★ 對GC操作 對GC的操作並不一定能達到管理內存的效果。 GC對於程序員來說基本是透明的,不可見的。我們只有幾個函數可以訪問GC,例如運行GC的函數System.gc(),System.。 但是根據Java語言規范定義, System.gc()函數不保證JVM的垃圾收集器一定會執行。因為,不同的JVM實現者可能使用不同的演算法管理GC。通常,GC的線程的優先順序別較低。 JVM調用GC的策略有很多種,有的是內存使用到達一定程度時,GC才開始工作,也有定時執行的,有的是平緩執行GC,有的是中斷式執行GC。但通常來說,我們不需要關心這些。★
10. java內存檢測工具JProfiler8.0和eclipse memory analyzer不能用。
雖然我具體的軟體沒有弄過但大體的思路知道,就當拋磚引玉了。
你的問題是heap OOM.一般會生成hprof的堆文件,你現在已經有了。
分析的時候不用考慮集成eclipse啊。很多工具比如jprofiler,JAVA自帶的jvisualvm.exe直接就可以分析。你要找的軟體就是分析JVM堆的軟體就可以,如果比較大,可能需要調下初始參數-Xms -Xmx
使用軟體打開後,主要去找那些佔用空間非常大的,分析內存泄露的可能。而一種可能就是內存真的不夠用了,你則可以使用jmeter等來分析。