首先确认堆占用

jmap 查看heap内存使用情况

jmap -heap pid
1

可以查看到MetaspaceSize,CompressedClassSpaceSize,MaxMetaSize
jmap和jdk版本有关系,有些jdk版本会查看不到内存信息,可以使用jstat来查看统计信息

jstat 收集统计信息

jstat -gc pid 1000

1

S0C/S0U S1C/S1U EC/EU CCSC/CCSU YGC/YGCT FGC/FCGT GCT
survivor0容量和使用 survivor1容量和使用 Eden jdk8是meta,以前应该是PC,PC young gc次数和耗时 full gc次数和耗时 total gc时间

排除掉heap的问题
分析堆外情况
NMT(native memory tracking)

使用
在JVM参数中添加
-XX:NativeMemoryTracking=[off | summary | detail]

-XX:NativeMemoryTracking=detail

1

在JVM运行过程中,使用jcmd获取相关信息
jcmd pid VM.native_memory [summary | detail | baseline | summary.diff | detail.diff | shutdown] [scale= KB | MB | GB]

jcmd pid VM.native_memory detail

1

baseline个基准,之后会输出diff参数,来和这个基线版本进行比较,可以两次的内存差
NMT报告会显示内存使用情况
类别 含义
Java Heap 堆大小
Thread 线程
Thread Stack 线程栈

更多参考:

https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr022.html

NMT可以得到线程栈大小,排除栈空间影响
pmap 查看进程内存地址空间

pmap -x pid | sort xx

1

可以结合pmap,和nmt得到内存地址空间。和堆外占用情况了

接下来需要做的就是分析堆外内存的内容了。
gdb dump查看内存空间内容

(gdb) dump binary memory ./file BEGIN_ADDRESS END_ADDRESS

1

将内存内容dump到文件中,就可以查看到文件中的内容了。
但是这种方式不直观,所以可以使用其他工具

gperf
google的,使用gperf2.5即可,网上很多安装都说一定要安装libunwind,其实都是瞎抄抄,老版本确实需要,2.5的版本不需要了。

https://blog.csdn.net/unix21/article/details/79161250
另外一个注意点就是虽然heap文件只有1M,但是可以分析出堆外内存的大小。
不过我在实际使用过程中,gperf并没有分析出实际的堆外内存情况,通过pmap可以看出堆外内存占用有几个G,但是gperf始终只有200M

Jemalloc
https://github.com/jemalloc/jemalloc/releases
安装

./configurate –enable-prof
make
sudo make install
1
2
3

配置

export LD_PRELOAD=/usr/local/lib/libjemalloc.so
export MALLOC_CONF=prof:true,lg_prof_interval:31,lg_prof_sample:17,prof_prefix:/output/jeprof

1
2

https://github.com/jemalloc/jemalloc/wiki/Getting-Started

最后分析是dubbo,rpc调用过程中,有很多的数据传输对象,而堆外内存大小又没有限制,导致内存持续飙高

最新文章

  1. Windows 10 的音频和 MIDI API将统一
  2. 关于UIView布局的总结
  3. SqlServer触发器判断对表操作类型(增、删、改)并将修改后的数据映射到新表
  4. 修复 XE7 , XE8 Frame 内 PopupMenu 快捷键失效问题
  5. VIM的姿势
  6. DelPhi连接数据库方式
  7. 【c语言】求最大值
  8. svnkit添加节点
  9. BZOJ_2049_[Sdoi2008]Cave 洞穴勘测_LCT
  10. ubuntu16.04系统深度学习开发环境、常用软件环境(如vscode、wine QQ、 360wifi驱动(第三代暂无))搭建相关资料
  11. Notepad++ PluginManager安装常用插件
  12. Hadoop Mapreduce 调优
  13. 简单搭建一个SpringBoot
  14. JAVA值类型和引用类型的区别
  15. VMware5.5-存储
  16. escu问题及解决
  17. Click()与Submit()
  18. ES5新增数组方法every()、some()、filter()、map()
  19. How to make an HTTP request 异步 JavaScript 和 XML
  20. 三角形-->九九乘法表

热门文章

  1. 不能在具有唯一索引“IX_******”的对象“dbo.****”中插入重复键的行。重复键值为 (110, 372000, 2)。
  2. SQL事务的四种隔离级别和MySQL多版本并发控制
  3. weblogic启动失败java.lang.NullPointerException
  4. PostgreSQL备份工具-pg_backrest(转)
  5. ThinkPHP5.0完全开发手册.【CHM】下载
  6. swift 3 发送 HTTP 请求函数
  7. Ubuntu16.04 --> 14.04
  8. erlang开发环境配置
  9. postman简单使用
  10. BZOJ4976:宝石镶嵌(DP&思维)