[工作]堆外内存泄露分析,进程内存远超申请堆大小

最近工作中碰到了内存泄漏的问题

emmm, 这曲线还真挺恐怖的。

分析&解决过程:

一、 为啥没有fullGC

ps -ef 看了下虚拟机参数,发现堆空间就开了8g,这曲线都涨到14g了,问了下同事,曲线显示的是进程内存(堆内内存+堆外内存),所以下面就分别看下堆内内存和堆外内存的情况了。

二、 堆内内存的情况

1. 先理解下内存模型

内存模型
// https://mp.weixin.qq.com/s/uajRpzDayZSwTEPhFUoVbQ

新 new 的对象放在 Eden 区,当 Eden 区满之后进行一次 MinorGC,并将存活的对象放入 S0(survivor0);

当下一次 Eden 区满的时候,再次进行 MinorGC,并将存活的对象和 S0 的对象放入S1(S0 和 S1 始终有一个是空的);

依次循环直到 S0 或者 S1 快满的时候将对象放入 old 区,依次,直到 old 区满进行 FullGC。

jdk1.7 之前 Java 类信息、常量池、静态变量存储在 Perm 永久代,类的原数据和静态变量在类加载的时候放入 Perm 区,类卸载的时候清理;在 1.8 中,MetaSpace 代替 Perm 区,使用本地内存,常量池和静态变量放入堆区,一定程度上解决了在运行时生成或加载大量类造成的 FullGC,如反射、代理、groovy 等。

2. jmap

这是堆的配置信息了

这是堆的使用情况(堆申请了8g,只用了1g多)

3. jstat 每隔1s看下堆内不同区的动态情况

也没啥毛病

三、 堆外内存分析

1. 通过对堆内内存的分析,内存泄露的锅就和堆内内存没关了,所以很多查内存泄漏的blog说的dump、JProfile、gc日志分析工具等等的就免了

2. 使用google的gperftools进行堆外内存的分析

参考:

https://www.cnblogs.com/persistentsnail/p/3294843.html

https://qsli.github.io/2017/12/02/google-perf-tools/

(1) 安装&配置

---~/.bashrc 中配置环境变量
export LD_PRELOAD=/home/work/soft/gperftools-2.5/lib/libtcmalloc.so
export HEAPPROFILE=/data/soft/logs/tmp1/ --  貌似这里得加个1
export HEAP_PROFILE_ALLOCATION_INTERVAL=2000000000
  ----- 缺省是1G
 
 
--------------------------------分割线------------------------------
   
# if configuration files exist, prepend their contents to $@ so it can be processed by this runner
[[ -f "$script_conf_file" ]] && set -- $(loadConfigFile "$script_conf_file") "$@"
 
export LD_PRELOAD=/home/work/soft/gperftools-2.5/lib/libtcmalloc.so
export HEAPPROFILE=/data/soft/logs/tmp/
 
run "$@"
$ vi baike-answer
 
--------------------------------分割线------------------------------
god restart -- 重启服务

(2) 查看服务生成文件

环境变量配置的路径中
ls -ltra -- 注意是隐藏文件
-rw-r--r-- 1 work work    1048571 Feb  5 16:44 .0738.heap
-rw-r--r-- 1 work work    1048567 Feb  5 16:46 .0739.heap
-rw-r--r-- 1 work work    1048561 Feb  5 16:47 .0740.heap
-rw-r--r-- 1 work work    1048565 Feb  5 16:49 .0741.heap
-rw-r--r-- 1 work work    1048565 Feb  5 16:51 .0742.heap
-rw-r--r-- 1 work work    1048565 Feb  5 16:52 .0743.heap
-rw-r--r-- 1 work work    1048569 Feb  5 16:54 .0744.heap
-rw-r--r-- 1 work work    1048574 Feb  5 16:55 .0745.heap

(3) 导出成pdf文件

/home/work/soft/gperftools-2.5/bin/pprof --pdf ~/java/bin/java ./.0748.heap > result.pdf

(4) 查看pdf文件

对比分析上述结果,可以看到Java_org_tensorflow_TensorFlow_libraryOpList使用的内存持续增长,这个地方存在(堆外)内存泄漏(其他对象使用内存变化不大)
那么接下来应该分析服务中tensorflow的使用情况

四、 解决问题

todo:

五、 总结

要分清是堆内内存泄露还是堆外内存泄露

 

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ssh命令是openssh套件中的客户端连接工具,可以给予ssh加密协议实现安全的远程登录服务器,实现对服务器的远程管理。 在系统终端中执行ssh命令时,可以使用以下语法格式:ssh [参数] [远程主机]。常用的参数包括: -1: 强制使用ssh协议版本1 -2: 强制使用ssh协议版本2 可以通过ssh命令来远程连接服务器,并执行一系列操作,例如上传文件、下载文件、执行命令等。 另外,如果在系统终端中执行一个命令后想立即停止它,可以同时按下Ctrl C组合键,将立即终止该命令的进程。如果有些命令在执行时不断地在屏幕上输出信息,影响到后续命令的输入,则可以在执行命令时在末尾添加上一个`&`符号,这样命令将进入系统后台来执行。 关于ssh命令的具体用法,可以按照以下格式执行:`ssh 用户名@ip`。其中,用户名是在远程机器上的用户名,ip是远程机器的地址,可以是IP地址或者域名。如果需要指定端口号,可以使用`-p`参数,例如`ssh -p 22 [email protected]`,其中22是SSH Server监听的端口号,默认为22。 除了ssh命令,还有一个相关的命令是scp命令。scp命令可以用来在本地和远程服务器之间进行文件复制。具体的用法包括:`scp 用户名@ip:文件名或路径@ip:文件名或路径`。可以通过scp命令将文件从本地复制到远程服务器,或者从远程服务器复制到本地。同样地,如果需要指定端口号,可以使用`-P`参数,例如`scp -P 22 [email protected]:Desktop/01.py`,其中22是SSH Server监听的端口号,默认为22。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [ssh命令 安全连接客户端](https://download.csdn.net/download/weixin_38691319/14889853)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Linux远程管理常用命令(超全超详细)【持续更新】](https://blog.csdn.net/zhangxl123liang/article/details/123818194)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值