本文将通过一次jvm内存分析过程来说明jps、jcmd、jstat、jstack 和 jmap 工具的使用方法。
我们都知道,在开发的过程中,有很多部署自己微服务的方式,其中有各种各样的不同操作,比如使用 docker 打包为镜像的方式,还有基础使用 jar 包的方式进行部署,但是呢?使用 jar 包部署,那就离不开这个启动 jar 包的脚本命令,总不能每次都是直接自己手动杀端口,然后再重新启动吧,今天了不起来带大家看一下这个 Shell 脚本,并且写一个 Shell 脚本通用给大家,拿来可用。
每次启动Java程序jar包的时候,难道你还在手敲java -jar xxserver.jar……?边敲边想着都需要追加哪些参数?
与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。
在实际开发过程中,有些 Java 程序在本地或者在服务器上都可以运行的较正常,但是运行较长一段时间后,可能会出现资源占用率较高的情况,例如 CPU 或 内存占用率较高等情况,以至于发生内存溢出,进程假死等的情况。这些问题发生的原因,往往是那些易忽略的编程规范导致的。下面描述一个定位开发环境上资源占用率较高问题的流程。
当正在运行的Java服务导致服务器的CPU突然飙高时,我们该如何排查定位到哪个接口的哪行代码导致CPU飙高的问题呢?我主要提供两个方案:
每次聊起性能测试,最后的终结话题就是怎么做优化。其实在Java的复杂项目中都会有内存不足问题、内存泄露问题、线程死锁问题、CPU问题。这些问题功能测试或者是小压力的情况下有可能并不明显,很容易被忽视。但是到了生产环境,问题就暴露了,各种非功能bug会让你头疼不已。
在线上环境中,当CPU占用率异常高时,经常需要定位到是哪个Java进程导致的,并进一步找到该进程启动的JAR文件。以下提供了几种方法来帮助你快速找到这些信息。
PS:两个可视化工具命令可以实现工具,让大家看的更加直观,并不是没有这些工具不行,而是有了这些工具更加方便。
作为Java开发者,很多场景下会使用SpringBoot开发Web应用,目前微服务主流SpringCloud全家桶也是基于SpringBoot搭建的。SpringBoot应用部署到服务器上,需要编写运维管理脚本。本文尝试基于经验,总结之前生产使用的Shell脚本,编写一个可以复用的SpringBoot应用运维脚本,从而极大减轻SpringBoot应用启动、状态、重启等管理的工作量。本文的Shell脚本在CentOS7中正常运行,其他操作系统不一定适合。如果对一些基础或者原理不感兴趣可以拖到最后,直接拷贝脚本使用。
基础环境centos8+kubeadm1.20.5+cilium+hubble环境搭建,线上主要跑的php nodejs java的环境。
部署在linux上的java程序,有时更新了包,忘记了是否执行了重启,此时有必要根据java进程的启动时间和包的更新时间来确定。
一提到“Kill”命令,大家是不是很兴奋,潜意识觉得自己大展宏图之刻即将到来,仿佛自己就是那个黑暗的夜空下拿着长剑的武士,站在高高的山崖顶层,xx一切。。。别,醒醒吧,孩子(大侠)!大家在停止Java进程时(当然,不仅仅是Java,其他应用也同样适用,本文主要针对Java程序进行解析),有没有想过为什么要用kill -9呢?这样操作对吗?
类似Linux的ps,但是jps只用于列出Java的进程 可以方便查看Java进程的启动类,传入参数和JVM参数等 直接运行,不加参数,列出Java程序的进程ID以及Main函数等名称
概述 jinfo 是 JDK 自带的命令,可以用来查看正在运行的 java 应用程序的扩展参数,包括Java System属性和JVM命令行参数;也可以动态的修改正在运行的 JVM 一些参数。当系统崩
写在前面:当一个台 WEB 主机(JAVA 平台)上有多个站点时,很可能因为一个站点项目出现死锁之类的 BUG 而导致所有站点挂掉!最烦的就是因为站点过多,在日志无法具体指向的时候,你根本无法确定那个站点出现 BUG,从而你也没法推给开发人员解决。 下面,就介绍一个抓取高占用 CPU 的线程的简单方法: 运行 top 命令取得 JAVA 线程号(PID),假如是 2068; 运行 jstack + pid 命令导出 JAVA 线程信息到 result 文件,命令行为 j
虽然写起动shell的频率非常不高。。。但是每次要写都要对付一大堆的jar文件路径,新加jar包也必须要修改起动shell。
根据 top 命令,发现测试环境 PID 为 5989 的 Java 进程占用 CPU 高达 100%, 疑似故障。但是,怎么定位到具体线程或者代码呢?
1.1 jps 类似Linux的ps,但是jps只用于列出Java的进程 可以方便查看Java进程的启动类,传入参数和JVM参数等 直接运行,不加参数,列出Java程序的进程ID以及Main函数等
如果有一天,你的Java程序长时间停顿,也许是它病了,需要用jstack拍个片子分析分析,才能诊断具体什么病症,是死锁综合征,还是死循环等其他病症,本文我们一起来学习jstack命令~
今天上午,同事叫我帮他看下他正在写的脚本到底哪里出了问题,执行总是达不到预期功能。于是 ssh 连过去看能否发现问题,经过多次 Debug 定位与排除,问题终于得到解决。 同事在网上 down 了一个脚本菜单模板,想把我们已经存在的功能脚本整合到一起,做成多功能的 Linux 运维工具。目前已经添加了挺多功能,而早上才添加的一个抓取高占用 CPU 的 Java 线程功能时出现了无法出现交互界面的问题,而单独去执行这个子脚本又是正常的。 我将这个案子拿到手之后,第一件事就是打开了主菜单,分析了一下菜单功能原理
Java 的 Process API 为开发者提供了执行操作系统命令的强大功能,但是某些 API 方法可能让你有些疑惑,没关系,这篇文章将详细介绍如何使用 ProcessBuilder API 来方便的操作系统命令。
Java程序 运行在linux主机上, 通过shell脚本启动为进程。 Java程序中 通过定时任务,设置访问Hbase的时间间隔,设置告警规则,比如三次获取Hbase中的数据失败,则调用存过,遍历配置的告警号码,插入短信中间表,实现短信的发送。 项目结构如下
最近因为太忙,时间不够,导致长时间没写笔录,没有好好去总结自己,很不应该,要调整回来。
1. Java + REPL = jshell 下一个版本的Java将使用一个名为jshell的新命令行工具,它将添加本机支持(native support)并将Java方式推广到REPL(Read-Eval-Print-Loop)。 意思是说,如果你想要自己运行几行Java代码,你不必将它包装在一个单独的项目或方法中。 甚至像分号(;)这些你都可以忘记,像下面这样: -> 2 + 2 | Expression value is: 4 | assigned to temporary variable
注意 ;直接复制代码出现了错误建议直接先修改好文件,然后上传至虚拟机 ,SpringCloud启动脚本百度云分享
windows请参考:https://www.zanglikun.com/5620.html
查看进程 # ps PID TTY TIME CMD 1496 pts/0 00:00:00 bash 1688 pts/0 00:00:00 ps PID: 运行着的命令(CMD)的进程编号 TTY: 命令所运行的位置(终端) TIME: 运行着的该命令所占用的CPU处理时间 CMD: 该进程所运行的命令 使用 -a 参数。-a 代表 all。同时加上x参数会显示没有控制终端的进程。 # ps ax PID TTY STAT
在linux操作时,经常要查看运行的项目的进程和端口号,在这里总结了以下常用到的相关命令:
这可不,今天,有个需求是详细输出系统中各个应用(JAVA项目)所占的内存大小,单位以MB显示出来,结果需要直观,为什么有此需求呢?
分享一个部署boot项目的sh脚本 #环境变量 source /etc/profile #!/bin/sh #jdk JAVA_HOME=/此处换成真实jdk路径 export PATH=$PATH:$JAVA_HOME/bin export BUILD_ID=dontkillme #定义程序名 及jar包的名 PROJECT_NAME=此处换成真实jar名称.jar LOG_NAME=日志名.log ## 编写判断程序是否正在运行的方法 isExist() { ## 首先查找进程号 pid=$(p
在Linux上启动程序后台运行时,往往需要输入一堆复杂的命令,为了能快速编写一个完善的启动脚本,整理一个通用的启停脚本模板如下。 脚本支持从任意位置执行,不存在路径问题,启动脚本和停止脚本最好一起配合使用。
前面已经讲过了jps和jstat调优工具。今天我们继续说一下其它4个工具。这些工具都在jdk的bin目录下。
jvm 调优,调的是稳定,并不能带给你性能的大幅提升。服务稳定的重要性就不用多说了, 保证服务的稳定,gc 永远会是 Java 程序员需要考虑的不稳定因素之一。复杂和高并发下的 服务,必须保证每次 gc 不会出现性能下降,各种性能指标不会出现波动,gc 回收规律而且干净,找到合适的 jvm 设置。Full gc 最会影响性能,根据代码问题,避免 full gc 频率。可以 适当调大年轻代容量,让大对象可以在年轻代触发 yong gc,调整大对象在年轻代的回收频 次,尽可能保证大对象在年轻代回收,减小老年代缩短回收时间;
概述 在JDK1.7以后,新增了一个命令行工具 jcmd。他是一个多功能的工具,可以用它来导出堆、查看Java进程、导出线程信息、执行GC、还可以进行采样分析(jmc 工具的飞行记录器)。 命令格式 jcmd <pid | main class> <command ... | PerfCounter.print | -f file> jcmd -l jcmd -h 描述 pid:接收诊断命令请求的进程ID。 main class :接收诊断命令请求的进程的main类。匹配进程时,main类名
前一段时间上线的系统升级之后,出现了严重的高CPU的问题,于是开始了一系列的优化处理之中,现在将这个过程做成一个系列的文章。
可以运行python代码,可以直接控制台运行frida -U com.zuiai.hh -l C:\Users\xxx\Desktop\appHOOK\hook.js
程序员免不了要与windows和linux打交道,在windows写启动脚本时要要用到bat,而在linux时则要使用到shell脚步。shell脚步具有严格的格式,稍不注意就会出问题,今天分享一个小经验,但是受益程序员终身。下面是网上找来的一段shell脚本:
3、使用 mvn packpage打包位jar文件以后,使用java -jar yourapp.jar命令行运行
# java env export JAVA_HOME=/opt/jdk1.8.0_11 # App Info # 应用存放地址 APP_HOME=/cjbdi/hubeiDataAnalysisBackend # 应用名称 APP_NAME=$1 TIME=$(date +%Y-%m-%d) # Shell Info # 使用说明,用来提示输入参数 usage() { # echo "Usage: sh boot [APP_NAME] [start|stop|restart|statu
jps等工具都是对tools.jar类的包装,使用起来方便简单.在下边的故障排查中会用到我们这里提到的工具,大家平时应该熟记于心.
1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null" 2 表示stderr标准错误
加上-H这个选项启动top,top一行显示一个线程(指的是(轻量级)进程? )。否则,它一行显示一个进程。
启动语法:java [-options] -jar xxx.jar [args…]
jps(Java Virtual Machine Process Status Tool)显示当前所有Java进程pid的命令
jps位于jdk的bin目录下,其作用是显示当前系统的java进程情况,及其id号。 jps相当于Solaris进程工具ps。不象”pgrep java”或”ps -ef grep java”,jps并不使用应用程序名来查找JVM实例。因此,它查找所有的Java应用程序,包括即使没有使用java执行体的那种(例如,定制的启动 器)。另外,jps仅查找当前用户的Java进程,而不是当前系统中的所有进程。
当有我们的服务器CPU资源使用率(usr%)较高时,或者是一个基于 JAVA 的 Web 应用运行的比预期慢的时候,我们需要使用 Thread Dumps进行分析。线程转储是诊断CPU尖峰,死锁,响应时间差,内存问题,应用程序无响应以及其他系统问题的一项重要工作或者环节。
1. JDK 内置命令 1. javap java 反编译工具,主要用户根据 Java 字节码文件反汇编为 Java 源代码文件。 javap <options> <classes> 2. jps j
领取专属 10元无门槛券
手把手带您无忧上云