从0开始,来看看怎么去linux排查Java程序故障
一,前提准备
最基本前提:你需要有liunx环境,如果没有请参考其它文献在自己得到local建立一个虚拟机去进行测试。
有了虚拟机之后,你还需要安装jdk和配置环境变量
1. 安装JDK(以OpenJDK 17为例)
下载JDK
# 进入用户主目录
cd ~# 下载OpenJDK 17(以.tar.gz包为例)
wget https://download.java.net/java/GA/jdk17.0.2/dfd4a8d0985749f896bed50d7138ee7f/8/GPL/openjdk-17.0.2_linux-x64_bin.tar.gz# 或Oracle JDK(需官网同意许可协议)
# wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz

这里就已经下好了

解压并安装
# 创建安装目录(需sudo权限)
sudo mkdir -p /usr/local/java# 解压JDK到目标目录
sudo tar -xzvf openjdk-17.0.2_linux-x64_bin.tar.gz -C /usr/local/java# 查看解压后的目录名(例如jdk-17.0.2)
ls /usr/local/java
命令解释
mkdir -p /path/to/directory
- 递归创建目录:当你指定的路径中某些目录不存在时,
mkdir -p会自动创建这些缺失的父目录。 - 不会报错:如果目录已经存在,
mkdir -p不会报错,命令会正常执行。
tar -xzvf openjdk-17.0.2_linux-x64_bin.tar.gz -C /usr/local/java
tar -xzvf 是用来解压 .tar.gz 或 .tgz 文件的命令。
x:表示 解压(extract)。z:表示 通过 gzip 压缩格式进行解压(unzip the gzip file)。v:表示 显示详细信息,在解压时列出文件名。这个选项是可选的,用来查看解压过程中有哪些文件被处理。f:表示 指定文件,后面需要跟要解压的.tar.gz文件名。

2, 配置环境变量
编辑环境变量文件
# 打开用户环境变量配置文件(以bash为例)
nano ~/.bashrc # 或 ~/.bash_profile、~/.zshrc(根据Shell类型)
命令解释
nano:是一个命令行下的文本编辑器。它非常简单,适合快速编辑文件。~/.bashrc:是当前用户主目录下的 Bash 配置文件。每当你打开一个新的终端时,Bash shell 会加载该文件。在这个文件中,你可以设置环境变量、命令别名、shell 提示符样式等。
添加以下内容到文件末尾
需要注意,不能有空格
# 手动安装配置
export JAVA_HOME=/usr/local/java/jdk-17.0.2 # 替换为实际解压路径
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar# 包管理器安装配置(若使用方式2)
# export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
# export PATH=$JAVA_HOME/bin:$PATH

使配置生效
source ~/.bashrc # 根据实际配置文件选择
验证安装
# 检查Java版本
java -version# 输出应类似:
openjdk version "17.0.2" 2022-01-18
OpenJDK Runtime Environment (build 17.0.2+8-86)
OpenJDK 64-Bit Server VM (build 17.0.2+8-86, mixed mode)# 检查JAVA_HOME
echo $JAVA_HOME
# 输出:/usr/local/java/jdk-17.0.2

自动化脚本安装示例:
#!/bin/bash
# 一键安装并配置JDK 17(手动方式)
JDK_URL="https://download.java.net/java/GA/jdk17.0.2/dfd4a8d0985749f896bed50d7138ee7f/8/GPL/openjdk-17.0.2_linux-x64_bin.tar.gz"
INSTALL_DIR="/usr/local/java"# 下载并解压
sudo mkdir -p $INSTALL_DIR
wget $JDK_URL -O /tmp/jdk17.tar.gz
sudo tar -xzvf /tmp/jdk17.tar.gz -C $INSTALL_DIR# 配置环境变量
echo "export JAVA_HOME=$INSTALL_DIR/$(ls $INSTALL_DIR)" >> ~/.bashrc
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc
source ~/.bashrc# 验证
java -version
二,Java代码准备
编写一个简单的让程序不断创建新对象,然后GC在不停地回收,但是又回收不掉地样例。并打包为jar包给到我们的liunx服务器。
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;public class Main {// 内存泄漏:让对象无法被GC回收private static final List<byte[]> LEAK_LIST = new ArrayList<>();// CPU密集型任务开关private static final AtomicBoolean RUNNING = new AtomicBoolean(true);public static void main(String[] args) {// 内存泄漏线程:持续分配内存,触发频繁GCnew Thread(() -> {while (true) {// 每次分配1MB内存(不会被回收)LEAK_LIST.add(new byte[1024 * 1024]);try {Thread.sleep(100); // 控制内存分配速度} catch (InterruptedException e) {e.printStackTrace();}}}, "MemoryLeakThread").start();// CPU密集型线程:死循环计算,占用CPUnew Thread(() -> {while (RUNNING.get()) {// 无意义但耗CPU的计算double result = 0;for (int i = 0; i < 100000; i++) {result += Math.sin(i) * Math.cos(i);}}}, "CpuIntensiveThread").start();}
}
打包为可执行jar包

