生产环境Java应用服务内存泄漏分析与解决

这篇博客记录了一个生产环境中CRM服务出现内存泄漏的问题,分析了内存分配、JVM参数配置、直接内存使用,发现由于NIO的DirectByteBuffer缓存导致的内存占用。解决方案包括限制最大缓存的DirectByteBuffer大小和调整MaxDirectMemorySize参数,从而解决了内存泄漏问题。

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

有个生产环境CRM业务应用服务,情况有些奇怪,监控数据显示内存异常。内存使用率99.%多。通过生产监控看板发现,CRM内存超配或内存泄漏的现象,下面分析一下这个问题过程记录。

1、服务器硬件配置部署情况

生产服务器采用阿里云ECS机器,配置是2HZ、8GB,单个应用服务独占,CRM应用独立部署,即单台服务器仅部署一个java应用服务。

用了6个节点6台机器,每台机器都差不多情况。

监控看板如下:

top命令查看物理占用情况

通过看板情况来看确实存在异常情况,下面进一步分析问题原因。

2、应用启动参数配置

应用启动配置参数如下:

 /usr/bin/java

-javaagent:/home/agent/skywalking-agent.jar

-Dskywalking.agent.service_name=xx-crm

 -XX:+HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath=/tmp/xx-crm.hprof

-Dspring.profiles.active=prod

-server -Xms4884m -Xmx4884m -Xmn3584m

-XX:MetaspaceSize=512m

-XX:MaxMetaspaceSize=512m

-XX:CompressedClassSpaceSize=128m

-jar /home/xxs-crm.jar

堆内:最大最小堆内存4884m约4.8G左右,其中新生代-Xmn3584m 约3.5G左右,

非堆: 元数据区配置 512M,类压缩空间 128M, Code Cache、buffer等代码缓存区240M(没有配置参数,通过监控看板看到的)。

3、内存分布统计

从监控看板的数据来看,我们简单统计一下内存分配数据情况。

通过JVM配置参数和监控看板数据可知:

堆内存:4.8G

非堆内存:(Metaspace)512M+(CompressedClassSpace)128M+(Code Cache、Buffer等)240M约等1GB左右。

堆内存(heap)+非堆内存(nonHeap)=5.8G

8GB物理内存除去操作系统本身占用大概占500M。即除了操作系统本身占用之外,还有7.5G可用内存。

但是 7.5-5.8=1.7GB,起码至少还有1~2GB空闲才合理呀!怎么内存占用率99%多,就意味着有1~2G不知道谁占去了,有点诡异!

4、问题分析

先看一下JVM内存模型,环境是使用JDK8

JVM内存数据分区如下图所示:

堆heap分配结构如下图所示:

  堆大家都比较熟悉,也容易理解的,也是java程序接触得最多的一块,不存在什么数据上统计错误,或占用不算之类的。

那说明额外占用也非堆里面,只不过没有统计到非堆里面去,曾经一度怀疑监控prometheus展示的数据有误

其实不是监控统计的问题,那是什么问题呢?

先看一下dump文件数据,这里使用MAT工具(一个开源免费的内存分析工具,个人认为比较好用,推荐大家使用。下载地址:https://www.eclipse.org/mat/downloads.php)。

通过下载内存dump镜像观察到,如下图所示:

有个offHeapStore,这个东西堆外内存,可以初步判断是 ehcahe引起的。

<
### 安装最新版CUDA 对于希望安装最新版CUDA的用户,建议按照官方指南操作以确保最佳兼容性和稳定性。在开始之前,确认计算机当前支持的CUDA版本非常重要。这可以通过命令提示符中的`nvidia-smi`命令来完成,在返回的信息中表格右上角会显示所使用的显卡可以适配的最高CUDA版本[^2]。 #### 下载CUDA Toolkit 访问[NVIDIA官方网站](https://developer.nvidia.com/cuda-downloads),选择适合的操作系统、架构和其他必要参数后点击下载按钮获取最新的CUDA工具包。注意,有时为了获得更好的稳定性,可以选择稍微低于最大支持版本的一个版本进行安装[^1]。 #### 卸载旧版本CUDA(如果有) 如果已经安装了较早版本的CUDA,则应先卸载这些旧版本。具体方法取决于操作系统;对于Linux系统来说,通常涉及移除现有软件包以及清理残留文件等步骤。务必仔细阅读相关文档以防止误删重要组件。 #### 配置环境变量 成功安装新版本之后,还需要适当调整系统的PATH和LD_LIBRARY_PATH等环境变量设置,使得编译器及其他应用程序能够找到新的库位置。此过程同样依赖于具体的平台差异而有所不同[^3]。 #### 测试安装是否成功 最后一步是对刚刚完成的新安装执行简单的验证程序,比如运行一些示例代码或者尝试构建项目来看看是否存在任何链接错误等问题。NVIDIA提供了多种方式来进行这项工作,包括但不限于使用nvcc编译器自带的例子。 ```bash # 编译并运行一个简单的CUDA C++例子 $ nvcc -o vectorAddition vectorAddition.cu $ ./vectorAddition ``` #### cuDNN 的安装 由于cuDNN是深度学习框架的重要组成部分之一,因此也需要特别关注其正确安装。首先需注册成为开发者成员才能从NVIDIA网站合法获取所需资源。接着依据个人需求挑选对应CUDA版本号的cuDNN压缩包,并依照说明将其放置到相应目录下。 ```bash tar -xvzf cudnn-<version>-linux-x64-v<revision>.tgz sudo cp cuda/include/cudnn*.h /usr/local/cuda/include/ sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64/ sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn* ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值