服务器部署方式为tomcat中运行war包的方式, 有一次重新部署时候发现报异常堆栈溢出了.
想要定位到某个war包中通过学习整理出此篇文章以作记录笔记.

关于远程调试, 可以本地对线上代码debug调试, 可参考:


0. 如果奔着解决问题, 见: arthas安装和简单应用

1. 关于内存过高的情况

不要看到free很少就很慌或者used很高, 就以为内存爆了. 其实不是, 是因为Linux内存管理技术 -- 虚拟内存

参考1: Linux下Java项目占用内存问题的分析

参考2: tomcat内存占用过高_jvm疯狂吞占内存,罪魁祸首是谁?

2. 顺便检查储存空间是否足够

如果存储数据或缓存的分区过大, 可以给分区扩容或清理缓存的方法.

/dev/vda[数字]过大情况下可参考一下连接:

3. 内存堆栈信息 - jar/war(导出当时堆栈方式)

通过jps指令查看系统中运行的项目

如果还有tomcat运行包, 会多一条[pid] Bootstrap数据

(服务器测试时没有jar包的名称, 可能Bootstrap名称也会不同)


生成线程堆栈转储文件(war和jar都是使用java执行的, 都是查看进程id)

  • 使用jmap -dump:format=b,file=wanfile.dump 21445导出堆栈文件, 并且下载到本地. jmap生成的堆转储文件包含了Java堆中的所有对象的详细信息, 所以会大一点, 对比jcmd和jstack.

  • 相关的指令还有jcmd: jcmd <进程ID> GC.heap_dump <文件路径>

    jcmd是JDK中的一个命令行工具,用于与Java进程进行交互并执行各种操作。它提供了一系列的命令,可以用于监控、诊断和调试Java应用程序。以下是jcmd的一些常用功能:

    • VM相关操作:jcmd可以执行与Java虚拟机(JVM)相关的操作,如生成堆转储文件、强制执行垃圾收集、打印系统属性等。例如,您可以使用jcmd <进程ID> GC.run命令来强制执行垃圾收集操作。

    • 线程相关操作:jcmd可以查看和管理Java进程中的线程。您可以使用jcmd <进程ID> Thread.print命令来打印线程的详细信息,包括线程ID、状态、堆栈跟踪等。还可以使用jcmd <进程ID> Thread.dump命令生成线程的堆栈转储文件。

    • 类相关操作:jcmd可以执行与Java类相关的操作,如打印加载的类信息、触发类卸载等。例如,您可以使用jcmd <进程ID> VM.class_stats命令来打印加载的类的统计信息。

    • JMX相关操作:jcmd可以与Java管理扩展(JMX)进行交互,执行与MBeans相关的操作。您可以使用jcmd <进程ID> ManagementAgent.start命令启动JMX代理,以便远程管理和监控Java进程。

    • JVM统计信息:jcmd可以获取Java进程的各种统计信息,如线程、类加载、垃圾收集、编译器等的统计数据。您可以使用jcmd <进程ID> VM.native_memory命令来查看本地内存使用情况。

    • 其余的请参考相关的JDK文档或运行jcmd -help命令来获取帮助信息。

  • 另外还可以使用jstack生成线程快照, 功能与jcmd类似(jstack较旧, jcmd新一点): jstack 21445 > 21445.log

    也可以打印在命令行, 或者使用 | grep 'at com.'来过滤.

    参考: tomcat服务器cpu占用率居高不下

    参考: 线上问题排查命令

    参考: Tomcat进程占用CPU过高怎么办?


4. 分析软件

  • 网站: FastThread将堆栈信息上传网站可以分析出一些出一些信息参考, 另外推荐软件arthas, 可以在服务器上很方便的进行监控诊断.
  • jvisual

    可以在线监控,

    使用jvisualvm.exe 打开, 与java.exejavac.exe都在同目录%JSAVA_HOME/bin%

点击显示系统属性, 可以查看到当前的jar包运行的参数, 包括当前jar包的名称.

之后我也将Bootstrap也下载了下来

: 可以查看堆栈中的类信息, 主要查看自己定义的类的实例数和ArrayList是否过高

