dmesg命令查看java程序突然挂掉的原因

当JAVA服务在线上无预警地crash,日志无明显信息时,通过学习了解到dmesg命令的强大。该命令用于查看内核环形缓冲区,帮助调试硬件问题。在服务器上运行dmesg命令后,发现进程因内存不足被系统kill,确认了最初的内存不足假设。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:

JAVA服务线上毫无征兆的直接crash掉,打开日志查看,日志文件毫无相关挂掉的信息,所以当时直接选择了重启,当时的猜测是:服务内存不足导致程序进程直接挂掉?

查找原因

后来学习查找到一个命令dmesg命令,这个命令还是非常强大的。dmesg命令行实用程序用于在Linux和其他类似Unix的操作系统中打印和控制内核环形缓冲区。对于检查内核启动消息和调试与硬件相关的问题很有用。
可以在服务器执行命令:

# 按时间格式显示
dmesg -T

# 显示跟java 有关的日志
dmesg -T | grep "(java)"

通过命令dmesg -T | grep "(java)" 得到结果为:

$>dmesg -T | grep "(java)"
[Sat Jul  4 09:11:49 2020] Out of memory: Kill process 20982 (java) score 847 or sacrifice child
[Sat Jul  4 09:11:49 2020] Killed process 20982 (java) total-vm:6072468kB, anon-rss:3280252kB, file-rss:0kB, shmem-rss:0kB
[Thu Jul  9 12:42:41 2020] Out of memory: Kill process 22667 (java) score 846 or sacrifice child
[Thu Jul  9 12:42:41 2020] Killed process 22667 (java) total-vm:6095496kB, anon-rss:3278164kB, file-rss:0kB, shmem-rss:0kB
结论

从查找的进程kill 日志可以看出,应用程序确实因为内存服务器内存问题被kill掉。

微信公众号

### dmesg命令的功能与使用方法 `dmesg` 是 Linux 系统中的一个重要工具,用于查看内核环形缓冲区的内容。它主要用于调试硬件问题、监控内核事件以及分析系统行为。以下是关于 `dmesg` 命令的核心功能及其常见用法。 #### 核心功能 `dmesg` 提供了多种功能来帮助管理员和开发者理解系统的内部工作状况[^3]: - **查看系统启动时的硬件检测日志**:通过该命令可以获取到系统启动过程中硬件初始化的相关信息。 - **实时监控内核事件**:能够动态跟踪 USB 设备插拔、磁盘错误等重要事件。 - **调试驱动加载问题及内核模块状态**:当某些设备无法正常工作时,可以通过此命令查找对应的驱动程序或模块的状态。 - **分析系统崩溃或性能异常的原因**:对于难以定位的问题,`dmesg` 可能会记录下关键线索。 - **查看内存分配、CPU 调度等内核活动**:深入了解操作系统底层运作机制。 #### 基本语法 `dmesg` 的基本形式如下所示: ```bash dmesg [选项] ``` 常见的选项包括但不限于以下几个方面[^2][^4]: - `-x`: 添加解码后的设施(facility)名称和优先级(level),使得输出更加直观易懂。 - `-T`: 在每条消息前面加上实际日期时间戳而非相对秒数。 - `-l LEVELS`: 仅显示指定级别的日志项;其中LEVELS是由逗号分隔的一系列有效等级名组成的列表(如info, warn, err)。 - `-w`: 启动持续监视模式,在新消息到达时自动刷新屏幕。 - `--facility=FACILITIES`: 过滤属于某个特定类型的日志源(FACILITIES同样由多个名字构成并通过逗号连接起来比如kern,user...)。 下面是一些实用的例子: 1. 展示带有人类可读的时间戳的信息,并启用详细解释开关: ```bash sudo dmesg -eTx ``` 2. 获取所有警告及以上严重程度的消息存入文件system_errors.log中: ```bash dmesg -xl warn,err,crit &> system_errors.log ``` 3. 定位含有关键字"memory","disk",或者"usb"等相关联的潜在故障描述: ```bash dmesg | egrep '(memory|disk|usb)' ``` 4. 如果希望长时间观察某类特殊外设的行为变化,则可以用管道配合grep实现过滤效果: ```bash dmesg -wH | grep 'USB' ``` 需要注意的是,默认情况下只有超级用户才有权访问完整的内核日志数据流。然而现代发行版往往赋予普通账户一定程度上的查询能力以便于排查简单事务[^5]^。不过涉及敏感区域的操作依旧受限保护策略制约。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值