将jar包给到linux
这里我用的vmware的文件共享区进行的共享的。
在虚拟机的设置里面

在选项这里进行配置一下

vmware的文件共享区在Linux中的/mnt/hgfs/ 文件下
如果/mnt/hgfs 目录为空
-
可能原因:
-
VMware Tools未正确安装。
-
共享文件夹未启用或配置错误。
-
自动挂载服务未运行。
-
解决方案:
步骤1:检查VMware Tools状态
# 查看服务是否运行(Ubuntu/Debian)
systemctl status vmware-tools.service# 重启服务(如果未运行)
sudo systemctl restart vmware-tools.service如果未安装 VMware Tools则
# 检查 open-vm-tools 状态
systemctl status open-vm-tools
# 若服务存在且未运行,
启动服务
sudo systemctl start open-vm-tools
sudo systemctl enable open-vm-tools
步骤2:手动挂载共享文件夹(临时生效)
# 创建挂载点(若目录不存在)
sudo mkdir -p /mnt/hgfs# 手动挂载
sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other#如果因为权限不足,可以加权限
sudo usermod -aG root rojer(rojer是用户名)
步骤3:配置开机自动挂载(永久生效)
# 编辑/etc/fstab文件
sudo nano /etc/fstab# 添加以下行(保存退出)
.host:/ /mnt/hgfs fuse.vmhgfs-fuse allow_other,defaults 0 0# 重新挂载
sudo mount -a

准备调试工具
使用阿里的arthas
arthas/README_CN.md at master · alibaba/arthas · GitHub
下载 Arthas 的 arthas-boot.jar 文件
curl -O https://arthas.aliyun.com/arthas-boot.jar

三,开始测试
使用以下JVM参数启动程序,加速问题暴露(JDK1.8版本):
java -Xms100m -Xmx100m # 限制堆内存为100MB,加速GC触发
-XX:+UseG1GC # 使用G1垃圾回收器(观察GC日志)
-XX:+PrintGCDetails # 打印GC详细信息
-XX:+PrintGCDateStamps # 显示GC时间戳-jar
GcDemo.jarJava 9 及以上改用
-Xlog:gc
java -Xms100m -Xmx100m -XX:+UseG1GC -Xlog:gc -jar GCdemo.jar
启动之后问题出现

现象验证方法
观察GC频繁:
1,使用ps -ef | grep java
找到java进程的pid

2,通过top命令观察java进程的实时状态

2,使用 jstat -gc <pid> 1000(每秒刷新):
观察GC回收状况,从上面命令可以看出内存资源并不紧张,所以这里只做展示
YGC(Young GC次数)和 FGC(Full GC次数)会快速上升。

从上面可以看出fullGC的次数才3次,且回收时间不大,说明内存情况很健康。又从top中看到cpu资源已经打满,说明有程序在疯狂占用cpu的计算资源。
这里解释一下上图的代表意思
|
详细观察cpu的占用情况
top -p <pid>
然后 按 H 键(大写的 H)切换到线程视图:
- 按下
H键后,top会从显示进程列表切换到显示线程列表,每个线程会显示为一个单独的条目。

使用Arthas诊断:
# 1. 启动Arthas
java -jar arthas-boot.jar

这里选择所要监控的程序。
需要注意,如果出现连接异常,且
~/logs/arthas/arthas.log
路径下log中有
Arthas server agent start...
java.lang.OutOfMemoryError: Java heap space
说明你当前的机器在不断消耗内存,导致arthas起不起来!
因为在jvm初始化的时候,这个阶段非常吃内存。