注: java11包括java11之后的版本不再提供jvisualvm.exe, 有需要的话可以在VisualVM: Download 下载.

参考1: linux环境下导出项目的堆栈dump文件

参考2: jvisualvm.exe使用介绍


  • memory analyzer

如果常用jdk(系统变量path中配置的)是java8的话, 由于此工具要求jdk版本是java11+, 所以需要手动配置java11, 在MemoryAnalyzer.exe同目录下的MemoryAnalyzer.ini配置文件中最前面添加-vm path:

-vm
C:\Program\Java\java-11\bin\javaw.exe
-startup
plugins/org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.2.400.v20211117-0650
-vmargs
-Xmx1024m

参考1: 官网下载地址

参考2: MemoryAnalyzer指定JDK版本

参考3: Memory Analyzer基本使用

参考4: 一文让你理解什么是shallow heap及retained heap

5. 在线监控

tomcat中的各个war的运行情况暂时无法分开查看

  • 目标tomcatbin目录下的catalina.sh文件内添加以下内容并重启tomcat

    使用jar运行的话, 也是添加以下参数

    # 1.之前是写到一行, 但是启动有问题, 后面拆开多行成功
    # 2.hostname填写ip或者域名
    # 3.port使用的是与tomcat或docker相同的端口(尝试使用不同的未能成功, 于参考4中发现)
    # 4.authenticate代表是否需要鉴权
    CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote=true"
    CATALINA_OPTS="$CATALINA_OPTS -Djava.rmi.server.hostname=[ip or servername]"
    CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.port=80"
    CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
    CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
  • 打开软件visualvm, 右键打开Add Remote Host...

    • 输入hostname, 目标服务器的ip或域名, 点击OK

    • 右键新添加的远程主机, 点击Add JMX Connection...

    • 填写上接口, 同服务器配置中的port

    • 如果配置上jmxremote.authenticate=true, 需要填写上配置的用户名和密码

    • 勾选上不需要SSL连接, 同配置中的jmxremote.ssl=false

    • 点击OK后其下会出现下图所示

    • 双击上图箭头所指位置, 右侧窗口中可看到具体内容

    • visualvm功能可在官网上的FeaturesDocumentation进行查阅.

  • JDK Mission Control(jmc)

  • jconsole

    • 与jvisualvm一样在bin目录下
    • 连接方式也与jvisual相同, 比较简陋

参考1: jvisualvm.exe使用

参考2: VisualVM详解

参考3: jvisualvm 监控 tomcat 实例(qbit)

参考4: Has anyone ever got a remote JMX JConsole to work?

参考5: jvisualvm之jmx远程连接

参考6: java jmx jboss_通过JMX远程监控

