自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

JDK中還藏著一個(gè)寶貝 它的名字叫做VisualVM

原創(chuàng)
開發(fā) 后端
JDK中還藏著一個(gè)寶貝,它的名字叫做VisualVM。VisualVM是Sun的一個(gè)OpenJDK項(xiàng)目,其目的在于為Java應(yīng)用創(chuàng)建一個(gè)整套的問題解決工具??梢哉fVisualVM是Java開發(fā)者最為重要的工具,但同時(shí)這也是最不為人知的秘密。

【51CTO獨(dú)家譯稿】令人意想不到的寶貝,其實(shí)往往已經(jīng)早就在你眼前,只不過你沒發(fā)現(xiàn)它。VisualVM就是這樣的。每當(dāng)我們升級(jí)JDK、打開IDE時(shí),其實(shí)我們就用上了它所帶來的新特性。至少,我自己是這樣認(rèn)為的。

我第一次獲知VisualVM是在去年二月份Geertjan Wielenga所寫的一篇文章里,那時(shí)它的第三版都已經(jīng)發(fā)布了??梢哉fVisualVM是Java開發(fā)者最為重要的工具,但同時(shí)這也是最不為人知的秘密。在Java的運(yùn)行效率仍然是個(gè)問題的情況下,正是它有效的解決了這個(gè)問題。(有關(guān)VisualVM的簡(jiǎn)介,可參考51CTO之前發(fā)布的Sun VisualVM項(xiàng)目 開源Java問題解決方案一文)

VisualVM簡(jiǎn)介

簡(jiǎn)單說來,VisualVM是一種集成了多個(gè)JDK命令行工具的可視化工具,它能為您提供強(qiáng)大的分析能力。所有這些都是免費(fèi)的!它囊括的命令行工具包括jstat, JConsole, jstack, jmap 和 jinfo,這些工具與JDK的標(biāo)準(zhǔn)版本是一致的。

你可以使用VisualVM生成和分析海量數(shù)據(jù)、跟蹤內(nèi)存泄漏、監(jiān)控垃圾回收器、執(zhí)行內(nèi)存和CPU分析,同時(shí)它還支持在MBeans上進(jìn)行瀏覽和操作。盡管VisualVM自身要在JDK6這個(gè)版本上運(yùn)行,但是JDK1.4以上版本的程序它都能監(jiān)控。

對(duì)于我來說,這些功能都是至關(guān)重要的。以前我一直在使用如YourKit這樣的一些付費(fèi)軟件來檢測(cè)我的應(yīng)用軟件,但現(xiàn)在我可以用VisualVM這樣一個(gè)開源工具來實(shí)現(xiàn)同樣的功能。更何況,有誰比能Sun公司更了解JVM呢?

如何獲取VisualVM

VisualVM的一個(gè)最大好處就是,它已經(jīng)在你的JDK bin目錄里了,只要你使用的是JDK1.6 Update7之后的版本。點(diǎn)擊一下jvisualvm.exe圖標(biāo)它就可以運(yùn)行了。

你所需要做的只是點(diǎn)一下jvisualvm.exe,就能啟動(dòng)它。運(yùn)行中的所有Java應(yīng)用程序?qū)@示在右邊的導(dǎo)航欄。你會(huì)發(fā)現(xiàn)根本不需要在VisualVM 里親自為你的應(yīng)用程序注冊(cè),因?yàn)樗鼈內(nèi)紩?huì)自動(dòng)顯示出來。你甚至還可以在導(dǎo)航欄里查看到遠(yuǎn)程的應(yīng)用程序。

顯示為“未知進(jìn)程”(pid為5392)的程序是Eclipse 
顯示為“未知進(jìn)程”(pid為5392)的程序是Eclipse

使用VisualVM

VisualVM有很多令人眼前一亮的功能,它能使你:

◆監(jiān)控應(yīng)用程序的性能和內(nèi)存占用情況

◆監(jiān)控應(yīng)用程序的線程