查看线程CPU占用
# 当前系统的实时数据面板,按 ctrl+c 退出。
dashboard

这里可以看出cpu已经打满,但是堆内存情况良好。
追踪高cpu线程
thread
参数名称 参数说明 id 线程 id [n:] 指定最忙的前 N 个线程并打印堆栈 [b] 找出当前阻塞其他线程的线程 [i <value>]指定 cpu 使用率统计的采样间隔,单位为毫秒,默认值为 200 [--all] 显示所有匹配的线程

这里就已经能定位到问题了。我这个样例比较简单,就一个main类。大家可以构建复杂一点的项目,进行一点点调试看问题。
使用java原生的也能定位到问题。可能比较繁琐一点。
使用 jstack 获取线程堆栈信息
使用 jvisualvm 进行图形化分析
等等。
其它arthas常用方法
- trace:追踪方法调用的堆栈,帮助你查看方法内部的执行情况。
- monitor:监控方法的执行,特别是性能问题,像慢方法。
- stack:查看线程堆栈,特别是线程阻塞和死锁问题。
- watch:监控方法调用,查看参数和返回值,帮助定位参数错误。
- heapdump:生成堆转储文件,帮助分析内存问题。
- jstack:查看 Java 进程的堆栈信息,诊断崩溃或线程死锁。
参考官方文档使用说明!
auth | arthas
相关文章:
从0开始,来看看怎么去linux排查Java程序故障
一,前提准备 最基本前提:你需要有liunx环境,如果没有请参考其它文献在自己得到local建立一个虚拟机去进行测试。 有了虚拟机之后,你还需要安装jdk和配置环境变量 1. 安装JDK(以OpenJDK 17为例) 下载JDK…...
DeepSeek-V3:开源多模态大模型的突破与未来
目录 引言 一、DeepSeek-V3 的概述 1.1 什么是 DeepSeek-V3? 1.2 DeepSeek-V3 的定位 二、DeepSeek-V3 的核心特性 2.1 多模态能力 2.2 开源与可扩展性 2.3 高性能与高效训练 2.4 多语言支持 2.5 安全与伦理 三、DeepSeek-V3 的技术架构 3.1 模型架构 3…...
Deep Sleep 96小时:一场没有硝烟的科技保卫战
2025年1月28日凌晨3点,当大多数人还沉浸在梦乡时,一场没有硝烟的战争悄然打响。代号“Deep Sleep”的服务器突遭海量数据洪流冲击,警报声响彻机房,一场针对中国关键信息基础设施的网络攻击来势汹汹! 面对美国发起的这场…...
Redis地理散列GeoHash
GeoHash是一种用于地理位置编码的算法,将二维的地理坐标(纬度和经度)转换为一维的字符串表示,从而实现对地理位置的高效存储和查询。Redis作为一个内存数据库,提供了对GeoHash的支持,使得地理位置相关的数据…...
JAVA安全—反射机制攻击链类对象成员变量方法构造方法
前言 还是JAVA安全,哎,真的讲不完,太多啦。 今天主要是讲一下JAVA中的反射机制,因为反序列化的利用基本都是要用到这个反射机制,还有一些攻击链条的构造,也会用到,所以就讲一下。 什么是反射…...
专业学习|一文了解并实操自适应大邻域搜索(讲解代码)
一、自适应大邻域搜索概念介绍 自适应大邻域搜索(Adaptive Large Neighborhood Search,ALNS)是一种用于解决组合优化问题的元启发式算法。以下是关于它的详细介绍: -自适应大领域搜索的核心思想是:破坏解、修复解、动…...
9. k8s二进制集群之kube-controller-manager部署
同样在部署主机上创建证书请求文件(为之后的证书生成做准备)根据上面的证书文件创建证书(结果会在当前目录下产生kube-controller-manager证书)创建kube-controller-manager服务配置文件创建kube-controller-manager服务启动文件同步kube-controller-manager证书到对应mast…...
轮转数组-三次逆置
题目 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 void rotate(int* nums, int numsSize, int k){}示例: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] …...
3 卷积神经网络CNN
1 Image Classification (Neuron Version) – 1.1 Observation 1 1.2 Observation 2 如果不同的receptive field需要相同功能的neuron,可以使这些neuron共享参数 1.3 Benefit of Convolutional Layer 2 Image Classification (Filter Version) 不用担心filter大小…...
穷举vs暴搜vs深搜vs回溯vs剪枝系列一>黄金矿工
目录 决策树:代码设计代码: 决策树: 代码设计 代码: class Solution {boolean[][] vis;int ret,m,n;public int getMaximumGold(int[][] grid) {m grid.length;n grid[0].length;vis new boolean[m][n]; for(int i 0; i <…...
java基础1(黑马)
一、初识Java 1.Java背景知识 1)Java是美国SUN公司在1995年推出的一门计算机高级编程语言。 2)Java早期名称为OAK,后来才改为Java。 3)Java之父:詹姆斯高斯林。 4)2009年,SUN公司被Oracle公…...
ES6 对象扩展:对象简写,对象属性 表达式,扩展运算符 ...,Object.assign,Object.is,用法和应用场景
1. 对象属性简写 1.1 基本语法 // 传统写法 const name John; const age 25; const user {name: name,age: age };// ES6 简写语法 const user {name,age };1.2 实际应用场景 // 1. 函数返回对象 function createUser(name, age, email) {return {name,age,email}; }// …...
2025 持续防范 GitHub 投毒,通过 Sharp4SuoExplorer 分析 Visual Studio 隐藏文件
在2024年底的网络安全事件中,某提权工具被发现植入后门,攻击者利用 .suo 文件作为隐蔽的攻击方式。由于 .suo 文件是 Visual Studio 项目的隐藏配置文件,通常不为安全研究人员所关注,因此为攻击者提供了潜在的攻击渠道。 初步调查…...
PCB走线宽度与过流能力参考
我们PCB走线,线宽与允许通过电流的大小是什么样的?几个因素 1、允许的温升:如果能够允许的铜线升高的温度越高,那么允许通过的电流自然也就越高 2、走线的线宽:线越宽 ,导线横截面积越大,电阻…...
电商项目-分布式事务(四)基于消息队列实现分布式事务
基于消息队列实现分布式事务,实现消息最终一致性 如何基于消息队列实现分布式事务? 通过消息队列实现分布式事务的话,可以保证当前数据的最终一致性。实现思路:将大的分布式事务,进行拆分,拆分成若干个小…...
g++ -> make -> cmake(草稿)
1 Windows上安装mingw 2 构建一个 c 项目 3 g 编译 4 make 编译 5 cmake 编译...
JSON常用的工具方法
前言: 在日常开发中,JSON 数据的处理是常见的需求。无论是数据转换、格式化还是与其他格式的互转,掌握一些常用的工具方法可以大大提高开发效率。本文将介绍一些实用的 JSON 操作方法,帮助你快速上手。 JSON常用的工具方法 1.json字符串转换…...
【Kubernetes Pod间通信-第2篇】使用BGP实现Pod到Pod的通信
Kubernetes中Pod间的通信 本系列文章共3篇: 【Kubernetes Pod间通信-第1篇】在单个子网中使用underlay网络实现Pod到Pod的通信【Kubernetes Pod间通信-第2篇】使用BGP实现Pod到Pod的通信(本文介绍)【Kubernetes Pod间通信-第3篇】Kubernetes中Pod与ClusterIP服务之间的通信…...
[权限提升] Windows 提权 维持 — 系统错误配置提权 - Trusted Service Paths 提权
关注这个专栏的其他相关笔记:[内网安全] 内网渗透 - 学习手册-CSDN博客 0x01:Trusted Service Paths 提权原理 Windows 的服务通常都是以 System 权限运行的,所以系统在解析服务的可执行文件路径中的空格的时候也会以 System 权限进行解析&a…...
8. k8s二进制集群之Kubectl部署
创建kubectl证书请求文件生成admin证书文件复制admin证书到指定目录生成kubeconfig配置文件接下来完成kubectl配置文件的角色绑定【扩展】kubectl命令补全操作继续上一篇文章《k8s二进制集群之Kube ApiServer部署》下面介绍一下k8s中的命令行管理工具kubectl。 通过kubectl可以…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