linux服务器运行java项目, 监控查看内存、储存空间和cpu占用率的更多相关文章

  1. Linux下运行java项目

    最近初步接触了linux,感觉很有新鲜感.之前在windows下干过的事情也便想到在linux环境下实现一下.正好手头在编java,就想既然java可以在windows的DOS操作下运行,是不是也可以 ...

  2. linux环境运行java项目并有外部引用jar

    eclipse目录结构: linux目录结构: lib目录结构: 其中除了IMT_ENCODING_DSP.jar其余的都是外部引用的jar IMT_ENCODING_DSP.jar是java项目打包 ...

  3. Linux下运行Java项目时,出现No X11 DISPLAY variable was set, but this program performed an operation which requires it.的问题解决

    在~/.bashrc环境变量文件最下方加入: export DISPLAY=:0.0 然后,刷新环境变量以使其生效: source -/.bashrc 参考:http://stackoverflow. ...

  4. 查看Windows下引起Oracle CPU占用率高的神器-qslice

    前言: qslice是一个win2000的工具包,能分析进程的cpu占用率,我们用于分析oracle的性能 这是绿色的软件无需安装. 我们经常会碰到oracle的CPU占用居高不下,无法快速定位到问题 ...

  5. Linux 服务器运行健康状况监控利器 Spotlight on Unix 的安装与使用

    1.本文背景 1.1.Linux 服务器情况 # cat /etc/issueRed Hat Enterprise Linux Server release 6.1 (Santiago)Kernel ...

  6. 发布项目到 Linux 上运行 Core 项目

    发布项目到 Linux 上运行 Core 项目 目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 ASP.Net Core 给我们带来的最大的亮点就是跨平台,我在我电脑(win ...

  7. Linux服务器运行一段时间,出现CPU占用率达到100%卡死

    没事整了一个1核2G的便宜服务器,虽说便宜吧,但是搞个博客网站啥的也还是够用了:但是呢,最近服务器过几天就会出先CPU占用率达到100%:系统完全卡死,项目请求一个都访问不了,或者就是超级长时间才能得 ...

  8. Linux04 /创建虚拟环境、在linux环境运行Python项目

    Linux04 /创建虚拟环境.在linux环境运行Python项目 目录 Linux04 /创建虚拟环境.在linux环境运行Python项目 1. 大体流程 2. linux环境安装python3 ...

  9. 使用DOS命令运行JAVA项目

    使用DOS命令运行JAVA项目 找到生成项目的文件夹: 在地址前加上cmd+空格,进入命令窗口: 输入javac 类的名称.java,生成class文件: 输入java 类的名称: 运行成功:

  10. Linux下如何查看高CPU占用率线程

    转于:http://www.cnblogs.com/lidabo/p/4738113.html 目录(?)[-] proc文件系统 proccpuinfo文件 procstat文件 procpidst ...

随机推荐

  1. springboot-权限控制shiro

    1. 场景描述 (1)权限控制是IT项目特别是企业项目,绕不开的重要模块,接下来结合springboot介绍下权限控制框架shiro. (2)springboot集成shiro的东西有点多,一篇博客完 ...

  2. Golang-包8

    http://c.biancheng.net/golang/package/ Go语言包的基本概念 Go语言是使用包来组织源代码的,包(package)是多个 Go 源码的集合,是一种高级的代码复用方 ...

  3. biancheng-Maven依赖

    目录http://c.biancheng.net/maven2/profile.html 1Maven简介2Maven安装与配置3Maven POM4创建Maven项目5Maven项目的构建与测试6M ...

  4. DCT实现水印嵌入与提取(带攻击)

    问题: 想要用DCT技术,在Matlib上实现水印的隐藏和提取(带GUI界面),且加上一些攻击(噪声.旋转.裁剪),以及用NC值评判! 流程 选择载体 [filename,pathname]=uige ...

  5. DeepSeek 全面指南,95% 的人都不知道的9个技巧(建议收藏)

    大家好,我是汤师爷~ 最近,DeepSeek这款AI工具爆火国内外. 虽然许多人都开始尝试使用它,但有人吐槽说,没想象中那么牛. 其实问题不在工具,很多人的使用姿势就搞错了,用大炮打蚊子,白白浪费De ...

  6. Q:浏览器打开控制台报错:net::ERR_CONTENT_LENGTH_MISMATCH 206

    一.问题描述 F12查看浏览器的控制台,提示net::ERR_CONTENT_LENGTH_MISMATCH 206 (Partial Content) ,如下图, HTTP状态码206表示" ...

  7. RocketMQ实战—9.营销系统代码初版

    大纲 1.基于条件和画像筛选用户的业务分析和实现 2.全量用户促销活动数据模型分析以及创建操作 3.Producer和Consumer的工程代码实现 4.基于抽象工厂模式的消息推送实现 5.全量用户促 ...

  8. Anoii网络库之Timer实现

    Timer的实现挺值得拿出来聊一聊的 Anoii网络库的事件循环: Timer是使用poll的timeout参数实现的,所以定时的精度是毫秒,对于一个网络库而言这足够了.如果不够的话,还可以使用tim ...

  9. RabbitMQ(五)——发布订阅模式

    RabbitMQ系列 RabbitMQ(一)--简介 RabbitMQ(二)--模式类型 RabbitMQ(三)--简单模式 RabbitMQ(四)--工作队列模式 RabbitMQ(五)--发布订阅 ...

  10. Leetcode 236. 二叉树的最近公共祖先 & 235. 二叉搜索树的最近公共祖先(Python3)

    236. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x ...