◆分析(Profile)應(yīng)用程序性能和內(nèi)存分配情況

◆進(jìn)行線程轉(zhuǎn)儲(chǔ)(Thread Dump)或堆轉(zhuǎn)儲(chǔ)(Heap Dump)

◆分析核心轉(zhuǎn)儲(chǔ)(Core Dump)

◆保存快照以便脫機(jī)分析應(yīng)用程序。 

用VisualVM評(píng)估IDE

我很想用VisualVM 做點(diǎn)什么,于是我決定,用它來對(duì)目前最先進(jìn)的三個(gè)IDE進(jìn)行評(píng)測(cè)。為此我特意新安裝了 NetBeans 6.5.1 (JavaSE only version) , Eclipse (for Java Developers) 和 IntelliJ IDEA (8.1.2).

測(cè)試如下:

◆在VisualVM 中運(yùn)行內(nèi)存分析器(Memory Profiler)

◆在IDE中創(chuàng)建一個(gè)新的項(xiàng)目

◆創(chuàng)建一個(gè)簡(jiǎn)單的類,這個(gè)類只有一個(gè)可以打印“Hello World"的main方法

◆保存內(nèi)存分析結(jié)果

◆生成這個(gè)應(yīng)用程序的堆轉(zhuǎn)儲(chǔ)(Heap Dump)

◆從VisualVM 的監(jiān)視視圖(Monitor View)里獲取信息

◆重新啟動(dòng)IDE,使用CPU分析器(CPU Profiler),在IDE中執(zhí)行相同的步驟

◆保存CPU分析器(CPU Profiler)的結(jié)果

我意識(shí)到,CPU和內(nèi)存評(píng)測(cè)其實(shí)是可以同時(shí)進(jìn)行的,但為了便于下文的解釋,我特意將它們分別進(jìn)行。

我用IntelliJ做測(cè)試時(shí),發(fā)現(xiàn)只有用我自己的JDK才能啟動(dòng)它,而不能用它自帶的。雖然我太不熟悉這個(gè)IDE,但我發(fā)現(xiàn)當(dāng)我用JSDK創(chuàng)建新工程時(shí),它必須解析JDK中的文件。

此外,請(qǐng)注意,這些IDE都是我剛剛才下載的默認(rèn)版本,沒有針對(duì)Java開發(fā)作什么優(yōu)化處理。

#p#

堆轉(zhuǎn)儲(chǔ)

我發(fā)現(xiàn)要對(duì)軟件進(jìn)行全面對(duì)比時(shí),最好的手段是進(jìn)行堆轉(zhuǎn)儲(chǔ)(Heap Dump)。這在程序運(yùn)行時(shí),使用VisualVM可以讓這項(xiàng)工作變得十分太簡(jiǎn)單,你隨時(shí)都可以右鍵單擊那個(gè)程序,然后選擇 Heap Dump 就可以了。

在個(gè)領(lǐng)域我評(píng)測(cè)的兩個(gè)指標(biāo)是:字節(jié)總數(shù)和類(class)的總數(shù)

NetBeans堆轉(zhuǎn)儲(chǔ) 
NetBeans堆轉(zhuǎn)儲(chǔ)

Eclipse堆轉(zhuǎn)儲(chǔ) 
Eclipse堆轉(zhuǎn)儲(chǔ)

IntelliJ IDEA 堆轉(zhuǎn)儲(chǔ) 
IntelliJ IDEA 堆轉(zhuǎn)儲(chǔ)

NetBeans:

◆總的字節(jié)數(shù):31,576,772

◆總的類數(shù):10,583
 
IntelliJ :

◆總的字節(jié)數(shù):76,582,715

◆總的類數(shù):14,368

Eclipse:

◆總的字節(jié)數(shù):62,112,960

◆總的類數(shù):11,428
 
很明顯,NetBeans只用到了Eclipse的一半都不到,IntelliJ則用去了多得多。

