❶ JProfiler如何與IntelliJ IDEA集成
1、在JProfiler的主菜單中選擇Session->IDE integrations。值得注意的是,當執行插件安裝時,需要關閉IntelliJ IDEA。如果通過JProfiler的安裝向導執行安裝程序,啟動IntelliJ IDEA前需要完成整個安裝。 2、為了通過IntelliJ IDEA分析應用程序,需要選擇Run菜單中的其中一個profile命令,或者編輯器中的上下文菜單,或者點擊相應的工具欄按鈕。Main toolbar with "Profile" button "Run" menu with "Profile" action Editor context menu with "Profile" action 3、JProfiler可以從所有的IDEA或者應用伺服器中分析所有的運行配置類型。編輯運行配置,選擇"Startup/Connection" 選項卡,然後選擇"Profile" 可以進行進一步的配置。下列截圖顯示了本地伺服器配置的啟動設置。根據運行配置類型,您可以調整JVM選項或檢索分析參數,進行遠程分析。Startup settings for profiling of a local server configuration 4、對於所有的運行配置類型,你可以決定是否要在JProfiler打開一個新的分析會話窗口,或者希望重用最後一個窗口以適應分析會話。 5、點擊「Run」命令,開始分析應用程序。
❷ jprofiler 9.2 怎麼使用
:打開 菜單Session->Integeration Widzards ->new Server Integeration 第二步:選擇 Generic Application Server->On a remote computer 第三步:JVM選擇建議選擇Oracle,根據實際情況選擇Version和Mode。Mode選擇使用的是interpreted。 第四步:選擇wait for a connection from the Jprofiler GUI,點擊next 第五步:Remote地址填寫要連接的linux下的IP:比如192.168.51.132 第六步:填寫Linux下jprofiler的安裝目錄:如圖所示 第七步:埠使用jprofiler默認的8849 後面的步驟點到Finish即可。
❸ JProfiler性能分析工具詳解
JProfiler 是一個商業授權的 java剖析工具,用於分析Java EE和Java SE應用程序.
JDK 本身定義了目標明確並功能完善的JNI( Java Native Interface ) 與虛擬機直接進行交互,這些 API 能很方便的進行擴展,從而滿足開發者各式的需求.
JVMTI( JVM Tool Interface) ,是JAVA虛擬機提供的本地介面,它是實現調度器以及其它Java運行測試與分析 工具 的基礎.
並不一定在所有的JDK提供商都有實現,但在主流的Oracle JDK、Open JDK上都有其實現.
1.用戶在JProfiler GUI中下達監控命令( 對應用戶的一個點擊 ).
2.JProfiler GUI通過自身Socket的8849埠向位於JVM的JProfiler Agent發送監控指令.
3.JProfiler Agent收到指令後向JVMTI注冊事件或執行相關的命令.
4.JVMTI根據事件和命令的類型返回相對應的數據( 線程狀態、對象實例、CPU負荷、GC狀態信息等)
5.JProfiler Agent從JVMTI中得到相應數據後將對其進行計算,最終通過Socket傳輸給JProfiler GUI中進行展示.
https://www.ej-technologies.com/download/jprofiler/files
激活碼: [email protected] #23874-hrwpdp1sh1wrn#0620
***** Linux操作系統無須激活
Select from all local JVMs模式:將掃描本地所有正在運行的JVM實例
Attach to profiled JVM模式:選擇本地或遠程正在運行的JVM實例,遠程被監控的機器一定要預先安裝JProfiler.
***** 需指定遠程 伺服器的JProfiler的通訊埠
步驟一:Session-->Integration Wizards-->New Server Integration
步驟二:選擇應用伺服器的類型以及版本號
步驟三:選擇與本地或遠程伺服器的服務進行集成
***** 本文將使用遠程伺服器模式.
***** 若 選擇與遠程伺服器的服務進行集成則需要選擇遠程伺服器的操作系統類型.
步驟四:選擇伺服器使用的JVM供應商以及版本號
步驟五:選擇JProfiler的啟動模式
JVM將等待JProfiler Agent接收到JProfiler GUI發送的配置信息後再進行啟動( 即Lauch Type連接模式 ,啟動一個新的JVM實例)
立即啟動JVM,稍後再與JProfiler GUI進行連接並向JProfiler Agent發送配置信息( 數據的採集方式、過濾器、觸發器等信息 )
***** 若使用此模式則需要讓JVM在啟動時自動載入JProfiler Agent,因此需要在startup.bat/startup.sh文件中添加命令
startup.bat:set CATALINA_OPTS=-agentpath:{JProfiler安裝目錄}\bin\windows-x64\jprofilerti.dll=port=8849,nowait %CATALINA_OPTS%
startup.sh:CATALINA_OPTS=-agentpath:/{JProfiler安裝目錄}/bin/linux-x64/libjprofilerti.so=port=8849,nowait $CATALINA_OPTS
export CATALINA_OPTS
離線分析,JProfiler GUI無法與JProfiler Agent進行連接,因此需要將數據的採集方式、過濾器、觸發器等信息打包成config.xml配置文件,在啟動該JVM實例時載入JProfiler Agent以及配置文件,使用此模式需要配合triggers觸發器使用,當發生指定的事件後觸發指定的操作.
***** 若使用此模式則需要讓JVM在啟動時自動載入JProfiler Agent和context.xml配置文件,因此需要在startup.bat/startup.sh文件中添加命令
startup.bat:set CATALINA_OPTS=-agentpath:{JProfiler安裝目錄}\bin\windows-x64\jprofilerti.dll=port=8849,nowait,config=C:\Users{用戶名}.jprofiler9\config.xml %CATALINA_OPTS%
startup.sh:CATALINA_OPTS=-agentpath:/{JProfiler安裝目錄}/bin/linux-x64/libjprofilerti.so=port=8849,config={預定義目錄}\config.xml $CATALINA_OPTS
export CATALINA_OPTS
步驟六:填寫遠程伺服器的IP地址
步驟七:輸入遠程伺服器中JProfiler的安裝目錄( 供JProfiler生成腳本時使用 )
步驟八:選擇應用伺服器的啟動腳本,JProfiler會根據選擇的啟動腳本文件生成一份適用於JProfiler特定啟動模式的腳本文件.
***** 最終在本地生成startup_jprofiler.sh文件,需將此文件復制到遠程伺服器中應用伺服器的bin目錄並對文件賦予執行的許可權,在伺服器中直接通過JProfiler提供的startup_jprofiler.sh文件來啟動服務.
***** 若使用離線啟動模式則還需要將JProfiler生成的context.xml配置文件復制到遠程伺服器中,然後修改startup_jprofiler.sh文件中JVM載入context.xml文件的路徑.
步驟九:設置JProfiler GUI通訊的埠
步驟十:檢查配置項
步驟十一:選擇數據的採集方式
JProfiler將對需要分析的class位元組碼文件中寫入自己的bytecode, 對於正在運行的JVM實例選擇此模式將會重新載入位元組碼文件到JVM的運行時數據區域結構中 .
***** 這是JProfiler全功能模式,在此設置中,調用堆棧信息是准確的,但是CPU開銷可能很高( 取決於Filter的控制 ),若要分析的類較多,則對應用的性能產生影響,因此使用此模式一般配合Filter使用,只對特定的類或包進行分析.
此模式對CPU的開銷非常低,但不支持某些功能( 方法的執行次數、執行時間等 ), 這種模式在連接正在運行的JVM實例時更為安全.
步驟十二:選擇配置Filter和Trigger
配置Filter( 適用於Instrumentation數據採集模式 )
配置Trigger( 多用在離線的啟動模式 )
1.選擇觸發器的類型
2.選擇觸發的動作
步驟十三:完成配置,連接JProfiler Agent,對程序進行監控.
***** 每個Session表示一次會話,Session可以通過人工創建 ( New Session ) 或者與服務應用進行集成來產生( Integration Wizards ).
***** 支持將當前JVM實例的運行狀態保存為快照( Save Snapshot )並提供快照與快照之間的對比功能.
Telemetries視圖:包含JMM內存的使用情況( 全局堆與非堆、局部伊甸園區、倖存者區、老年代)、GC線程的活動情況( 發生GC的時間,是屬於Minor GC還是Full GC )、當前JVM實例的線程概況、CPU的負載等信息.
Live Memory視圖:展示當前堆中實例的個數、方法的調用鏈等信息.
方法調用鏈信息:
Heap Walker視圖:用於堆的快照分析,可以選擇在Live Memory中記錄的對象或者當前運行狀態時堆的對象也可以直接在對象視圖右鍵對象Show Selection In Heap Walker.
CPU Views視圖:可以按運行順序逐級查看當前程序運行時的耗時、在一定時間內統計方法的執行效率.
程序運行耗時:
一定時間內統計方法的執行效率( 單位:微秒 ):
Total Time:執行總時長.
Inv:執行的次數.
Avg Time:方法平均執行時長.
Median Time:第中間次數的執行時長.
Min Time:最短執行時長.
Max Time:最大執行時長.
❹ 如何使用JProfiler查找內存泄漏
很久之前用過的,參考:
第一種、本地程序由jprofiler來引導程序啟動,
第二種、在客戶端遠程監控服務端的CS模式,必須在客戶端和服務端都安裝jprofiler,服務端需要在環境變數里加入LD_LIBRARY_PATH 值為JProfiler 的庫文件所在路徑,比如 $JPROFILER_HOME/bin/linux-x86,然後將服務端的啟動腳本考到客戶端上,在客戶端配置時有一步選擇這個腳本(locate the start script),jprofiler會給腳本添加一些自己的配置,然後服務端使用jprofiler改好的這個腳本啟動,這時候是不會真正啟動的,他在等待客戶端的觸發,客戶端jprofiler再啟動的時候就可以遠程監控到服務端jvm了。本地的程序的話按照向導就很容易做了。
分析:
1、揣測、在Memory Views這個頁面右鍵點擊比較有可能出現泄漏的類,然後add selection to class tracker。有幾項最常出現泄漏的最好加進來:String,char[],HashMap的entry,以及用過濾器通過包名篩選出自己的項目里用到的類
2、跟蹤、經過過一段時間後,查看memeory views里的class tracker的tab頁,可以看到對象數量在這一段時間內的記錄,如果有增長過快、或持續增長而不釋放的則會造成泄漏
3、追溯、定位了這個類後再就看一下是誰引用他導致內存沒有釋放,在heap walker里,找到剛才的class,右鍵它查看他的引用references,針對可能出現問題的類進行源碼瀏覽、確定根源在哪裡
❺ jprofiler 監控 tomcat部署的javaweb項目 出現 unrecorded objects
1解壓下載後的JProfiler zip文檔。
2我們進入bin目錄,找到jprofiler.exe文件,雙擊運行,開始自動安裝
3安裝完成後出現下圖所示,我們選擇第三項,點擊Next
4選擇對應的伺服器軟體,這里我們選擇Tomcat 7.0
5選擇應用在本地伺服器還是遠程伺服器,我們選擇本地伺服器
6選擇Java虛擬機版本,如下所示。
7選擇到Tomcat下的startup.bat。
8這里指定埠,不要選擇80、8080這些通用的埠,容易造成沖突。
9一路Next,到最後一步,我們選擇No,因為我們要修改下tomcat的配置,不然跑不起來。到這里基本的配置都完成了。
10我們點擊start center出現一個對話框,我們可以看到之前我們配置的伺服器,選中之前配置的那個伺服器,右擊Edit進入session settings
之後你就能看到那些線程圖標了
❻ 如何在linux下檢測內存泄漏
內存泄漏指由於疏忽或錯誤造成程序未能釋放已經不再使用的內存的情況。內存泄漏並非指內存在物理上的消失,而是應用程序分配某段內存後,由於設計錯誤,失去了對該段內存的控制,因而造成了內存的浪費。
可以使用相應的軟體測試工具對軟體進行檢測。
1. ccmalloc-Linux和Solaris下對C和C++程序的簡單的使用內存泄漏和malloc調試庫。
2. Dmalloc-Debug Malloc Library.
3. Electric
Fence-Linux分發版中由Bruce Perens編寫的malloc()調試庫。
4. Leaky-Linux下檢測內存泄漏的程序。
5. LeakTracer-Linux、Solaris和HP-UX下跟蹤和分析C++程序中的內存泄漏。
6. MEMWATCH-由Johan
Lindh編寫,是一個開放源代碼C語言內存錯誤檢測工具,主要是通過gcc的precessor來進行。
7. Valgrind-Debugging and profiling Linux programs, aiming at
programs written in C and C++.
8. KCachegrind-A visualization tool for the profiling data
generated by Cachegrind and Calltree.
9. Leak
Monitor-一個Firefox擴展,能找出跟Firefox相關的泄漏類型。
10. IE Leak Detector
(Drip/IE Sieve)-Drip和IE Sieve leak
detectors幫助網頁開發員提升動態網頁性能通過報告可避免的因為IE局限的內存泄漏。
11. Windows Leaks
Detector-探測任何Win32應用程序中的任何資源泄漏(內存,句柄等),基於Win API調用鉤子。
12. SAP Memory
Analyzer-是一款開源的JAVA內存分析軟體,可用於輔助查找JAVA程序的內存泄漏,能容易找到大塊內存並驗證誰在一直佔用它,它是基於Eclipse
RCP(Rich Client Platform),可以下載RCP的獨立版本或者Eclipse的插件。
13. DTrace-即動態跟蹤Dynamic
Tracing,是一款開源軟體,能在Unix類似平台運行,用戶能夠動態檢測操作系統內核和用戶進程,以更精確地掌握系統的資源使用狀況,提高系統性能,減少支持成本,並進行有效的調節。
14. IBM Rational PurifyPlus-幫助開發人員查明C/C++、託管.NET、Java和VB6代碼中的性能和可靠性錯誤。PurifyPlus
將內存錯誤和泄漏檢測、應用程序性能描述、代碼覆蓋分析等功能組合在一個單一、完整的工具包中。
15. Parasoft Insure++-針對C/C++應用的運行時錯誤自動檢測工具,它能夠自動監測C/C++程序,發現其中存在著的內存破壞、內存泄漏、指針錯誤和I/O等錯誤。並通過使用一系列獨特的技術(SCI技術和變異測試等),徹底的檢查和測試我們的代碼,精確定位錯誤的准確位置並給出詳細的診斷信息。能作為Microsoft
Visual C++的一個插件運行。
16. Compuware DevPartner for Visual C++ BoundsChecker
Suite-為C++開發者設計的運行錯誤檢測和調試工具軟體。作為Microsoft Visual Studio和C++ 6.0的一個插件運行。
17. Electric Software GlowCode-包括內存泄漏檢查,code
profiler,函數調用跟蹤等功能。給C++和.Net開發者提供完整的錯誤診斷,和運行時性能分析工具包。
18. Compuware DevPartner Java
Edition-包含Java內存檢測,代碼覆蓋率測試,代碼性能測試,線程死鎖,分布式應用等幾大功能模塊。
19. Quest JProbe-分析Java的內存泄漏。
20. ej-technologies JProfiler-一個全功能的Java剖析工具,專用於分析J2SE和J2EE應用程序。它把CPU、執行緒和內存的剖析組合在一個強大的應用中。JProfiler可提供許多IDE整合和應用伺服器整合用途。JProfiler直覺式的GUI讓你可以找到效能瓶頸、抓出內存泄漏、並解決執行緒的問題。4.3.2注冊碼:A-G666#76114F-1olm9mv1i5uuly#0126
21. BEA JRockit-用來診斷Java內存泄漏並指出根本原因,專門針對Intel平台並得到優化,能在Intel硬體上獲得最高的性能。
22. SciTech Software AB .NET Memory
Profiler-找到內存泄漏並優化內存使用針對C#,VB.Net,或其它.Net程序。
23. YourKit .NET & Java Profiler-業界領先的Java和.NET程序性能分析工具。
24. AutomatedQA AQTime-AutomatedQA的獲獎產品performance profiling和memory
debugging工具集的下一代替換產品,支持Microsoft, Borland, Intel, Compaq 和
GNU編譯器。可以為.NET和Windows程序生成全面細致的報告,從而幫助您輕松隔離並排除代碼中含有的性能問題和內存/資源泄露問題。支持.Net
1.0,1.1,2.0,3.0和Windows 32/64位應用程序。
25. JavaScript Memory Leak Detector-微軟全球產品開發歐洲團隊(Global Proct
Development- Europe team, GPDE)
發布的一款調試工具,用來探測JavaScript代碼中的內存泄漏,運行為IE系列的一個插件。
❼ jprofiler 9.2 windows和linux的jdk可以不相同嗎
Java™堆耗盡並不是造成java.lang.OutOfMemoryError的惟一原因。如果本機內存耗盡,則會發生普通調試技巧無法解決的OutOfMemoryError。本文將討論本機內存的概念,Java運行時如何使用它,它被耗盡時會出現什麼情況,以及如何在Windows®和Linux®上調試本機OutOfMemoryError。針對AIX®系統的相同主題將在另一篇同類文章中介紹。Java堆(每個Java對象在其中分配)是您在編寫Java應用程序時使用最頻繁的內存區域。JVM設計用於將我們與主機的特性隔離,所以將內存當作堆來考慮再正常不過了。您一定遇到過Java堆OutOfMemoryError,它可能是由於對象泄漏造成的,也可能是因為堆的大小不足以存儲所有數據,您也可能了解這些場景的一些調試技巧。但是隨著您的Java應用程序處理越來越多的數據和越來越多的並發負載,您可能就會遇到無法使用常規技巧進行修復的OutOfMemoryError。在一些場景中,即使java堆未滿,也會拋出錯誤。當這類場景發生時,您需要理解Java運行時環境(JavaRuntimeEnvironment,JRE)內部到底發生了什麼。Java應用程序在Java運行時的虛擬化環境中運行,但是運行時本身是使用C之類的語言編寫的本機程序,它也會耗用本機資源,包括本機內存。本機內存是可用於運行時進程的內存,它與Java應用程序使用的java堆內存不同。每種虛擬化資源(包括Java堆和Java線程)都必須存儲在本機內存中,虛擬機在運行時使用的數據也是如此。這意味著主機的硬體和操作系統施加在本機內存上的限制會影響到Java應用程序的性能。本系列文章共分兩篇,討論不同平台上的相應話題。本文是其中一篇。在這兩篇文章中,您將了解什麼是本機內存,Java運行時如何使用它,本機內存耗盡之後會發生什麼情況,以及如何調試本機OutOfMemoryError。本文介紹Windows和Linux平台上的這一主題,不會介紹任何特定的運行時實現。另一篇類似的文章介紹AIX上的這一主題,著重介紹IBM®DeveloperKitforJava。(另一篇文章中關於IBM實現的信息也適合於除AIX之外的平台,因此如果您在Linux上使用IBMDeveloperKitforJava,或使用IBM32-,您會發現這篇文章也有用處)。本機內存簡介我將首先解釋一下操作系統和底層硬體給本機內存帶來的限制。如果您熟悉使用C等語言管理動態內存,那麼您可以直接跳到下一節。硬體限制本機進程遇到的許多限制都是由硬體造成的,而與操作系統沒有關系。每台計算機都有一個處理器和一些隨機存取存儲器(RAM),後者也稱為物理內存。處理器將數據流解釋為要執行的指令,它擁有一個或多個處理單元,用於執行整數和浮點運算以及更高級的計算。處理器具有許多寄存器——常快速的內存元素,用作被執行的計算的工作存儲,寄存器大小決定了一次計算可使用的最大數值。處理器通過內存匯流排連接到物理內存。物理地址(處理器用於索引物理RAM的地址)的大小限制了可以定址的內存。例如,一個16位物理地址可以定址0x0000到0xFFFF的內存地址,這個地址范圍包括2^16=65536個惟一的內存位置。如果每個地址引用一個存儲位元組,那麼一個16位物理地址將允許處理器定址64KB內存。處理器被描述為特定數量的數據位。這通常指的是寄存器大小,但是也存在例外,比如32位390指的是物理地址大小。對於桌面和伺服器平台,這個數字為31、32或64;對於嵌入式設備和微處理器,這個數字可能小至4。物理地址大小可以與寄存器帶寬一樣大,也可以比它大或小。如果在適當的操作系統上運行,大部分64位處理器可以運行32位程序。表1列出了一些流行的Linux和Windows架構,以及它們的寄存器和物理地址大小:表1.一些流行處理器架構的寄存器和物理地址大小架構寄存器帶寬(位)物理地址大小(位)(現代)Intel®x86323236,具有物理地址擴展(PentiumPro和更高型號)x866464目前為48位(以後將會增大)PPC6464在POWER5上為50位39031位323139064位6464操作系統和虛擬內存如果您編寫無需操作系統,直接在處理器上運行的應用程序,您可以使用處理器可以定址的所有內存(假設連接到了足夠的物理RAM)。但是要使用多任務和硬體抽象等特性,幾乎所有人都會使用某種類型的操作系統來運行他們的程序。在Windows和Linux等多任務操作系統中,有多個程序在使用系統資源。需要為每個程序分配物理內存區域來在其中運行。可以設計這樣一個操作系統:每個程序直接使用物理內存,並且可以可靠地僅使用分配給它的內存。一些嵌入式操作系統以這種方式工作,但是這在包含多個未經過集中測試的應用程序的環境中是不切實際的,因為任何程序都可能破壞其他程序或者操作系統本身的內存。虛擬內存允許多個進程共享物理內存,而且不會破壞彼此的數據。在具有虛擬內存的操作系統(比如Windows、Linux和許多其他操作系統)中,每個程序都擁有自己的虛擬地址空間——一個邏輯地址區域,其大小由該系統上的地址大小規定(所以,桌面和伺服器平台的虛擬地址空間為31、32或64位)。進程的虛擬地址空間中的區域可被映射到物理內存、文件或任何其他可定址存儲。當數據未使用時,操作系統可以在物理內存與一個交換區域(Windows上的頁面文件或者Linux上的交換分區)之間移動它,以實現對物理內存的最佳利用率。當一個程序嘗試使用虛擬地址訪問內存時,操作系統連同片上硬體會將該虛擬地址映射到物理位置,這個位置可以是物理RAM、一個文件或頁面文件/交換分區。如果一個內存區域被移動到交換空間,那麼它將在被使用之前載入回物理內存中。圖1展示了虛擬內存如何將進程地址空間區域映射到共享資源:程序的每個實例以進程的形式運行。在Linux和Windows上,進程是一個由受操作系統控制的資源(比如文件和套接字信息)、一個典型的虛擬地址空間(在某些架構上不止一個)和至少一個執行線程構成的集合。虛擬地址空間大小可能比處理器的物理地址大小更小。32位Intelx86最初擁有的32位物理地址僅允許處理器定址4GB存儲空間。後來,添加了一種稱為物理地址擴展(PhysicalAddressExtension,PAE)的特性,將物理地址大小擴大到了36位,允許安裝或定址至多64GBRAM。PAE允許操作系統將32位的4GB虛擬地址空間映射到一個較大的物理地址范圍,但是它不允許每個進程擁有64GB虛擬地址空間。這意味著如果您將大於4GB的內存放入32位Intel伺服器中,您將無法將所有內存直接映射到一個單一進程中。地址窗口擴展(AddressWindowingExtension)特性允許Windows進程將其32位地址空間的一部分作為滑動窗口映射到較大的內存區域中。Linux使用類似的技術將內存區域映射到虛擬地址空間中。這意味著盡管您無法直接引用大於4GB的內存,但您仍然可以使用較大的內存區域。內核空間和用戶空間盡管每個進程都有其自己的地址空間,但程序通常無法使用所有這些空間。地址空間被劃分為用戶空間和內核空間。內核是主要的操作系統程序,包含用於連接計算機硬體、調度程序以及提供聯網和虛擬內存等服務的邏輯。作為計算機啟動序列的一部分,操作系統內核運行並初始化硬體。一旦內核配置了硬體及其自己的內部狀態,第一個用戶空間進程就會啟動。如果用戶程序需要來自操作系統的服務,它可以執行一種稱為系統調用的操作與內核程序交互,內核程序然後執行該請求。系統調用通常是讀取和寫入文件、聯網和啟動新進程等操作所必需的。當執行系統調用時,內核需要訪問其自己的內存和調用進程的內存。因為正在執行當前線程的處理器被配置為使用地址空間映射來為當前進程映射虛擬地址,所以大部分操作系統將每個進程地址空間的一部分映射到一個通用的內核內存區域。被映射來供內核使用的地址空間部分稱為內核空間,其餘部分稱為用戶空間,可供用戶應用程序使用。內核空間和用戶空間之間的平衡關系因操作系統的不同而不同,甚至在運行於不同硬體架構之上的同一操作系統的各個實例間也有所不同。這種平衡通常是可配置的,可進行調整來為用戶應用程序或內核提供空間。縮減內核區域可能導致一些問題,比如能夠同時登錄的用戶數量限制或能夠運行的進程數量限制。更小的用戶空間意味著應用程序編程人員只能使用更少的內存空間。默認情況下,32位Windows擁有2GB用戶空間和2GB內核空間。在一些Windows版本上,通過向啟動配置添加/3GB開關並使用/LARGEADDRESSAWARE開關重新鏈接應用程序,可以將這種平衡調整為3GB用戶空間和1GB內核空間。在32位Linux上,默認設置為3GB用戶空間和1GB內核空間。一些Linux分發版提供了一個hugemem內核,支持4GB用戶空間。為了實現這種配置,將進行系統調用時使用的地址空間分配給內核。通過這種方式增加用戶空間會減慢系統調用,因為每次進行系統調用時,操作系統必須在地址空間之間復制數據並重置進程地址-空間映射。圖2展示了32位Windows的地址-空間布局:31位Linux390上還使用了一個獨立的內核地址空間,其中較小的2GB地址空間使對單個地址空間進行劃分不太合理,但是,390架構可以同時使用多個地址空間,而且不會降低性能。進程空間必須包含程序需要的所有內容,包括程序本身和它使用的共享庫(在Windows上為DDL,在Linux上為.so文件)。共享庫不僅會占據空間,使程序無法在其中存儲數據,它們還會使地址空間碎片化,減少可作為連續內存塊分配的內存。這對於在擁有3GB用戶空間的Windowsx86上運行的程序尤為明顯。DLL在構建時設置了首選的載入地址:當載入DLL時,它被映射到處於特定位置的地址空間,除非該位置已經被佔用,在這種情況下,它會載入到別處。WindowsNT最初設計時設置了2GB可用用戶空間,這對於要構建來載入接近2GB區域的系統庫很有用——使大部分用戶區域都可供應用程序自由使用。當用戶區域擴展到3GB時,系統共享庫仍然載入接近2GB數據(約為用戶空間的一半)。盡管總體用戶空間為3GB,但是不可能分配3GB大的內存塊,因為共享庫無法載入這么大的內存。在Windows中使用/3GB開關,可以將內核空間減少一半,也就是最初設計的大小。在一些情形下,可能耗盡1GB內核空間,使I/O變得緩慢,且無法正常創建新的用戶會話。盡管/3GB開關可能對一些應用程序非常有用,但任何使用它的環境在部署之前都應該進行徹底的負載測試。參見參考資料,獲取關於/3GB開關及其優缺點的信息的鏈接。本機內存泄漏或過度使用本機內存將導致不同的問題,具體取決於您是耗盡了地址空間還是用完了物理內存。耗盡地址空間通常只會發生在32位進程上,因為最大4GB的內存很容易分配完。64位進程具有數百或數千GB的用戶空間,即使您特意消耗空間也很難耗盡這么大的空間。如果您確實耗盡了Java進程的地址空間,那麼Java運行時可能會出現一些陌生現象,本文稍後將詳細討論。當在進程地址空間比物理內存大的系統上運行時,內存泄漏或過度使用本機內存會迫使操作系統交換後備存儲器來用作本機進程的虛擬地址空間。訪問經過交換的內存地址比讀取駐留(在物理內存中)的地址慢得多,因為操作系統必須從硬碟驅動器拉取數據。可能會分配大量內存來用完所有物理內存和所有交換內存(頁面空間),在Linux上,這將觸發內核內存不足(OOM)結束程序,強制結束最消耗內存的進程。在Windows上,與地址空間被占滿時一樣,內存分配將會失敗。同時,如果嘗試使用比物理內存大的虛擬內存,顯然在進程由於消耗內存太大而被結束之前就會遇到問題。系統將變得異常緩慢,因為它會將大部分時間用於在內存與交換空間之間來回復制數據。當發生這種情況時,計算機和獨立應用程序的性能將變得非常糟糕,從而使用戶意識到出現了問題。當JVM的Java堆被交換出來時,垃圾收集器的性能會變得非常差,應用程序可能被掛起。如果一台機器上同時使用了多個Java運行時,那麼物理內存必須足夠分配給所有Java堆。Java運行時如何使用本機內存Java運行時是一個操作系統進程,它會受到我在上一節中列出的硬體和操作系統局限性的限制。運行時環境提供的功能受一些未知的用戶代碼驅動,這使得無法預測在每種情形中運行時環境將需要何種資源。Java應用程序在託管Java環境中執行的每個操作都會潛在地影響提供該環境的運行時的需求。本節描述Java應用程序為什麼和如何使用本機內存。Java堆和垃圾收集Java堆是分配了對象的內存區域。大多數JavaSE實現都擁有一個邏輯堆,但是一些專家級Java運行時擁有多個堆,比如實現Java實時規范(RealTimeSpecificationforJava,RTSJ)的運行時。一個物理堆可被劃分為多個邏輯扇區,具體取決於用於管理堆內存的垃圾收集(GC)演算法。這些扇區通常實現為連續的本機內存塊,這些內存塊受Java內存管理器(包含垃圾收集器)控制。堆的大小可以在Java命令行使用-Xmx和-Xms選項來控制(mx表示堆的最大大小,ms表示初始大小)。盡管邏輯堆(經常被使用的內存區域)可以根據堆上的對象數量和在GC上花費的時間而增大和縮小,但使用的本機內存大小保持不變,而且由-Xmx值(最大堆大小)指定。大部分GC演算法依賴於被分配為連續的內存塊的堆,因此不能在堆需要擴大時分配本機內存。所有堆內存必須預先保留。保留本機內存與分配本機內存不同。當本機內存被保留時,無法使用物理內存或其他存儲器作為備用內存。盡管保留地址空間塊不會耗盡物理資源,但會阻止內存被用於其他用途。由保留從未使用的內存導致的泄漏與泄漏分配的內存一樣嚴重。當使用的堆區域縮小時,一些垃圾收集器會回收堆的一部分(釋放堆的後備存儲空間),從而減少使用的物理內存。對於維護Java堆的內存管理系統,需要本機內存來維護它的狀態。當進行垃圾收集時,必須分配數據結構來跟蹤空閑存儲空間和記錄進度。這些數據結構的確切大小和性質因實現的不同而不同,但許多數據結構都與堆大小成正比。即時(JIT)編譯器JIT編譯器在運行時編譯Java位元組碼來優化本機可執行代碼。這極大地提高了Java運行時的速度,並且支持Java應用程序以與本機代碼相當的速度運行。位元組碼編譯使用本機內存(使用方式與gcc等靜態編譯器使用內存來運行一樣),但JIT編譯器的輸入(位元組碼)和輸出(可執行代碼)必須也存儲在本機內存中。包含多個經過JIT編譯的方法的Java應用程序會使用比小型應用程序的本機內存。類和類載入器Java應用程序由一些類組成,這些類定義對象結構和方法邏輯。Java應用程序也使用Java運行時類庫(比如java.lang.String)中的類,也可以使用第三方庫。這些類需要存儲在內存中以備使用。存儲類的方式取決於具體實現。SunJDK使用永久生成(permanentgeneration,PermGen)堆區域。Java5的IBM實現會為每個類載入器分配本機內存塊,並將類數據存儲在其中。現代Java運行時擁有類共享等技術,這些技術可能需要將共享內存區域映射到地址空間。要理解這些分配機制如何影響您Java運行時的本機內存佔用,您需要查閱該實現的技術文檔。然而,一些普遍的事實會影響所有實現。從最基本的層面來看,使用的類將需要使用內存。(這可能意味著您的本機內存使用量會增加,或者您必須明確地重新設置PermGen或共享類緩存等區域的大小,以裝入所有類)。記住,不僅您的應用程序需要載入到內存中,框架、應用伺服器、第三方庫以及包含類的Java運行時也會按需載入並佔用空間。Java運行時可以卸載類來回收空間,但是只有在非常嚴酷的條件下才會這樣做。不能卸載單個類,而是卸載類載入器,隨其載入的所有類都會被卸載。只有在以下情況下才能卸載類載入器:Java堆不包含對表示該類載入器的java.lang.ClassLoader對象的引用。Java堆不包含對表示類載入器載入的類的任何java.lang.Class對象的引用。在Java堆上,該類載入器載入的任何類的所有對象都不再存活(被引用)。需要注意的是,Java運行時為所有Java應用程序創建的3個默認類載入器(bootstrap、extension和application)都不可能滿足這些條件,因此,任何系統類(比如java.lang.String)或通過應用程序類載入器載入的任何應用程序類都不能在運行時釋放。即使類載入器適合進行收集,運行時也只會將收集類載入器作為GC周期的一部分。一些實現只會在某些GC周期中卸載類載入器。也可能在運行時生成類,而不用釋放它。許多JEE應用程序使用JavaServerPages(JSP)技術來生成Web頁面。使用JSP會為執行的每個.jsp頁面生成一個類,並且這些類會在載入它們的類載入器的整個生存期中一直存在——這個生存期通常是Web應用程序的生存期。另一種生成類的常見方法是使用Java反射。反射的工作方式因Java實現的不同而不同,但Sun和IBM實現都使用了這種方法,我馬上就會講到。當使用java.lang.reflectAPI時,Java運行時必須將一個反射對象(比如java.lang.reflect.Field)的方法連接到被反射到的對象或類。這可以通過使用Java本機介面(JavaNativeInterface,JNI)訪問器來完成,這種方法需要的設置很少,但是速度緩慢。也可以在運行時為您想要反射到的每種對象類型動態構建一個類。後一種方法在設置上更慢,但運行速度更快,非常適合於經常反射到一個特定類的應用程序。Java運行時在最初幾次反射到一個類時使用JNI方法,但當使用了若干次JNI方法之後,訪問器會膨脹為位元組碼訪問器,這涉及到構建類並通過新的類載入器進行載入。執行多次反射可能導致創建了許多訪問器類和類載入器。保持對反射對象的引用會導致這些類一直存活,並繼續佔用空間。因為創建位元組碼訪問器非常緩慢,所以Java運行時可以緩存這些訪問器以備以後使用。一些應用程序和框架還會緩存反射對象,這進一步增加了它們的本機內存佔用。JNIJNI支持本機代碼(使用C和C++等本機編譯語言編寫的應用程序)調用Java方法,反之亦然。Java運行時本身極大地依賴於JNI代碼來實現類庫功能,比如文件和網路I/O。JNI應用程序可能通過3種方式增加Java運行時的本機內存佔用:JNI應用程序的本機代碼被編譯到共享庫中,或編譯為載入到進程地址空間中的可執行文件。大型本機應用程序可能僅僅載入就會佔用大量進程地址空間。本機代碼必須與Java運行時共享地址空間。任何本機代碼分配或本機代碼執行的內存映射都會耗用Java運行時的內存。某些JNI函數可能在它們的常規操作中使用本機內存。GetTypeArrayElements和GetTypeArrayRegion函數可以將Java堆數據復制到本機內存緩沖區中,以供本機代碼使用。是否復制數據依賴於運行時實現。(IBMDeveloperKitforJava5.0和更高版本會進行本機復制)。通過這種方式訪問大量Java堆數據可能會使用大量本機堆。
❽ jprofiler10怎麼安裝
有好幾種安裝方法,比如硬碟安裝,光碟安裝,PE安裝。優盤安裝。可以直接硬碟安裝。把win7拷貝到硬碟中(除C盤外的其他分驅中),不要創建文件夾,直接把win7文件解壓在硬碟中,安裝一個win7輔助安裝工具(比如Win6Ins),重啟電腦就會引導你安裝win7,開始時注意,有個高級選項可以選擇格式化硬碟,不要忽略了。其他安裝方法差不多。
❾ jprofiler10怎麼安裝
以前有過類似的問題 可以參考下:
http://www.opdown.com/html/71895.html