JPS无法查看已经启动的Java进程信息

问题描述:启动Hbase集群中RegionServer后,通过JPS无法查看到该进程号,导致无法通过jstat来查看regionserver的内存情况,来做一些JVM参数调优。

在网上查询到的一些信息来看:

java程序启动后,默认(请注意是默认)会在/tmp/hsperfdata_userName目录下以该进程的id为文件名新建文件,并在该文件中存储jvm运行的相关信息,其中的userName为当前的用户名,/tmp/hsperfdata_userName目录会存放该用户所有已经启动的java进程信息。对于windows机器/tmp用Windows存放临时文件目录代替。而jps、jconsole、jvisualvm等工具的数据来源就是这个文件(/tmp/hsperfdata_userName/pid)。所以当该文件不存在或是无法读取时就会出现jps无法查看该进程号,jconsole无法监控等问题

因此需要确保进程文件的存在,有下面三种情况需要确认:

  1. 磁盘读写、目录权限问题 (需要确认当前用户userName对路径/tmp/hsperfdata_userName/,及其下面的文件是否有读写权限,还应当却/tmp目录是否可写)
  2. 临时文件丢失,被删除或是定期清理(需确认/tmp/hsperfdata_userName/下的文件是否被定时清除了,最简单的办法就是重启该进程看看)
  3. java进程信息文件存储地址被设置,不在/tmp目录下 (启动进程的时候可以通过-Djava.io.tmpdir参数来设置进程信息存储地址,jps、jconsole都只会从/tmp目录读取,因此需要确认是否被修改过)

详细确认过上面三点之后,Jps还是无法查看到进程号,当前用户虽然对/tmp/hsperfdata_userName/路径有读写权限,但是该路径下没有相应的进程信息文件。
最终在regionserver的启动配置参数中发现了端倪:
原启动参数如下

export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS  -XX:+UseG1GC -XX:ParallelGCThreads=20 -XX:InitiatingHeapOccupancyPercent=70 -XX:MaxTenuringThreshold=1 -XX:G1HeapWastePercent=10 -XX:G1MixedGCCountTarget=16 -XX:+UnlockExperimentalVMOptions -XX:G1NewSizePercent=8 -XX:MaxGCPauseMillis=50 -XX:-OmitStackTraceInFastThrow -XX:+ParallelRefProcEnabled -XX:+PerfDisableSharedMem -XX:-ResizePLAB -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=20M  -Xmx16000m"

注意到-XX:+PerfDisableSharedMem这个参数

  • UsePerfData:如果关闭了UsePerfData这个参数,那么jvm启动过程中perf memory都不会被创建,默认情况是是打开的
  • PerfDisableSharedMem:该参数决定了存储PerfData的内存是不是可以被共享,也就是说不管这个参数设置没设置,jvm在启动的时候都会分配一块内存来存PerfData,只是说这个PerfData是不是其他进程可见的问题,如果设置了这个参数,说明不能被共享,此时其他进程将访问不了该内存,这样一来,譬如我们jps,jstat等都无法工作。默认这个参数是关闭的,也就是默认支持共享的方式

最终把这个配置去了就OK了

所以啊,如果上面说的3点中都确认了后,还是JPS还是不管用,这个时候就该好好查查你启动这个Java程序的时候用到的参数了。
参考:
https://trinea.iteye.com/blog/1196400
https://www.jianshu.com/p/5bda99bf191b

你可能感兴趣的:(Java,Linux/Shell,Hbase)