而在監(jiān)視視圖(Monitor View)里看著這些程序運(yùn)行特別有意思,在這里我只關(guān)注了線程中的本地類,Eclipse差不多達(dá)到了25K,IntelliJ大概27K,NetBeans則在20K以下。

NetBeans 監(jiān)控視圖 
NetBeans 監(jiān)控視圖

Eclipse監(jiān)控視圖 
Eclipse監(jiān)控視圖

IntelliJ IDEA 監(jiān)控視圖 
IntelliJ IDEA 監(jiān)控視圖

#p#

內(nèi)存和CPU評(píng)測(cè)(Profile)結(jié)果

我注意到,當(dāng)我開始評(píng)測(cè)(profiling)時(shí),類和方法中的指令執(zhí)行總是要讓我等上好一段時(shí)間。尤其是在IDE里,這段時(shí)間不算短,不過還算可以接受吧。

內(nèi)存和CPU評(píng)測(cè)對(duì)這些IDE的意義不是很大。但進(jìn)行這個(gè)分析所帶來的一個(gè)方便之處就是:你很容易就可以找到程序哪個(gè)地方發(fā)生了內(nèi)存泄漏。以下是對(duì)這幾個(gè)IDE的評(píng)測(cè)結(jié)果。

在這些IDE的評(píng)測(cè)結(jié)果中,我們可以看到一些很有趣的幾點(diǎn)。例如,NetBeans中用到了大量了byte[] ,而在Eclipse和IntelliJ中就明顯少得多了。另外我們還可以看到char[]在所有IDE里均被大量使用了。

◆NetBeans:內(nèi)存的19.6%

◆Eclipse:內(nèi)存的31.6%

◆IntelliJ:內(nèi)存的32.7%

NetBeans 內(nèi)存分析視圖 
NetBeans 內(nèi)存分析視圖

Eclipse內(nèi)存分析視圖 
Eclipse內(nèi)存分析視圖

IntelliJ IDEA內(nèi)存分析視圖 
IntelliJ IDEA內(nèi)存分析視圖

通過CPU評(píng)測(cè)我們能看出程序的哪個(gè)地方耗時(shí)最多。在這方面,各個(gè)IDE分別把時(shí)間用在了不同的方法(method)上,這一點(diǎn)有很大的不同:

◆NetBeans大部分時(shí)間花費(fèi)在org.openide.util.RequestProcessor $ Processor.run()- 58.1 %

◆Eclipse的時(shí)間花在java.lang.reflect.Method.invoke()- 約占45.5 %

◆IntelliJ在java.net.SocketInputStream.read()上耗費(fèi)掉了38.7 %的時(shí)間

NetBeans CPU 分析視圖 
NetBeans CPU 分析視圖

EclipseCPU 分析視圖 
EclipseCPU 分析視圖

IntelliJ IDEA CPU 分析視圖 
IntelliJ IDEA CPU 分析視圖

雖然這么一個(gè)橫向?qū)Ρ炔灰欢軌蛘f明什么問題。但能夠看到這些IDE在幕后不同的工作方式,也是一件很有趣的事情。

至此,我不得不認(rèn)為VisualVM 讓這項(xiàng)評(píng)測(cè)變得相當(dāng)?shù)暮?jiǎn)單。我只需要在這些IDE啟動(dòng)之前運(yùn)行VisualVM,它就能自動(dòng)發(fā)現(xiàn)并掛載隨后啟動(dòng)的每個(gè)IDE實(shí)例,然后就可以在VisualVM里作評(píng)測(cè)了。

#p# 

IDE集成

Java開發(fā)人員大多都是被IDE慣壞了的,一旦沒有順手的IDE可用就會(huì)無所適從。不過不用擔(dān)心,當(dāng)前流行的這些IDE都已經(jīng)有了VisualVM插件,這樣你就可以在你最喜歡的IDE里工作了,不用再跟命令行打交道了。

VisualVM在NetBeans里的集成很有意思,它其實(shí)已經(jīng)是NetBeans默認(rèn)的分析器了。在NetBeans中,它作為一個(gè)RCP程序,可以與其它的NetBeans模塊一起進(jìn)行更好地?cái)U(kuò)展。

