Java8 mac、linux使用jinfo,jstat命令報錯問題 Can't attach symbolicator to the process

一、背景

之前在最開始學習jvm的時候使用過一些java的監控命令,但是沒有特別深入的去理解。工作之後最近重新學習,卻產生了 ***Can’t attach symbolicator to the process***這樣的報錯,可以說出師不利。

詳細報錯信息如下圖:

二、問題解決

有的地方說是系統的安全權限有問題,有的地方說是 JDK 的 bug。
經過一番整理,發現這個問題和平臺有關係。

  1. Linux:ptrace-scope 機制。 新版的Linux系統加入了 ptrace-scope 機制.。這種機制爲了防止用戶訪問當前正在運行的進程的內存和狀態, 而一些調試軟件本身就是利用 ptrace 來進行獲取某進程的內存狀態的(包括GDB),所以在新版本的Linux系統, 默認情況下不允許再訪問了。
    可以如下命令進行開啓. 如:
echo 0 > /proc/sys/kernel/yama/ptrace_scope

永久寫到文件來持久化:

emacs /etc/sysctl.d/10-ptrace.conf
 
// 添加或修改爲以下這一句:(0:允許, 1:不允許)
kernel.yama.ptrace_scope = 0
 
  1. MacOS:這就是個bug。 遍搜google,都沒有找到解決的辦法,唯一能夠找到解決問題的方法就是–>升級jdk至9版本以上。

三、jvm性能監控於故障處理工具

  • jps:虛擬機進程狀況工具:查看當前運行的java進行,後面的許多命令都是基於此命令找到pid再進一步排查問題。

  • jstat:虛擬機統計信息監視工具,如每隔10s監視jvm的運行狀態

  • jinfo:用來查看正在運行的 java 應用程序的擴展參數,包括Java System屬性和JVM命令行參數;也可以動態的修改正在運行的 JVM 一些參數。

在這裏插入圖片描述

特別說明兩個命令 -->

  1. jinfo -flag [ + | - ]name pid
    開啓或者關閉對應名稱的參數。使用 jinfo 可以在不重啓虛擬機的情況下,可以動態的修改 jvm 的參數。尤其在線上的環境特別有用。
  2. jinfo -flag name=value pid
    修改指定參數的值。上一條命令主要是針對參數是true或false的。如果是設置 value值,則需要使用 name=value 的形式。
  • jmap: java內存映像工具 (在jdk9及以上,jmap工具被jhsdb jmap代替),用於查看整個JVM內存狀態
    詳細的使用方法見文章:https://www.jianshu.com/p/c0a5219aede2

  • jhat:虛擬機堆轉儲快照分析工具
    Jhat用於對JAVA heap進行離線分析的工具,他可以對不同虛擬機中導出的heap信息文件進行分析,如LINUX上導出的文件可以拿到WINDOWS上進行分析,可以查找諸如內存方面的問題,使用方式可以查看這篇文章:https://blog.csdn.net/gtuu0123/article/details/6039474

  • jstack:java堆棧跟蹤工具

jstack用於打印出給定的java進程ID或core file或遠程調試服務的Java堆棧信息

  • HSDIS:jit生成代碼反彙編

  • jconsole:圖形工具,監控jvm運行情況

  • jvisualvm:個人感覺visualVm比jconsole功能更強大一些,默認攜帶的功能包括監視CPU,堆的總佔用,線程和加載類信息,heapdump等。
    兩個圖形工具都支持遠程連接。

四、總結

寫這篇文章主要是因爲工作後使用mac,在java8的環境下存在jvm性能監控工具報錯的問題。並對問題進行了總結。如果是線上linux環境,可是開啓ptrace_scope,命令就可以使用了。如果是mac的話,emmm我相信你就是在敲着這些命令玩兒,連你的阿里雲吧~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章