hadoop用户启动hadoop的hdfs,然后用root用户执行kill -9 $(pgrep -f hadoop),然后用jps分别在root和hadoop用户查看Java进程信息:
再次用hadoop用户启动hdfs,然后用jps分别查看信息:
从以上结果能够看出jps得出的状态信息并不能完全准确的判断一个进程的真实状态
当jps发现获取进程信息有异常时,第一步应该用ps -ef|grep pid,确定进程是否真的存在,如果存在则说明进程是活的,不可轻易kill,如果不存在那说明该进程已经死掉了。第二步,确定进程已死之后,我们需要确定jps异常信息产生的用户,执行ll /tmp/hsperfdata*,会显示所有用户(目录命名格式为hsperfdata_xx用户)进程信息文件(这些文件以进程号命名,直接对照进程号即可确定用户)。第三步,我们需要到/tmp目录执行rm -rf hsperfdata_xx用户清除部分内容再重启hdfs。第四部,重启hdfs之后,jps查看进程信息。
命令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 选项如下:
-dump 生成java堆转储快照。格式为: -dump:[live,]format=b,file=,其中live子参数说明是否只dump出存活的对象
-finalizerinfo 显示在F-Queue中等待Finalizer线程执行finalize方法的对象。只在Linux/Solaris平台下有效
-heap 显示java堆详细信息,如使用哪种收集器、参数配置、分代情况等,在Linux/Solaris平台下有效
-histo 显示堆中对象统计信息,包含类、实例对象、合集容量
-permstat 以ClassLoader为统计口径显示永久代内存状态。只在Linux/Solaris平台下有效
-F 当虚拟机进程对-dump选项没有相应时。可使用这个选项强制生成dump快照。只在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应用程序的运行概况,监控堆信息、永久区使用情况、类加载情况等。
一、Linux ps (英文全拼:process status)命令用于显示当前进程的状态
ps aux 基本输出
ps aux 列名解释
注:优化机器资源主要从占用机器cpu和mem高的程序入手
二、Linux top命令查看正在运行的进程和系统负载信息,包括cpu负载、内存使用、各个进程所占系统资源等
基本输出
字段解释
三、Linux top -H -p pid。查看某个进程内部线程占用情况
四、jps(Java Virtual Machine Process Status Tool) 是java提供的一个显示当前所有java进程pid的命令
五、jinfo LVMID。可以用来查看 Java 进程运行的 JVM 参数
六、jstat(Java Virtual Machine statistics monitoring tool)主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。可见,Jstat是轻量级的、专门针对JVM的工具,非常适用
七、jstack(Java Stack Trace Tool)主要用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源
八、jmap命令(Java Memory Map)是其中之一。主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节
九、MAT(Memory Analysis Tools)是一个分析 Java堆数据的专业工具,用它可以定位内存泄漏的原因
此次分享准备过程中,发现JDK调试工具在Root用户下访问Yarn用户启动的Java虚拟机,获取不到信息,jstatck获取到的还不全(没有线程描述信息行)
可以使用 sudo -u yarn /usr/java/jdk1.8.0_181-cloudera/bin/jstack 这种方式获取。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)