Eclipse和 IntelliJ IDEA的集成包可以通過點(diǎn)擊這里獲取。MyEclipse 7.5也已經(jīng)集成了VisualVM的插件。作為一個(gè)Eclipse開發(fā)者,我很感興趣這是究竟怎么辦到的,因?yàn)檫@個(gè)工具畢竟是在NetBeans平臺(tái)基礎(chǔ)之上構(gòu)建的。

與Eclipse的集成

首先,你得下載VisualVM Launcher插件,將它解壓到你的Eclipse主目錄里。這樣當(dāng)你打開Run Configurations對(duì)話框時(shí),就會(huì)看到程序啟動(dòng)器選項(xiàng)。默認(rèn)的啟動(dòng)器是可以在偏好(Preferences)設(shè)置里修改的。

在我的設(shè)置里,我選擇當(dāng)使用啟動(dòng)器時(shí)讓VisualVM Launcher運(yùn)行,其它時(shí)候就使用Eclipse默認(rèn)的程序Launcher。你可以針對(duì)你的應(yīng)用、小程序或者是Eclipse項(xiàng)目修改這些設(shè)置。

當(dāng)使用啟動(dòng)器時(shí)讓VisualVM Launcher運(yùn)行 

然后你還得指定你所要采用的VisualVM 可執(zhí)行文件和JDK的路徑。 

指定你所要采用的VisualVM 可執(zhí)行文件和JDK的路徑 

這樣與Eclipse的集成就算完成了,它會(huì)自動(dòng)啟動(dòng)一個(gè)VisualVM ,你就可以用了。以后可能會(huì)有更深度的集成 ,那樣的話說不定我就直接可以在IDE里啟用它去分析程序了。

擴(kuò)展VisualVM

如果上面列舉的這些功能還不能滿足你的需要,那么你還可以編寫自己的VisualVM插件。VisualVM提供了許多的API調(diào)用入口,如下圖所示:

VisualVM提供了許多的API調(diào)用入口 
 
主要的一些調(diào)用入口有:

◆標(biāo)簽擴(kuò)展(Tab extension)。默認(rèn)情況下,VisualVM提供了像“Overview",Monitor,Threads這樣的一些標(biāo)簽。你可以自己定制一些類似的標(biāo)簽。此外,這些標(biāo)簽自身也可以擴(kuò)展,你可以為它們?cè)O(shè)置二級(jí)標(biāo)簽,還可以設(shè)置這些標(biāo)簽是對(duì)所有VisualVM數(shù)據(jù)源都可見,還是只針對(duì)一些特定的數(shù)據(jù)源類型。

◆二級(jí)標(biāo)簽擴(kuò)展(Subtab extension)。在上面所說的這些標(biāo)簽里,你可以插入新的標(biāo)簽,當(dāng)然,這是在標(biāo)簽被設(shè)置為可擴(kuò)展的前提下。可擴(kuò)展的標(biāo)簽有:"Overview"、"Monitor"、"Threads"、"Heap Dump"和"Host"。當(dāng)你插入一個(gè)新的子標(biāo)簽時(shí),你可以指定它與其它子標(biāo)簽的相對(duì)位置關(guān)系。子標(biāo)簽也可以設(shè)置是對(duì)所有VisualVM數(shù)據(jù)源都可見,還是只針對(duì)一些特定的數(shù)據(jù)源類型。

◆菜單擴(kuò)展(Menu extension)。一個(gè)數(shù)據(jù)源以及它的子節(jié)點(diǎn),都可以為它們的上下文菜單添加一個(gè)或若干個(gè)菜單。

