Ⅰ 如何使用JVisualVM進行性能分析
1、本地機器的程序直接可以監聽到
2、遠程機器的程序需要加上JVM參數
-Dcom.sun.management.jmxremote=
true
-Dcom.sun.management.jmxremote.port=
9090
-Dcom.sun.management.jmxremote.ssl=
false
-Dcom.sun.management.jmxremote.authenticate=
false
備註:另外需要檢查
hostname –i
看解析出來是否為本地的IP,如是127.0.0.1或者IP為多個IP中之一,則其他的IP無效,會連接不上。
這里有個分析案例,利用jvisualvm分析tomcat的問題:
http://blog.tty.nl/2010/09/03/using-visualvm-to-fix-live-tomcat-and-jvm-problems
插件安裝
tools->plugin->Available Plugin 會有值得安裝的插件,如:VisualGC
JConsole
插件列表:https://visualvm.dev.java.net/plugins.html
注意:上面提供的埠配置有些麻煩,不如直接這樣做:
要使用 VisualGC
必須在遠程機上啟動jstatd代理程序,否則會顯示 「not supported for this jvm」 錯誤
而啟動 jstatd 時會有一個許可權問題,需要做如下修改:
nano /opt/sun-jdk-
1.6
.
0.26
/jre/lib/security/java.policy
Java代碼
nano /opt/sun-jdk-1.6.0.26/jre/lib/security/java.policy
增加下列行
Java代碼
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
然後啟動 jstatd並且不要關閉
如:
Threads
查看線程的運行情況,運行、停止、睡眠、等待,根據這些結合實際程序運行的邏輯分析。
找到可疑份子,可以Thread Dump 找出具體是哪個線程在作祟。
參看這個例子:http://blog.tty.nl/2010/09/03/using-visualvm-to-fix-live-tomcat-and-jvm-problems
profile
關於如何使用,如何分析程序,可以參看這個例子:http://www.baptiste-wicht.com/2010/07/profile-applications-java-visualvm/
Ⅱ 如何用VisualVM連接遠程Tomcat
1、設置Tomcat的JAVA_OPTS參數:
JAVA_OPTS="$JAVA_OPTS
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=9090
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=10.154.252.108"
此處IP填的是所在遠程機器的IP(hostname -i ),需要確保這個埠沒程序佔用。
可以直接把這個參數寫入到catalina.sh文件中。
2、添加JMX連接,並填入IP和剛剛設置的埠。
連接完成之後,監視、線程、概述選項卡可以正常顯示,也可以添加插件,選擇「工具 - 插件」。可以添加新的插件,此處我們添加了一個名叫 Visual GC 的插件,用於監控JVM 的垃圾回收情況。
4、美中不足的是, Visual GC 並不買賬,無法顯示。
Visual GC uses the jvmstat technology to gather data from the monitored application. This means that the monitored application must either run locally or there must be a jstatd agent up and running on the remote system. For remote applications added using the JMX connection you will only see the "Not supported for this JVM" message - there's no jvmstat available.
引用自:https://blogs.oracle.com/nbprofiler/entry/visual_gc_plugin_2_0
使用JMX監控的功能不支持Visual GC,需要以jstatd的方式來監控。
5、使用Jstatd方式關聯監控
Jstatd方法是利用後台的RMI守護進程來實現對遠程JVM的監控。啟動jstatd不復雜,
找到tomcat所在機器的Java目錄,在bin目錄下首先創建一個監控策略文件:
?
1
2
3
4
vi jstatd.all.policy
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
把"${java.home}/../"替換成JAVA安裝目錄。然後執行如下命令啟動jstatd:jstatd -J-Djava.security.policy=jstatd.all.policy
查看jstatd是否啟動:
[root@vm-10-154-252-108 bin]# jps -l 127.0.0.1
8618 sun.tools.jps.Jps
7516 sun.tools.jstatd.Jstatd
15815 org.apache.catalina.startup.Bootstrap
7670 org.apache.catalina.startup.Bootstrap
21315 org.apache.catalina.startup.Bootstrap
21481 org.apache.catalina.startup.Bootstrap
11470 org.apache.catalina.startup.Bootstrap
15649 org.apache.catalina.startup.Bootstrap
15732 org.apache.catalina.startup.Bootstrap
21398 org.apache.catalina.startup.Bootstrap
11634 org.apache.catalina.startup.Bootstrap
5、刪除VisualVM之前對Tomcat的監控,添加「遠程主機」,輸入主機IP,通過「高級設置」可以看到遠程主機默認是jstatd方式監控的。
點擊確定,將會列出該機器上所有的可監控的Java程序,
找到我們需要監控的程序PID,雙擊:
Ⅲ jstatd 是用java寫的么
1、介紹
jstatd是一個基於RMI(Remove Method Invocation)的服務程序,它用於監控基於HotSpot的JVM中資源的創建及銷毀,並且提供了一個遠程介面允許遠程的監控工具連接到本地的JVM執行命令。
jstatd是基於RMI的,所以在運行jstatd的伺服器上必須存在RMI注冊中心,如果沒有通過選項"-p port"指定要連接的埠,jstatd會嘗試連接RMI注冊中心的默認埠。後面會談到如何連接到一個默認的RMI內部注冊中心,如何禁止默認的RMI內部注冊中心的創建,以及如何啟動一個外部注冊中心。
2、參數選項
jstatd命令支持如下的選項:
-nr 如果RMI注冊中心沒有找到,不會創建一個內部的RMI注冊中心。
-p port RMI注冊中心的埠號,默認為1099。
-n rminame 默認為JStatRemoteHost;如果同一台主機上同時運行了多個jstatd服務,rminame可以用於唯一確定一個jstatd服務;這里需要注意一下,如果開啟了這個選項,那麼監控客戶端遠程連接時,必須同時指定hostid及vmid,才可以唯一確定要連接的服務,這個可以參看jps章節中列出遠程伺服器上Java進程的示例。
-J 用於傳遞jvm選項到由javac調用的java載入器中,例如,「-J-Xms48m」將把啟動內存設置為48M,使用-J選項可以非常方便的向基於Java的開發的底層虛擬機應用程序傳遞參數。
Ⅳ 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
Ⅳ java RMI 如何返回遠程對象的引用
利用java的對象序列化和反序列化來傳遞對象就OK了。
序列化需要實現介面Serializable
需要定義序列化idserialVersionUID;
大致代碼如下:
cvoidSerializePerson()throwsFileNotFoundException,IOException{
Objectobj=newObject();
//ObjectOutputStream對象輸出流,將對象存儲到E盤的obj.txt文件中,完成對Object對象的序列化操作
ObjectOutputStreamos=newObjectOutputStream(newFileOutputStream(newFile("E:/obj.txt")));
os.writeObject(obj);
System.out.println("序列化成功!");
os.close();
}
()throwsException,IOException{
ObjectInputStreamois=newObjectInputStream(newFileInputStream(newFile("E:/obj.txt")));
Objectobj=ois.readObject();
System.out.println("反序列化成功!");
returnobj;
}另外有點好奇RMI這玩意多麻煩呀,老早就沒啥人用了吧。。。。。。
對了 序列化成JSON格式,接收後再轉換回來會更方便!
Ⅵ java visualvm監控linux系統tomcat需要怎麼配置
方法一
修改catalina.sh,添加下面一行:
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote=true -Djava.rmi.server.hostname=192.168.1.106 -Dcom.sun.management.jmxremote.port=8086 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false "
注意點:
1、用hostname -i 查看是否為127.0.01,如果是,則必須配置-Djava.rmi.server.hostname為本機IP。
2、檢查防火牆(iptables)是否開啟,以及是否開放jmxremote.port所指定的埠。
方法二
1、在JDK/bin下新建一文本文件, 名稱 jstatd.all.policy
內容如下:
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
2、運行tomcat
3、運行 jstatd -J-Djava.security.policy=jstatd.all.policy
若需要指定埠,使用jstatd -J-Djava.security.policy=all.policy -p 1982
若需要指定本機IP,使用-J-Djava.rmi.server.hostname=192.168.1.106