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的运行状态
    Java8 mac、linux使用jinfo,jstat命令报错问题 Can't attach symbolicator to the process_第1张图片

  • jinfo:用来查看正在运行的 java 应用程序的扩展参数,包括Java System属性和JVM命令行参数;也可以动态的修改正在运行的 JVM 一些参数。

Java8 mac、linux使用jinfo,jstat命令报错问题 Can't attach symbolicator to the process_第2张图片

特别说明两个命令 -->

  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堆栈信息

Java8 mac、linux使用jinfo,jstat命令报错问题 Can't attach symbolicator to the process_第3张图片

  • HSDIS:jit生成代码反汇编

  • jconsole:图形工具,监控jvm运行情况
    Java8 mac、linux使用jinfo,jstat命令报错问题 Can't attach symbolicator to the process_第4张图片

  • jvisualvm:个人感觉visualVm比jconsole功能更强大一些,默认携带的功能包括监视CPU,堆的总占用,线程和加载类信息,heapdump等。
    两个图形工具都支持远程连接。

四、总结

写这篇文章主要是因为工作后使用mac,在java8的环境下存在jvm性能监控工具报错的问题。并对问题进行了总结。如果是线上linux环境,可是开启ptrace_scope,命令就可以使用了。如果是mac的话,emmm我相信你就是在敲着这些命令玩儿,连你的阿里云吧~

你可能感兴趣的:(jvm,Java基础)