A. 在新建虛擬機時出現問題
JConsole
JConsole 圖形用戶界面是一種符合 java 管理擴展(JMX)規范的監視工具。JConsole 使用 Java 虛擬機 (Java VM) 的廣泛檢測來提供有關在 Java 平台上運行的應用程序的性能和資源消耗的信息。
使用方法 本地
使用jconsole命令:監視本地運行的所有 Java 應用程序,JConsole 可以連接到這些應用程序。
使用jconsole PID命令:監視指定PID的Java應用程序。
使用jsconsole hostName:portNum命令:hostName是運行應用程序的系統的名稱,portNum是您在啟動Java VM時啟用 JMX 代理時指定的埠號。
使用service:jmx::命令:使用 JMX 服務 URL 進行連接。
內容分析
將 JConsole 連接到應用程序後,JConsole 由六個選項卡組成。
概述:顯示有關 Java VM 和受監視值的概述信息。
內存:顯示有關內存使用的信息。
線程:顯示有關線程使用的信息。
類:顯示有關類載入的信息。
VM:顯示有關 Java VM 的信息。
MBeans:顯示有關 MBeans 的信息。
顯示有關 CPU 使用情況、內存使用情況、線程計數和在Java VM中載入的類的圖形監視信息。
提供執行GC的操作,可以隨時點擊按鈕進行垃圾回收
伊甸園空間(堆):最初為大多數對象分配內存的池。
倖存者空間(堆):包含在伊甸園空間垃圾回收中倖存下來的物體的池。
終身代(堆):包含在倖存者空間中存在一段時間的對象的池。
永久生成(非堆):包含虛擬機本身的所有反射數據的池,如類和方法對象。使用類數據共享的 Java VM,這一代分為只讀和讀寫區域。
代碼緩存(非堆):HotSpotJava VM 還包括一個代碼緩存,其中包含用於編譯和存儲本機代碼的內存。
Java VM管理兩種類型的內存:堆內存和非堆內存,這兩種內存都是在 Java VM 啟動時創建的。
堆內存是Java VM為所有類實例和數組分配內存的運行時數據區域。堆的大小可能是固定的或可變的。垃圾回收器是一個自動內存管理系統,用於回收對象的堆內存。
非堆內存包括所有線程之間共享的方法區域和Java VM的內部處理或優化所需的內存。它存儲每類結構,如運行時常量池、欄位和方法數據,以及方法和構造函數的代碼。方法區域在邏輯上是堆的一部分,但是,根據實現,Java VM 可能不會對它進行垃圾回收或壓縮。與堆內存一樣,方法區域可能為固定大小或可變大小。方法區域的內存不需要連續。
內存池和內存管理器是Java VM內存系統的關鍵方面。
內存池表示Java VM管理的內存區域。Java VM至少有一個內存池,它可能會在執行期間創建或刪除內存池。內存池可以屬於堆內存或非堆內存。
內存管理器管理一個或多個內存池。垃圾回收器是一種內存管理器,負責回收不可到達的對象使用的內存。Java VM可能具有一個或多個內存管理器。它可以在執行期間添加或刪除內存管理器。內存池可以由多個內存管理器管理。
垃圾回收 (GC) 是Java VM釋放不再引用的對象佔用的內存的方式。通常認為具有活動引用為"活動"且未引用(或無法訪問)對象的對象為"已死"。垃圾回收是釋放死對象使用的內存的過程。GC 使用的演算法和參數對性能有顯著影響。
Java hotspot VM垃圾回收器使用代數 GC。生成 GC 利用大多數程序符合以下概括的觀察。
它們創建許多壽命較短的對象,例如迭代器和局部變數。
它們創建一些壽命很長的對象,例如高級持久對象。
提供有關線程使用的信息。
查找監視器死鎖線程:檢測對象監視器鎖上是否有任何線程死鎖。此操作返回死鎖線程指示的數組。
getThreadInfo:返回線程信息。這包括線程當前被阻止的名稱、堆棧跟蹤和監視器鎖(如果有)以及持有該鎖的線程以及線程爭用統計信息。
獲取ThreadCpu時間:返回給定線程消耗的 CPU 時間
顯示有關類載入的信息。
提供有關Java VM的信息。
以通用方式顯示有關在平台 MBean 伺服器注冊的所有 MBeans 的信息。MBeans 選項卡允許您訪問平台 MXBean 檢測的完整集,包括在其他選項卡中不可見的儀器。此外,您還可以使用 MBeans 選項卡監視和管理應用程序的 MBeans。
列出目標系統上已檢測的 Java 虛擬機 (JVM)。
監視 Java 虛擬機 (JVM) 統計信息。
對Java應用程序的資源和性能進行實時的命令行的監控,包括了對Heap size和垃圾回收狀況的監控。
命令格式
jstat [-option] [PID]
option參數
class:顯示有關類載入器行為的統計信息。
compiler:顯示有關Java HotSpot VM實時編譯器行為的統計信息。
gc:顯示有關垃圾回收堆行為的統計信息。
gccapacity:顯示有關幾代人容量及其相應空間的統計信息。
gccause:顯示有關垃圾回收統計信息(與 相同)的摘要,以及最後和當前(如果適用)垃圾回收事件的原因。-gcutil
gcnew:顯示新一代行為的統計信息。
gcnewcapacity:顯示有關新一代大小及其相應空間的統計信息。
gcold:顯示有關舊一代和元空間統計信息行為的統計信息。
gcoldcapacity:顯示有關舊一代大小的統計信息。
gcmetacapacity:顯示有關元空間大小的統計信息。
gcutil:顯示有關垃圾回收統計信息的摘要。
printcompilation:顯示 Java 熱點 VM 編譯方法統計信息。
1.jstat –class: 顯示載入class的數量,及所佔空間等信息。
2.jstat -compiler顯示VM實時編譯的數量等信息。
3.jstat -gc: 可以顯示gc的信息,查看gc的次數,及時間。
4.jstat -gccapacity:可以顯示,VM內存中三代(young,old,perm)對象的使用和佔用大小
5.jstat -gcutil:統計gc信息
6.jstat -gcnew:年輕代對象的信息。
7.jstat -gcnewcapacity: 年輕代對象的信息及其佔用量。
8.jstat -gcold:old代對象的信息。
9.jstat -gcoldcapacity: old代對象的信息及其佔用量。
10.jstat -gcpermcapacity: perm對象的信息及其佔用量。
11.jstat -printcompilation:當前VM執行的信息。
監視 Java 虛擬機 (JVM),並使遠程監視工具能夠連接到 JVM
命令格式
jstatd -[option]
option
-nr當找不到現有的RMI注冊表時,不嘗試使用jstatd進程創建一個內部的RMI注冊表。
-p port在指定的埠查找RMI注冊表。如果沒有找到,並且沒有指定-nr選項,則在該埠自行創建一個內部的RMI注冊表。
-n rminameRMI注冊表中綁定的RMI遠程對象的名稱。默認的名稱為JStatRemoteHost。如果多個jstatd伺服器在同一主機上運行,你可以通過指定該選項來讓每個伺服器導出的RMI對象具有唯一的名稱。不管如何,這樣做需要將唯一的伺服器名稱包含進監控客戶端的hostid和vmid字元串中。
-Joption將選項參數傳遞給被javac調用的java啟動程序。例如,-J-Xms48m設置啟動內存為48 MB。使用-J將選項參數傳遞給執行Java應用程序的底層虛擬機,這是一種常見慣例。
使用方法
1.在jdk的bin目錄下創建文件jstatd.all.policy
2.寫入下面的安全配置
grant codebase "file:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-1.el7_6.x86_64/lib/tools.jar" {
permission java.security.AllPermission;
#此處寫絕對路徑,主要是防止路徑錯誤問題,排查問題,應該寫成相對路徑
3.啟動jstatd
./jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=x.x.x.x &
4.使用jvisualvm工具遠程連接,進行監控
jvisualvm
VisualVM,能夠監控線程,內存情況,查看方法的CPU時間和內存中的對 象,已被GC的對象,反向查看分配的堆棧(如100個String對象分別由哪幾個對象分配出來的).
同時他還提供很多插件可以自己安裝,是一款不錯的監控分析工具。
故障排除工具 JInfo
可以用來查看正在運行的 java 應用程序的擴展參數,包括Java System屬性和JVM命令行參數;也可以動態的修改正在運行的 JVM 一些參數。當系統崩潰時,jinfo可以從core文件裡面知道崩潰的Java應用程序的配置信息
命令格式
參數說明
pid對應jvm的進程id
executable core產生core mp文件
[server-id@]remote server IP or hostname遠程的ip或者hostname,server-id標記服務的唯一性id
option
no option輸出全部的參數和系統屬性
-flag name輸出對應名稱的參數
-flag [+|-]name開啟或者關閉對應名稱的參數
-flag name=value設定對應名稱的參數
-flags輸出全部的參數
-sysprops輸出系統屬性
Javacore 概述
Javacore,也可以稱為「threadmp」或是「javamp」,它是 Java 提供的一種診斷特性,能夠提供一份可讀的當前運行的 JVM 中線程使用情況的快照。即在某個特定時刻,JVM 中有哪些線程在運行,每個線程執行到哪一個類,哪一個方法。應用程序如果出現不可恢復的錯誤或是內存泄露,就會自動觸發 Javacore 的生成。
使用方法
1.jinfo pid:輸出當前 jvm 進程的全部參數和系統屬性
2.jinfo -flag name pid:輸出對應名稱的參數使用該命令,可以查看指定的 jvm 參數的值。如:查看當前 jvm 進程是否開啟列印 GC 日誌。
3.jinfo -flag [+|-]name pid:開啟或者關閉對應名稱的參數
使用 jinfo 可以在不重啟虛擬機的情況下,可以動態的修改 jvm 的參數。尤其在線上的環境特別有用。
4.jinfo -flag name=value pid:修改指定參數的值。
5.jinfo -flags pid:輸出全部的參數
6.jinfo -sysprops pid:輸出當前 jvm 進行的全部的系統屬性
jhat
主要是用來分析java堆的命令,可以將堆中的對象以html的形式顯示出來,包括對象的數量,大小等等,並支持對象查詢語言。
1.使用jmap命令導出堆文件jmap -mp:live,file=a.log pid
也可以使用下面方式導出堆文件
1、使用jconsole選項通過HotSpotDiagnosticMXBean從運行時獲得堆轉儲(生成mp文件)、
2、虛擬機啟動時如果指定了-XX:+HeapDumpOnOutOfMemoryError選項, 則在拋出OutOfMemoryError時, 會自動執行堆轉儲。
3、使用hprof命令
2.使用jhat分析堆文件jhat -J-Xmx512M a1.log
3.查看分析的html頁面
http://ip:7000/jhat中的OQL(對象查詢語言)
如果需要根據某些條件來過濾或查詢堆的對象,這是可能的,可以在jhat的html頁面中執行OQL,來查詢符合條件的對象
基本語法:
select
[from [instanceof] ]
[where ]
解釋:
(1)class name是java類的完全限定名,如:java.lang.String,java.util.ArrayList, C是char數組,java.io.File是java.io.File[]
(2)類的完全限定名不足以唯一的辨識一個類,因為不同的ClassLoader載入的相同的類,它們在jvm中是不同類型的
(3)instanceof表示也查詢某一個類的子類,如果不明確instanceof,則只精確查詢class name指定的類
(4)from和where子句都是可選的
(5)java域表示:obj.field_name;java數組表示:array[index]
舉例:
(1)查詢長度大於100的字元串
select s from java.lang.String s where s.count > 100
(2)查詢長度大於256的數組
select a from [I a where a.length > 256
(3)顯示匹配某一正則表達式的字元串
select a.value.toString() from java.lang.String s where /java/(s.value.toString())
(4)顯示所有文件對象的文件路徑
select file.path.value.toString() from java.io.File file
(5)顯示所有ClassLoader的類名
select classof(cl).name from instanceof java.lang.ClassLoader cl
(6)通過引用查詢對象
select o from instanceof 0xd404d404 o
built-in對象 -- heap
(1)heap.findClass(class name) -- 找到類
select heap.findClass("java.lang.String").superclass
(2)heap.findObject(object id) -- 找到對象
select heap.findObject("0xd404d404")
(3)heap.classes -- 所有類的枚舉
select heap.classes
(4)heap.objects -- 所有對象的枚舉
select heap.objects("java.lang.String")
(5)heap.finalizables -- 等待垃圾收集的java對象的枚舉
(6)heap.livepaths -- 某一對象存活路徑
select heaplivepaths(s) from java.lang.String s
(7)heap.roots -- 堆根集的枚舉
辨識對象的函數
(1)classof(class name) -- 返回java對象的類對象
select classof(cl).name from instanceof java.lang.ClassLoader cl
(2)identical(object1,object2) -- 返回是否兩個對象是同一個實例
select identical(heap.findClass("java.lang.String").name, heap.findClass("java.lang.String").name)
(3)objectid(object) -- 返回對象的id
select objectid(s) from java.lang.String s
(4)reachables -- 返回可從對象可到達的對象
select reachables(p) from java.util.Properties p -- 查詢從Properties對象可到達的對象
select reachables(u, "java.net.URL.handler") from java.net.URL u -- 查詢從URL對象可到達的對象,但不包括從URL.handler可到達的對象
(5)referrers(object) -- 返回引用某一對象的對象
select referrers(s) from java.lang.String s where s.count > 100
(6)referees(object) -- 返回某一對象引用的對象
select referees(s) from java.lang.String s where s.count > 100
(7)refers(object1,object2) -- 返回是否第一個對象引用第二個對象
select refers(heap.findObject("0xd4d4d4d4"),heap.findObject("0xe4e4e4e4"))
(8)root(object) -- 返回是否對象是根集的成員
select root(heap.findObject("0xd4d4d4d4"))
(9)sizeof(object) -- 返回對象的大小
select sizeof(o) from [I o
(10)toHtml(object) -- 返回對象的html格式
select "+ toHtml(o) + "" from java.lang.Object o
(11)選擇多值
select {name:t.name?t.name.toString():"null",thread:t} from instanceof java.lang.Thread t
數組、迭代器等函數
(1)concat(enumeration1,enumeration2) -- 將數組或枚舉進行連接
select concat(referrers(p),referrers(p)) from java.util.Properties p
(2)contains(array, expression) -- 數組中元素是否滿足某表達式
select p from java.util.Properties where contains(referres(p), "classof(it).name == 'java.lang.Class'")
返回由java.lang.Class引用的java.util.Properties對象
built-in變數
it -- 當前的迭代元素
index -- 當前迭代元素的索引
array -- 被迭代的數組
(3)count(array, expression) -- 滿足某一條件的元素的數量
select count(heap.classes(), "/java.io./(it.name)")
(4)filter(array, expression) -- 過濾出滿足某一條件的元素
select filter(heap.classes(), "/java.io./(it.name)")
(5)length(array) -- 返回數組長度
select length(heap.classes())
(6)map(array,expression) -- 根據表達式對數組中的元素進行轉換映射
select map(heap.classes(),"index + '-->' + toHtml(it)")
(7)max(array,expression) -- 最大值, min(array,expression)
select max(heap.objects("java.lang.String"),"lhs.count>rhs.count")
built-in變數
lhs -- 左邊元素
rhs -- 右邊元素
(8)sort(array,expression) -- 排序
select sort(heap.objects('[C'),'sizeof(lhs)-sizeof(rhs)')
(9)sum(array,expression) -- 求和
select sum(heap.objects('[C'),'sizeof(it)')
(10)toArray(array) -- 返回數組
(11)unique(array) -- 唯一化數組
jmap
列印進程、核心文件或遠程調試伺服器的共享對象內存映射或堆內存詳細信息。
jmap [option]
(to connect to running process) 連接到正在運行的進程
jmap [option]
(to connect to a core file) 連接到核心文件
jmap [option] [server_id@]
(to connect to remote debug server) 連接到遠程調試服務
option
pid:目標進程的PID,進程編號,可以採用ps -ef | grep java查看java進程的PID;
executable:產生core mp的java可執行程序;
core:將被列印信息的core mp文件;
remote-hostname-or-IP:遠程debug服務的主機名或ip;
server-id:唯一id,假如一台主機上多個遠程debug服務;
使用方法
jmap -mp:[live,]format=b,file= PID:使用hprof二進制形式,輸出jvm的heap內容到文件
jmap -finalizerinfo PID:列印正等候回收的對象的信息
jmap -heap PID:列印heap的概要信息,GC使用的演算法,heap(堆)的配置及JVM堆內存的使用情況。
jmap -histo:live PID:列印每個class的實例數目,內存佔用,類全名信息。VM的內部類名字開頭會加上前綴」*」. 如果live子參數加上後,只統計活的對象數量.
jmap -permstat PID:列印classload和jvm heap長久層的信息. 包含每個classloader的名字、活潑性、地址、父classloader和載入的class數量。另外,內部String的數量和佔用內存數也會列印出來。
-F強迫.在pid沒有相應的時候使用-mp或者-histo參數。在這個模式下,live子參數無效。
-h | -help列印輔助信息
-J傳遞參數給jmap啟動的jvm.
jstack命令主要用於調試java程序運行過程中的線程堆棧信息,可以用於檢測死鎖,進程耗用cpu過高報警問題的排查。jstack命令會列印出所有的線程,包括用戶自己啟動的線程和jvm後台線程。
命令格式
jstack -[option] pid
option
-F強制mp線程堆棧信息. 用於進程hung住,jstack命令沒有響應的情況
-m同時列印java和本地(native)線程棧信息,m是mixed mode的簡寫
-l列印鎖的額外信
公眾號「Java精選」所發表內容註明來源的,版權歸原出處所有(無法查證版權的或者未註明出處的均來自網路,系轉載,轉載的目的在於傳遞更多信息,版權屬於原作者。如有侵權,請聯系,筆者會第一時間刪除處理!
最近有很多人問,有沒有讀者交流群!加入方式很簡單,公眾號Java精選,回復「加群」,即可入群!
(微信小程序):3000+道面試題,包含Java基礎、並發、JVM、線程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架構設計等,在線隨時刷題!
------ 特別推薦 ------
特別推薦:專注分享最前沿的技術與資訊,為彎道超車做好准備及各種開源項目與高效率軟體的公眾號,「大咖筆記」,專注挖掘好東西,非常值得大家關注。點擊下方公眾號卡片關注。
文章有幫助的話,在看,轉發吧!
B. JDK命令介紹
命令jps用於列出java進程,直接運行jps不加任何參數,可以列出Java程序的進程ID以及Main函數等名稱。
參數-q指定jps只輸出進程ID,而不輸出類的短名稱
參數-m用於輸出傳遞給Java進程(主函數)的參數
參數 -l用於輸出主函數的完整路徑
參數 -v可以顯示傳遞給JVM的參數
jstat是一個可以用於觀察Java應用程序運行時信息喊告脊的工具。它的功能非常強大,可以通過它,查看堆信息的詳細使用情況。主要用於監控虛擬機的各種運行狀態信息,如類的裝載、內存、垃圾回收、JIT編譯器等,在沒有GUI的伺服器上,這款工具是首選的一款監控工具。
基本使用語法為:
選項option可以由以下值構成:
-class:顯示ClassLoader的相關信息。
-compiler:顯示JIT編譯的相關信息。
-gc:顯示與GC相關的堆信息。
-gccapacity:顯示各個代的容量及使用情況。
-gccause:顯示垃圾收集相關信息(同-gcutil),同時顯示最後一次或當前正在發生的垃圾收集的誘發原因。
-gcnew:顯示新生代信息。
-gcnewcapacity:顯示新生代大小與使用情況。
-gcold:顯示老年代與永久代的信息。
-gcoldcapacity:顯示老年代的大小。
-gcmetacapacity:顯示元空間的大小。(在java8之前是使用-gcpermcapacity顯示永久代的大小)
-gcutil:顯示垃圾收集信息。
-printcompilation:輸出JIT編譯的方法信息。
以上選項可以輸入 jstat -options 查看。
-t 參數可以在輸出信息前加一個 Timestamp 列,顯示程序的運行時間。
-h 參數可以在周期性數據輸出時,輸出多少行數據後,跟著輸出一個表頭信息。
vmid 參數就是Java進程id。
interval 參數用於指定輸出統計數據的周期,單位為毫秒。
count 用於指定一共輸出多少次數據。
jinfo 可以用來查看正在運行的Java運行程序的擴展參數,甚至支持在運行時修改部分參數。可以用來查看正在運行的 java 應用程序的擴展參數,包括Java System屬性和JVM命令行參數;也可以動態的修改正在運行的 JVM 一些參數。當系統崩潰時,jinfo可以從core文件裡面知道崩潰的Java應用程序的配置信息。
jmap 可以生成Java應用程序的堆快照和對象的統計信息。基本語法為:
option 選項如下:
-mp 生成java堆轉儲快照。格式為: -mp:[live,]format=b,file=,其中live子參數說明是否只mp出存活的對象
-finalizerinfo 顯示在F-Queue中等待友好Finalizer線程執行finalize方法的對象。只在linux/Solaris平台下有效
-heap 顯示java堆詳細信息,如使用哪種收集器、參數配置、分代情況等,在Linux/Solaris平台下有效
-histo 顯示堆中對象統計信息,包含類、實例對象、合集容量
-permstat 以ClassLoader為統計口徑顯示永久代內鄭滲存狀態。只在Linux/Solaris平台下有效
-F 當虛擬機進程對-mp選項沒有相應時。可使用這個選項強制生成mp快照。只在Linux/Solaris平台下有效
使用 jhat 工具可以用於分析Java應用程序的堆快照內容。jhat 在分析完成後,使用HTTP伺服器展示其分析結果。在瀏覽器中訪問 http://localhost:7000/
jstack 可用於導出Java應用程序的線程堆棧。語法為:
-l選項用於列印鎖的附加信息。
jstack 工具會在控制台輸出程序中所有的鎖信息,可以使用重定向將輸出保存到文件。
通過 jstack 工具不僅可以得到線程堆棧,它還能自動進行死鎖檢查,輸出找到的死鎖信息。
之前所述的工具中,只涉及到監控本機的Java應用程序。而在這些工具中,一些監控工具也支持對遠程計算機的監控(如:jps、jstat)。為了啟用遠程監控,則需要配合使用jstatd工具。
命令jstatd是一個RMI服務端程序,它的作用相當於代理伺服器,建立本地計算機與遠程監控工具的通信。jstatd伺服器將本機的Java應用程序信息傳遞到遠程計算機。
JConsole(Java Monitoring and ManagementConsole)工具時JDK自帶的圖形化性能監控工具。通過JConsole工具,可以查看Java應用程序的運行概況,監控堆信息、永久區使用情況、類載入情況等。
C. jdk怎麼用啊
D:Javajdk1.5.0in 目錄下都是jdk的工具,使用java編程主要用到的是javac.exe、java.exe這兩個命令行工具。具體使用步驟如下:
1、配置java系統環境變數:新建文本文件,復制下面代碼,然後另存為jdk.bat文件。 @echo setx /M JAVA_HOME "D:Javajdk1.5.0" setx /M CLASSPATH ".;%%JAVA_HOME%%lib;%%JAVA_HOME%%lib ools.jar;" setx /M PATH "%PATH%;%%JAVA_HOME%%in;%%JAVA_HOME%%jrein;" pause
D. centos7安裝 java 顯示java -version成功 但javac命令找不到
E. linux上如何安裝jstatd服務
此命令是一個RMI Server應用程序,提供了對JVM的創建和結束監視,也為遠程監視工具提供了一個可以attach的介面
options
-nr 當一個存在的RMI Registry沒有找到時,不嘗試創建一個內部的RMI Registry
-p port 埠號,默認為1099
-n rminame 默認為JStatRemoteHost;如果多個jstatd服務開始在同一台主機上,rminame唯一確定一個jstatd服務
-J jvm選項
jstatd
會報如下錯誤:
Could not create remote object access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write) java.security.AccessControlException: access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write) at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323) at java.security.AccessController.checkPermission(AccessController.java:546) at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) at java.lang.System.setProperty(System.java:727) at sun.tools.jstatd.Jstatd.main(Jstatd.java:122)
這是因為沒有給jstatd指定安全策略
創建安全策略文件,並命名為jstatd.all.policy
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
再次啟動
C:\Program Files\Java\jdk1.6.0_16\bin>jstatd -J-Djava.security.policy=jstatd.all.policy
利用jps查看正在運行的java命令
jps
C:\Documents and Settings\lulu>jps
4892 Bootstrap
1296 Jstatd
4484 Jps
3332 org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar
此時就可以使用jvisualvm.exe以遠程的方式監控JVM相關信息了。
更多例子
(1)使用內部RMI Registry
jstatd -J-Djava.security.policy=all.policy (默認埠為1099)
(2)使用外部RMI Registry
a)使用默認值
rmiregistry&
jstatd -J-Djava.security.policy=all.policy
b)使用2020埠
rmiregistry 2020&
jstatd -J-Djava.security.policy=all.policy -p 2020
c)使用2020埠,使用rminame
rmiregistry 2020&
jstatd -J-Djava.security.policy=all.policy -p 2020 -n AlternateJstatdServerName
(3)RMI Registry已經啟動,不創建內部RMI Registry
jstatd -J-Djava.security.policy=all.policy -nr
(4)RMI日誌能力
jstatd -J-Djava.security.policy=all.policy -J-Djava.rmi.server.logCalls=true
F. 如何使用JDK自帶jvisualvm監控工具
對於使用命令行遠程監控jvm 太麻煩 。 在jdk1.6 中 Oracle 提供了一個新的可視化的。 JVM 監控工具 Java VisualVM 。jvisualvm.exe 在JDK 的 bin 目錄下。
「本地 」下顯示的是在 localhost 運行的 Java 程序的資源佔用情況,如果本地有 Java 程序在運行的話啟動 Java VisualVM 即可看到相應的程序名,點擊程序名打開相應的資源監控菜單,以圖形的形式列出程序所佔用的 CPU 、 Heap 、 PermGen 、類、線程的 統計信息。
「遠程」 項下列出的遠程主機上的 Java 程序的資源佔用情況,但需要在遠程主機上運行 jstatd 守護程序
G. Java有沒有這樣的命令行參數工具
Java 命令行工具總結
1、命令
C/Documents and Settings/Zianed>ls 『%JAVA_HOME%』/bin
HtmlConverter.exe javap.exe jstatd.exe rmid.exe
appletviewer.exe javaw.exe jvisualvm.exe rmiregistry.exe
apt.exe javaws.exe keytool.exe schemagen.exe
beanreg.dll jconsole.exe kinit.exe serialver.exe
extcheck.exe jdb.exe klist.exe servertool.exe
idlj.exe jhat.exe ktab.exe tnameserv.exe
jar.exe jinfo.exe msvcr71.dll unpack200.exe
jarsigner.exe jli.dll native2ascii.exe wsgen.exe
java-rmi.exe jmap.exe orbd.exe wsimport.exe
java.exe jps.exe pack200.exe xjc.exe
javac.exe jrunscript.exe packager.exe
javadoc.exe jstack.exe policytool.exe
javah.exe jstat.exe rmic.exe
需要獲得其中的幫助使用XX -help即可
Basic Tools
These tools are the foundation of the JDK. They are the tools you use to create and build applications.
Tool Name Brief Description Links to Reference Pages
javac The compiler for the Java programming language. [Solaris and Linux ] [Windows ]
java The launcher for Java applications. In this release, a single launcher is used both for development and deployment.
The old deployment launcher, jre , is no longer provided. [Solaris and Linux ] [Windows ]
javadoc API documentation generator.
See Javadoc Tool page for doclet and taglet APIs. [Solaris and Linux ] [Windows ]
apt Annotation processing tool.
See Annotation Processing Tool for program annotation processing. [Solaris, Linux, and Windows ]
appletviewer Run and debug applets without a web browser. [Solaris and Linux ] [Windows ]
jar Create and manage Java Archive (JAR) files.
See Java Archive Files page for the JAR specification. [Solaris and Linux ] [Windows ]
jdb The Java Debugger.
See JPDA for the debugger architecture specifications. [Solaris and Linux ] [Windows ]
javah C header and stub generator. Used to write native methods. [Solaris and Linux ] [Windows ]
javap Class file disassembler [Solaris and Linux ] [Windows ]
extcheck Utility to detect Jar conflicts. [Solaris and Linux ] [Windows ]
--------------------------------------------------------------------------------
Monitoring and Management Tools
You can use the following tools to monitor JVM performance and resource consumption. The tools described in this section are unsupported and experimental , and should be used with that in mind. They may not be available in future JDK versions.
Platform support:
•jconsole: all platforms.
•jps, jstat, and jstatd: all platforms except Windows 98 and Windows ME.
For more information, see Monitoring and Management for the Java Platform .
Tool Name Brief Description
jconsole Experimental : Java Monitoring and Management Console – JMX-compliant graphical tool for monitoring a Java virtual machine. It can monitor both local and remote JVMs.
jps Experimental : JVM Process Status Tool – Lists instrumented HotSpot Java virtual machines on a target system.
jstat Experimental : JVM Statistics Monitoring Tool – Attaches to an instrumented HotSpot Java virtual machine and collects and logs performance statistics as specified by the command line options.
jstatd Experimental : JVM jstat Daemon – Launches an RMI server application that monitors for the creation and termination of instrumented HotSpot Java virtual machines and provides a interface to allow remote monitoring tools to attach to Java virtual machines running on the local system.
--------------------------------------------------------------------------------
Troubleshooting Tools
The following tools can be used for specific troubleshooting tasks. The tools described in this section are unsupported and experimental in nature and should be used with that in mind. They may not be available in future JDK versions.
These tools are not currently available on Windows platforms .
Tool Name Brief Description
jinfo Experimental – Configuration Info for Java – Prints configuration information for for a given process or core file or a remote debug server.
jmap Experimental – Memory Map for Java – Prints shared object memory maps or heap memory details of a given process or core file or a remote debug server.
jsadebugd Experimental – Serviceability Agent Debug Daemon for Java – Attaches to a process or core file and acts as a debug server.
jstack Experimental – Stack Trace for Java – Prints a stack trace of threads for a given process or core file or remote debug server.
2 、命令簡單介紹
2.1 HtmlConverter
2.2 appletviewer
查看Applet程序的運行結果。
2.3 apt
2.4 extcheck
2.5 idlj
2.6 jar
將一個文件打成jar包,以提供給給程序,方便使用。
bash-3.2$ jar -help
非法選項:h
用法: jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] files …
選項包括:
-c 創建新的歸檔文件
-t 列出歸檔目錄
-x 解壓縮已歸檔的指定(或所有)文件
-u 更新現有的歸檔文件
-v 在標准輸出中生成詳細輸出
-f 指定歸檔文件名
-m 包含指定清單文件中的清單信息
-e 為捆綁到可執行 jar 文件的獨立應用程序
指定應用程序入口點
-0 僅存儲;不使用任何 ZIP 壓縮
-M 不創建條目的清單文件
-i 為指定的 jar 文件生成索引信息
-C 更改為指定的目錄並包含其中的文件
如果有任何目錄文件,則對其進行遞歸處理。
清單文件名、歸檔文件名和入口點名的指定順序
與 「m」、」f」 和 「e」 標志的指定順序相同。
示例 1:將兩個類文件歸檔到一個名為 classes.jar 的歸檔文件中:
jar cvf classes.jar Foo.class Bar.class
示例 2:使用現有的清單文件 「mymanifest」 並
將 foo/ 目錄中的所有文件歸檔到 「classes.jar」 中:
jar cvfm classes.jar mymanifest -C foo/ .
bash-3.2$ jar -cvf zianed.jar *.class
標明清單(manifest)
增加:A.class(讀入= 112) (寫出= 105)(壓縮了 6%)
增加:B.class(讀入= 246) (寫出= 184)(壓縮了 25%)
bash-3.2$
2.7 jarsigner
2.8 java-rmi
2.9 java
執行java語言,期中包括了一部分的java執行可以使用和引入的參數;也包括了部分執行時的信息收集信息。
bash-3.2$ java -version
java version 「1.6.0_10″
Java(TM) SE Runtime Environment (build 1.6.0_10-b33)
Java HotSpot(TM) Client VM (build 11.0-b15, mixed mode)
2.10 javac
java編譯器,將java源文件編譯成可以供jvm執行的二進制class文件。
bash-3.2$ javac -version
javac 1.6.0_10
2.11 javadoc
根據源文件生成java的doc文檔API。
2.12 javah
bash-3.2$ cd zianed
bash-3.2$ ls B.*
B.class B.java
bash-3.2$ cd ..
bash-3.2$ javah zianed.B
bash-3.2$ ls
zianed zianed_B.h
bash-3.2$
2.13 javap
將java位元組碼文件進行反編譯的工具。
bash-3.2$ javap zianed.B
Compiled from 「B.java」
public class zianed.B extends java.lang.Object implements zianed.A{
public zianed.B();
public void print();
public native java.lang.String getInfo();
}
bash-3.2$
2.14 javaw
The javaw command is identical to java , except that with javaw there is no associated console window. Use javaw when you don』t want a command prompt window to appear. The javaw launcher will, however, display a dialog box with error information if a launch fails for some reason.
2.15 javaws:
2.16 jconsole
Java Monitoring and Management Console
啟動java進程監控和管理控制台。監控和分析jvm的運行情況。
用法: jconsole [ -interval=n ] [ -notile ] [ -pluginpath <path> ] [ -version ] [ connection ...]
-interval 將更新間隔時間設置為 n 秒(默認值為 4 秒)
-notile 最初不平鋪顯示窗口(對於兩個或更多連接)
-pluginpath 指定 jconsole 用於查找插件的路徑
-version 輸出程序版本
connection = pid || host:port || JMX URL (service:jmx:<protocol>://…)
pid 目標進程的進程 ID
host 遠程主機名或 IP 地址
port 用於遠程連接的埠號
-J 對正在運行 jconsole 的 Java 虛擬機指定輸入參數
Options are mutually exclusive. Option, if used, should follow immediately after the command name.
jstack prints Java stack traces of Java threads for a given Java process or core file or a remote debug server.
bash-3.2$ jstack -help
The jstatd tool is an RMI server application that monitors for the creation and termination of instrumented HotSpot Java virtual machines (JVMs) and provides a interface to allow remote monitoring tools to attach to JVMs running on the local host.
bash-3.2$ jstatd –help
Virtual Machine jstat Daemon
usage: jstatd [-nr] [-p port] [-n rminame]
2.26 jvisualvm
啟動VisualVM查看VM狀態。
bash-3.2$ jvisualvm &
[1] 3660
bash-3.2$
2.27 keytool
2.28 kinit
2.29 klist
2.30 ktab
2.31 native2ascii
對文件轉換編碼。
用法:native2ascii [-reverse] [-encoding 編碼] [輸入文件 [輸出文件]]
2.32 orbd
2.33 pack200
2.34 packager
2.35 polocytool
2.36 rmic
2.37 rmid
2.38 rmiregisty
2.39 schemagen
2.40 serialver
2.41 servertool
2.42 tnameserv
2.43 unpack200
2.44 wsgen
2.45 wsimport
2.46 xjc
3、jvm的部分參數
也就是在啟動Java虛擬機、或者執行JAVA時應該添加的程序。
Windows平台下在以下路徑下存在參數說明。
-Xmixed mixed mode execution (default)
-Xint interpreted mode execution only
-Xbootclasspath<directories and zip/jar files separated by ;>
set search path for bootstrap classes and resources
-Xbootclasspath/a<directories and zip/jar files separated by ;>
append to end of bootstrap class path
-Xbootclasspath/p<directories and zip/jar files separated by ;>
prepend in front of bootstrap class path
-Xnoclassgc disable class garbage collection
-Xincgc enable incremental garbage collection
-Xloggc<file> log GC status to a file with time stamps
-Xbatch disable background compilation
-Xms<size> set initial Java heap size
-Xmx<size> set maximum Java heap size
-Xss<size> set java thread stack size
-Xprof output cpu profiling data
-Xfuture enable strictest checks, anticipating future default
-Xrs rece use of OS signals by Java/VM (see documentation)
-Xcheckjni perform additional checks for JNI functions
-Xshareoff do not attempt to use shared class data
-Xshareauto use shared class data if possible (default)
-Xshareon require using shared class data, otherwise fail.
The -X options are non-standard and subject to change without notice.
5 、最常用的工具
javac Java源代碼編譯工具
H. 嘗試連接到gc配置不可用
連接到gc配置搏或不可用解決步驟如下。
1、首先修改遠程伺服器上java設置。
2、找到jdk下的/jre/lib/security/java.policy文件,打開此文件,在文件末尾的括弧前添加基稿伍permissionjava.security.AllPermission。後保存。
3、在jdk/bin目錄下運行命令窗口輸入:jstatd-J-Djava.security.policy=jstatd.all.policy-J-Djava.rmi.server.hostname=192.168.2.85-p2030,接著運行即可。
4、本地啟動VisualVM,在配置JMX時已經添加過伺服器節點,如果敬並配置正確,通常gc會自動檢測到jstatd連接並添加節點。
I. jvisualvm的使用
1.jvisualvm在安裝完jdk的時候就已經存在了,放在jdk安裝目錄bin下面
2.jvisualvm的使用
/usr/local/java/bin/jvisualvm &
3.監控本地和監控遠程
1)監控本地:
標簽介紹:
概述:顯示的是該伺服器的啟動和系統參數,可以通過與伺服器的實際參數進行對比查看是否有內存溢出
監控:顯示的是當前系統的CPU、內存、類和線程的相關資源的使用情況。其中"堆mp"可以查看堆的詳細狀態,包括堆的概況,裡面所有的類,還能點進具體的一個類查看這個類的狀態。
線程:能夠顯示線程的名稱和運行的狀態,在調試多線程時必不可少,而且可以點進一個線程查看這個線程的詳細運行情況
抽樣器:(可針對cpu和內存進行抽樣監控)
2).遠程tomcat監控
1)修改修改 /{tomcat path}/bin/catalina.sh, 找到第一個沒注釋的JAVA_OPTS,在前面添加
2)將8099埠開放---->添加防火牆
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8099 -j ACCEPT
重啟防火牆---->/etc/init.d/iptables restart
3)jvisualvm添加遠程tomcat監控
3)遠程java應用程序(非tomcat):
方法1:(在啟動的時候添加啟動參數)
nohup java -Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9005
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.net.preferIPv4Stack=true
-Djava.rmi.server.hostname=192.168.9.174 -jar monitor_tuning-0.0.1-SNAPSHOT.jar &
注意埠號9005要開放,添加防火牆 !
方法2:使用jstatd
1)在$JAVA_HOME/bin目錄下新建一個文件jstatd.all.policy(名稱隨意),內容如下:
grant codebase "file:/usr/local/java/lib/tools.jar" {
permission java.security.AllPermission;
};
2)然後執行
jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=192.168.9.174 -p 1099 &
在jvisualvm裡面添加遠程主機 192.168.9.174,然後右鍵添加jstatd連接,埠默認。jvisualvm即可掃描出所有正在運行的JVM,點擊即可監控。
注意:此處需要添加防火牆(此處好多文章都沒有說關於防火牆的問題)
兩種方法比較:
1)jmx是jvm自身提供的一個標準的jmx管理功能,client支持度非常好,jvm監控工具基本上都會支持這種連接方式。而且只要配置幾個簡單的選項就可以使用了,不需要單獨啟動一個第三方的只用來監控連接的應用程序
2)jstatd是jdk提供的一個單獨的工具,一個主機只需要運行一個jstatd就可以監控主機上所有的java application,而因為jmx是集成在jvm中,如果主機上有多個java應用程序需要監控,需要每個java應用程序配置相應的jmx選項,而且遠程服務埠不能相同,client監控時也需要與每個java應用程序建立單獨的連接
3)java應用程序啟動時如果沒有配置相應的jmx選項,則在運行周期內都無法遠程監控應用程序,這可能會喪失定位問題的機會。而jstatd需要監控時,可以隨時運行並進行監控
4) 在jvisualvm中,只有通過jstatd連接才能使用visualGC插件功能
5)jstatd server的埠是隨機選擇的,在有些情況下可能無法使用。比如我司的辦公區域與生產區域之間網路設置了防火牆,只允許某個范圍的埠通過,這是公司級的,某個團隊無法修改防火牆策略。同時辦公區域也不能直接ssh訪問生產區域伺服器,必須經過一個relay,也不能使用jstatd over ssh的方式。個人覺得jstatd不能在啟動時顯示指定服務的埠是它的一個槽點
4.插件安裝:
參考文章:https://www.cnblogs.com/looyee/articles/11065093.html
J. jvisualvm遠程監控無法連接是什麼原因
jvisualvm是Jdk自帶的,具體點,據說是jdk1.6-07後加到jdk中的。本地監控很簡單,在JAVA_HOME/bin中打開jvisualvm即可,所有本機的java程序會自動列出來。我們來說下遠程監控的問題。
當然網上有很多相關資料,我就把我實踐的結果列出來吧。
環境, 本地: WIN-XP sp3, jdk1.6.0_17 遠端:CentOS5.1, jdk1.6.0_3
具體步驟如下,
1. 啟動遠端jstatd.
1.1 配置[b]java[/b]安全訪問,將如下的代碼存為文件 jstatd.all.policy (名字隨便起),但要放到JAVA_HOME/bin中,其內容如下,
grant codebase"file:${java.home}/../lib/tools.jar"{ permission java.security.AllPermission; };
1.2 進入到JAVA_HOME/bin中,執行./jstatd -J-Djava.security.policy=jstatd.all.policy
註:這時候能啟動正常,但是後面本地用 jvisualvm的時候拋異常,
Java代碼
<span style="font-size: small;">java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:519)
at java.net.Socket.connect(Socket.java:469)
at java.net.Socket.<init>(Socket.java:366)
at java.net.Socket.<init>(Socket.java:180)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:595)
Caused: java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is:
java.net.ConnectException: Connection refused: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:601)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:198)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:110)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:178)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132)
at $Proxy7.activeVms(Unknown Source)
at sun.jvmstat.perfdata.monitor.protocol.rmi.RemoteVmManager.activeVms(RemoteVmManager.java:82)
Caused: sun.jvmstat.monitor.MonitorException: Error communicating with remote host: Connection refused to host: 127.0.0.1; nested exception is:
java.net.ConnectException: Connection refused: connect
at sun.jvmstat.perfdata.monitor.protocol.rmi.RemoteVmManager.activeVms(RemoteVmManager.java:85)
at sun.jvmstat.perfdata.monitor.protocol.rmi.MonitoredHostProvider.activeVms(MonitoredHostProvider.java:217)
at com.sun.tools.visualvm.jvmstat.application.JvmstatApplicationProvider.processNewHost(JvmstatApplicationProvider.java:126)
at com.sun.tools.visualvm.jvmstat.application.JvmstatApplicationProvider.access$000(JvmstatApplicationProvider.java:69)
at com.sun.tools.visualvm.jvmstat.application.JvmstatApplicationProvider$5$1.run(JvmstatApplicationProvider.java:276)
at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:572)
[catch] at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:997)
==>
</span>
據查,有兩種方法解決,一種是把 /etc/hosts中的ip改成實際的IP,然後重啟網路,但我用此法沒有解決問題。另一種是,在jstatd後加hostname的參數,如下,
./jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=192.168.0.23
我用第二種方法解決了此問題。
2.打開本地的jvisualvm, 右鍵Remort,選擇 "Add Remort Host...",在彈出框中輸入你的遠端IP,比如192.168.0.23. 連接成功後如圖,
其中CPU一項顯示"NOT supported for this JVM",不知何故,難道是遠端的jdk版本需要升級到jdk1.6.0_17? 還沒有試。 另外「Perform GC」跟"Heap Dump"都亮,也不知何故。
順便解釋下Heap跟PermGen的區別, 一般而言,PerGen放的是類的定義;而Heap裡面放的是類的實例;所以一般程序穩定運行後,PermGen基本保持不變,要變也只會增加,因為GC只會掃描heap中的實例;而Heap變化較大,OutOfMemory一般也是Heap不夠了。