linux服务器运行java项目, 监控查看内存、储存空间和cpu占用率

linux,服务器,运行,java,项目,监控,查看,内存,储存,空间,cpu,占用率 · 浏览次数 : 2324

小编点评

**堆栈溢出异常分析** **问题描述:** 服务器部署方式为tomcat中运行war包的方式,有一次重新部署时候发现报异常堆栈溢出了。 **分析步骤:** 1. **检查内存使用情况:** - 使用jcmd命令获取 Java进程的统计信息,例如线程、类加载、垃圾回收等。 - 使用jstack生成线程快照,可以观察线程的堆栈信息。 2. **分析异常堆栈信息:** - jcmd 提供 `VM` 和 `Thread` 类,可以获取线程和类的信息,包括实例数、内存分配等。 - 使用 jstack 可以分析线程的堆栈信息,包括对象类型、大小等。 3. **检查存储空间是否足够:** - 使用 jvisualvm 等工具分析应用程序的存储空间占用情况。 - 查看存储数据或缓存的分区大小,判断是否需要扩展存储空间。 4. **分析类加载情况:** - 使用 jcmd 获取类加载的统计信息,例如加载次数、内存分配等。 - 考虑类加载的性能问题,以及垃圾回收效率。 5. **检查JMX远程连接:** - 使用 jvisualvm 启动远程监控工具,选择远程连接,设置连接参数。 - 观察远程工具的性能和堆栈信息,检查是否正常运行。 **结论:** 根据堆栈溢出异常的分析结果,可以确定以下问题: - 内存使用过高,需要进行内存管理优化。 - 类加载效率低,可能导致性能下降。 - 存储空间不足,需要进行扩展。 - JMX远程连接配置可能存在问题。 **建议:** - 优化应用程序的内存使用效率。 - 优化类加载的性能。 - 考虑使用缓存机制减少内存消耗。 - 确保 JMX远程连接的配置正确。

正文

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

1. 关于内存过高的情况

image

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

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

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

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

image

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

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

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

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

image

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

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

image


生成线程堆栈转储文件(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.'来过滤. 另外介绍一个网站: FastThread可以分析这些堆栈信息.
    参考: tomcat服务器cpu占用率居高不下
    参考: 线上问题排查命令
    参考: Tomcat进程占用CPU过高怎么办?


4. 分析软件

  • jvisual
    可以在线监控,
    使用jvisualvm.exe 打开, 与java.exejavac.exe都在同目录%JSAVA_HOME/bin%

image

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

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

image

: 可以查看堆栈中的类信息, 主要查看自己定义的类的实例数和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...

    image

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

      image

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

      image

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

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

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

      image

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

      image

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

    • 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占用率相似的内容:

linux服务器运行java项目, 监控查看内存、储存空间和cpu占用率

jar包运行情况查看

[转帖]Linux kill & Java shutdownhook

https://www.jianshu.com/p/8001a66d37c9 shutdown-hook 建议加上shutdown的钩子 如果程序出现了内存溢出crash 则现在代码是没有任何保护措施的 或者说运维不小心关闭了服务器等 或者运维不小心kill了游戏服务器进程等 无法避免kill -9

Java -jar 运行 报 MalformedInputException: Input length = 1

Intellij IDEA 中运行正常,linux 运行正常, cmd 下运行 报:MalformedInputException: Input length = 1 微服务项目,在Nacos中做了配置,在引用 Nacos中配置时,编码问题,导致的错误 org.yaml.snakeyaml.erro

[转帖]JMETER性能监控之serverAgent

对linux服务器的服务进行压测时,服务器的运行情况可以通过添加插件serverAgent来观察,可以实时监控性能指标。 1 (一)环境准备 1、下载zip包ServerAgent-2.2.3.zip 2、在服务器中,创建一个文件夹serveragent,名字随便起 mkdir serveragen

Linux服务器的性能监控与分析

通过vmstat分析性能 如上图所示,我们在命令vmstat后面添加了两个参数,1表示间隔一秒获取一次,10表示总共获取10次 我们一列一列数据来看: r:代表目前实际运行的指令队列,很高表示CPU很繁忙通常会CPU使用率过高 这个数据如果高于服务器CPU核数就可能出现瓶颈(需要结合后五列CPU使用

[转帖]Nginx 服务并发过10万的Linux内核优化配置

https://www.shuzhiduo.com/A/6pdDejeXzw/ 以下Linux 系统内核优化配置均经在线业务系统测试,服务器运行状态良好,用了一些时间整理,现和大家分享一下,如有那位高人看到配置上有问题,请给与指出! # Controls the use of TCP syncook

Microsoft.Data.Sqlite.SqliteException (0x80004005): SQLite Error 1: 'no such table: Users'.

今天使用asp.net core + sqlite 创建了一个demo项目,本地运行一切正常。可以添加,修改,删除数据。一旦发布到服务器上(Linux系统)就报错,错误信息如下: ![](https://img2023.cnblogs.com/blog/2912666/202308/2912666-

Linux 查看内存使用情况的几种方法

在运行 Linux 系统的过程中为了让电脑或者服务器以最佳水平运行,常常需要监控内存统计信息。今天我们就来看看都有那些方法可以查看内存信息。

[转帖]Linux bg/fg/jobs/disown命令运行后台任务

https://www.jianshu.com/p/4489603124aa 背景 我们经常需要服务器上面执行一些耗时操作,比如执行scp命令下载大文件等,但是又不想一直等待完成再做其他事情,所以可以配合linux的相关命令达到目的。 具体步骤 1.执行相关耗时操作命令 :/ scp -r xxx@

[转帖]老板让我在Linux中使用traceroute排查服务器网络问题,幸好我收藏了这篇文章!

https://bbs.huaweicloud.com/blogs/386325 【摘要】 traceroute 命令是一个有用且易于运行的网络诊断工具,本文给大家介绍了12个traceroute 命令示例,希望本文能够对您使用traceroute 命令有所帮助,如果有问题可以在下方评论区与我讨论!