◆應(yīng)用類型擴(kuò)展(Application type extension)。在默認(rèn)情況下,除非提供了一個(gè)特定的插件,否則在VisualVM里可見的這些應(yīng)用都是一樣的,它們有著同樣的圖標(biāo)和標(biāo)簽。在定義了一種應(yīng)用類型之后,你可以為這種特定的應(yīng)用再安裝一個(gè)插件,這樣做可以為不同的應(yīng)用具有不同的圖標(biāo)(比較簡(jiǎn)單),也可以提供像繪圖這樣的額外功能。

◆數(shù)據(jù)源的擴(kuò)展(Data source extension)。 “應(yīng)用程序”的數(shù)據(jù)源只是VisualVM可以監(jiān)管的一種數(shù)據(jù)源類型。另一種數(shù)據(jù)源類型是“主機(jī)”數(shù)據(jù)源,它可讓你監(jiān)控和管理本地的和遠(yuǎn)程的主機(jī)。如果VisualVM的默認(rèn)配置不能滿足你的需求,你可以創(chuàng)建新的數(shù)據(jù)源類型讓它監(jiān)管。

在VisualVM的官方網(wǎng)站上,有一個(gè)關(guān)于編寫VisualVM插件的詳細(xì)說明,這份說明淺顯易懂,如果你以前有過在NetBeans或者Eclipse上有過開發(fā)插件的經(jīng)歷,那就更容易上手了。不僅如此,VisualVM的插件中心里已經(jīng)有不少現(xiàn)成的插件可用,只需進(jìn)入“工具”/“插件”就可以看到了。

VisualVM的插件中心 

VisualVM 簡(jiǎn)單易用(相信你已經(jīng)會(huì)用它了),還具備可供擴(kuò)展的平臺(tái),這些都必將使它成為開發(fā)者不可或缺的工具。讓我印象非常深刻的是,它能夠自動(dòng)掛載運(yùn)行中的程序,而不用開發(fā)者去做注冊(cè)工作。在理論上,我們甚至還可以在完善和再次啟動(dòng)Java應(yīng)用程序的時(shí),讓它一直在后臺(tái)運(yùn)行,這實(shí)在是太妙了。

JDK中還藏著一個(gè)寶貝,它的名字叫做VisualVM。趕快去下載運(yùn)行,讓它幫你找出程序中的所有不足吧。

【編輯推薦】

  1. 6月5日外電頭條:探秘Java 7模塊化 類路徑永遠(yuǎn)消失
  2. Java 2008年大事記 由語言到平臺(tái)的轉(zhuǎn)變
  3. 2008年Java開發(fā)工具發(fā)展回顧
  4. 從IDE到JDK 細(xì)看2008年Java發(fā)展之路
  5. Java 7新特性展望 語言本身的改變會(huì)很少
責(zé)任編輯:yangsai 來源: 51CTO.com
相關(guān)推薦

2016-09-07 13:07:55

大數(shù)據(jù)大數(shù)據(jù)分析精準(zhǔn)營(yíng)銷

2015-12-09 16:21:41

2017-08-02 09:08:07

機(jī)械硬盤存儲(chǔ)

2015-10-10 11:09:48

NFVNFVI網(wǎng)絡(luò)虛擬化

2024-05-06 09:08:52

微軟開源Linux

2025-03-07 09:18:10

2019-02-22 22:35:17

Mac插件安裝

2019-06-19 09:56:39

地震預(yù)警系統(tǒng)

2021-06-24 10:28:19

uptimed命令Linux

2019-09-11 15:11:00

智能

2010-11-17 09:18:27

數(shù)據(jù)庫

2022-02-07 15:24:53

iOS蘋果系統(tǒng)

2022-05-27 07:03:04

JDK場(chǎng)景線程

2013-11-04 17:02:40

Windows 8.1隱藏功能

2021-03-09 10:12:28

編程技能開發(fā)

2015-12-30 10:03:31

虛擬現(xiàn)實(shí)技術(shù)

2021-04-19 23:29:44

MakefilemacOSLinux

2021-12-01 19:32:14

原理Node代碼

2021-11-05 07:59:25

HashMapJava知識(shí)總結(jié)

2009-09-14 17:08:02

WebFormView
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)