查看堆内存占用正常,jvm垃圾回收也没有异常。而top出来显示java占用内存是几个G,那么可能想到了是堆外内存泄漏。

需要安装google-perftools工具进行分析

1.先安装g++

不然编译会报错:g++: command not found

# yum -y install gcc gcc-c++
----

2.安装libunwind

不建议版本>0.99据说有问题,这个需要FQ
# wgethttp://download.savannah.gnu.org/releases/libunwind/libunwind-0.99.tar.gz
# tar -xzvf libunwind-0.99.tar.gz
# cd libunwind-0.99
# ./configure  --prefix=/data0/java/deploy/google-perftools/local/libunwind
# make && make install
---------

3.安装gperftools

# wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.5/gperftools-2.5.tar.gz
# tar -xzvf gperftools-2.5.tar.gz
# cd gperftools-2.5
# ./configure --prefix=/data0/java/deploy/google-perftools/local/gperftools-2.5/
# make && make install
-----------

4.使配置生效
# vim /etc/ld.so.conf.d/usr_local_lib.conf

新增以下内容按i
/data0/java/deploy/google-perftools/local/libunwind/lib
按esc再:wq! #保存退出
# /sbin/ldconfig  #执行此命令,使libunwind生效。 需要sudo权限
-------------------
5.加入环境变量
# export LD_PRELOAD=/data0/java/deploy/google-perftools/local/gperftools-2.5/lib/libtcmalloc.so
# export HEAPPROFILE=/data0/java/deploy/google-perftools/local/tmp/gzip
------
6.运行java程序

# java -classpath /xxx.jar com.xxx.xxx.HttpMain

就会在/data0/java/deploy/google-perftools/local/目录下生成heap文件


如果是持续运行的程序需要ctrl+c会生成dump文件。

7.分析函数调用
# /data0/java/deploy/google-perftools/local/gperftools-2.5/bin/pprof --text /usr/lib/jdk/jdk1.8.0_161/bin/java /data0/java/deploy/google-perftools/local/tmp/gzip.0001.heap

下面就是分析的函数:

也可以直接导出完整的函数到文本

# /data0/java/deploy/google-perftools/local/gperftools-2.5/bin/pprof --text /usr/lib/jdk/jdk1.8.0_161/bin/java /data0/java/deploy/google-perftools/local/tmp/gzip.0001.heap > gzip.0001.heap.log

下面选取一部分:

Total: 21.6 MB17.9  82.5%  82.5%     17.9  82.5% os::malloc@9240a03.0  13.9%  96.4%      3.0  13.9% init0.5   2.4%  98.8%      0.5   2.4% readCEN0.2   0.9%  99.7%      0.2   0.9% updatewindow0.0   0.2%  99.8%      0.0   0.2% inflateInit2_0.0   0.1%  99.9%      0.0   0.1% _dl_new_object0.0   0.0%  99.9%      0.0   0.0% _dl_allocate_tls0.0   0.0%  99.9%      0.0   0.0% _nl_intern_locale_data0.0   0.0% 100.0%      0.0   0.0% _dl_check_map_versions0.0   0.0% 100.0%      0.0   0.0% strdup0.0   0.0% 100.0%      0.5   2.4% ZIP_Put_In_Cache00.0   0.0% 100.0%      0.0   0.0% _dl_map_object_deps0.0   0.0% 100.0%      0.0   0.0% nss_parse_service_list0.0   0.0% 100.0%      0.0   0.0% getpwuid0.0   0.0% 100.0%      0.0   0.0% newEntry0.0   0.0% 100.0%      0.0   0.2% Java_java_util_zip_Inflater_init0.0   0.0% 100.0%      0.0   0.0% __nss_database_lookup0.0   0.0% 100.0%      0.0   0.0% expand_dynamic_string_token0.0   0.0% 100.0%      0.0   0.0% initLoopbackRoutes0.0   0.0% 100.0%      0.0   0.0% JLI_MemAlloc0.0   0.0% 100.0%      0.0   0.0% __tzfile_read0.0   0.0% 100.0%      0.0   0.1% dl_open_worker0.0   0.0% 100.0%      0.0   0.0% add_to_global0.0   0.0% 100.0%      0.0   0.0% add_name_to_object0.0   0.0% 100.0%      0.0   0.0% tsearch0.0   0.0% 100.0%      0.0   0.0% _nl_load_locale_from_archive0.0   0.0% 100.0%      0.0   0.0% __nss_lookup_function0.0   0.0% 100.0%      0.0   0.0% __tzstring0.0   0.0% 100.0%      0.0   0.1% _dlerror_run0.0   0.0% 100.0%      0.0   0.0% std::basic_string::_Rep::_S_create0.0   0.0% 100.0%      0.0   0.0% ParseLocale0.0   0.0% 100.0%      0.0   0.0% new_composite_name0.0   0.0% 100.0%      0.0   0.0% __static_initialization_and_destruction_0 (inline)

参考此文:

google-perftools安装

使用堆外内存  (说明什么是堆外内存以及怎么用堆外内存和问题)

java堆外内存泄漏

perftools查看堆外内存并解决hbase内存溢出

===============

下面这个是个人博客 怕没过几天网站不存在了,所以备份下

原文地址:http://www.dylan326.com/2017/09/28/gperftools/

perftools wiki地址 :https://github.com/gperftools/gperftools/wiki
安装perftools

工具主要作用分析程序:heap、cpu等,常用于c/c++程序分析
使用文档如下:
https://gperftools.github.io/gperftools/heapprofile.html
https://gperftools.github.io/gperftools/heap_checker.html
https://gperftools.github.io/gperftools/cpuprofile.html

JVM堆外内存分析

本文针对于 Oracle Hotspot jvm 虚拟机
JVM 进程占用大小一般约等于: heap + perm + thread stack + nio directbuffer
当然还有其他占用,一般情况来看native memory跟踪可以使用NMT参数 -XX:NativeMemoryTracking
详情wiki : https://docs.oracle.com/javase/8/docs/technotes/guides/vm/nmt-8.html
JVM常见内存泄漏检查方式可以按照 oracle提供的文档: http://www.oracle.com/technetwork/java/javase/memleaks-137499.html
其中dbx是和perftools类似工具。

除此之外
进程内存在用在linux 面下top,pmap 等工具是较好确定进程内存的手段, 在/proc/${pid}/ 目录下smaps文件等查看RSS,虚拟内存,swap占用等。
pmap 找到内存申请的地址块, 可以使用gdb attach 后 dump 某一段的内存地址 ,后查看内存的数据。 注意gdb attach 进程会暂停, 线上谨慎操作。

如果发现进程内存过高,可能需要注意下程序是否存在堆外内存泄漏问题,java进程出现的堆外内存泄漏常见有如下几个方面:

  • JNI
  • NIO directbuffer 泄漏
  • gzip (本文案例就是此类)

网络编程中程序中,nio directbuffer 有监控工具可以查看, directbuffer使用量、并且可以设置最大直接内存buffer。

JVM 进程使用perftools 做分析

案例中发现的问题jetty 服务在某版本的JDK(jdk7u80~jdk8u045等 应该7u80后的版本在本文章编写时候都有)出现的内存泄漏问题分析和查找

1、安装perftools 注意配置安装目录, 找到对应的文件路径
2、启动java程序时候携带环境变量(可以参照 perftools wiki帮助 写的较为明确, 文档主要针对正对c/c++程序, Hotspot主要是c++写的)
export LD_PRELOAD=/opt/perftools/lib/libtcmalloc.so # 安装后的库文件路径
export HEAPPROFILE=/opt/mybin.hprof #heap分析文件路径和文件
特别注意目录和文件权限是否是进程用户可使用的
3、运行后启动程序后
4、pprof执行程序(注意路径),分析这些heap文件 pprof –help查看使用方式
./perftools/bin/pprof –text *.heap 以文本结果展示heap的分析文件, 结果说明见perftools wiki文档

Total: 55838.9 MB
41320.8 74.0% 74.0% 41320.8 74.0% updatewindow
9018.8 16.2% 90.2% 9018.8 16.2% inflateInit2_
1559.4 2.8% 92.9% 1559.4 2.8% os::malloc@907260
1556.4 2.8% 95.7% 1556.4 2.8% init
587.5 1.1% 96.8% 587.5 1.1% 00007fb480508a66
551.4 1.0% 97.8% 551.4 1.0% 00007f2b1d6f4a66
451.5 0.8% 98.6% 451.5 0.8% 00007fb48177e8e9
183.1 0.3% 98.9% 183.1 0.3% 00007fb46c1b6c91
128.2 0.2% 99.1% 128.2 0.2% 00007fb480508245
120.4 0.2% 99.4% 120.4 0.2% 00007f2b1d6f4245
111.0 0.2% 99.6% 9129.7 16.4% Java_java_util_zip_Inflater_init
102.8 0.2% 99.7% 102.8 0.2% 00007f2b1e96a8e9
74.2 0.1% 99.9% 74.2 0.1% readCEN
45.8 0.1% 100.0% 45.8 0.1% 00007f2b09392c91
7.5 0.0% 100.0% 7.5 0.0% 00007fb4805025b6
4.5 0.0% 100.0% 4.5 0.0% 00007fb48192162d
 
.对于上述问题表现的jdk1.7.0_76不会出现

jdk1.7.0_80,jdk1.8.0_45以上明显出现。
用过pmap分析过 主要都是64m内存块较多, 查看过数据都是jar load相关的数据当时没引起注意
分析主要在updatewindow,Java_java_util_zip_Inflater_init , 这个是gzip相关, 于是搜索相关资料
结论如下:
‘’’Note that the URLClassLoader was properly disposed of, with a call to close() first, and that the ServiceLoader’s reload() method was also called to flush it’s internal cache.
This is NOT specific to the ServletContainerInitializer, it happens with any class that is loaded via the ServiceLoader.
File handles remain to the *.jar until the app’s process is stopped.’’’

网上查找相关资料
jdk 问题 http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8156014
jetty issue https://github.com/eclipse/jetty.project/issues/231

处理方法,以下其一

  • JDK降级到jdk7u76, 使用不会出现问题的JDK版本
  • 等新版本jdk bug修复
  • jetty contributer 给出的方案 disable url caching wiki https://github.com/eclipse/jetty.project/issues/575

Java堆外内存泄露分析相关推荐

  1. java堆外内存泄漏分析排查

    JAVA堆外内存分析 文章目录 JAVA堆外内存分析 1.前言 2.准备 3.具体分析 3.1堆外溢出风险判断 3.1.1确认java进程号 3.1.2查看此java进程的jvm参数 3.1.3查看j ...

  2. java 堆外内存泄露排查

    参考:http://blog.itpub.net/70016482/viewspace-2908649/ 一.原理 JDK提供绕过JVM直接在操作系统申请内存的接口,例如通过Unsafe类的alloc ...

  3. Java堆外内存:堆外内存回收方法

    一.JVM内存的分配及垃圾回收 对于JVM的内存规则,应该是老生常谈的东西了,这里我就简单的说下: 新生代:一般来说新创建的对象都分配在这里. 年老代:经过几次垃圾回收,新生代的对象就会放在年老代里面 ...

  4. Netty堆外内存泄露排查与总结

    导读 Netty 是一个异步事件驱动的网络通信层框架,用于快速开发高可用高性能的服务端网络框架与客户端程序,它极大地简化了 TCP 和 UDP 套接字服务器等网络编程. Netty 底层基于 JDK ...

  5. 一次堆外内存泄露的排查过程

    转载自  一次堆外内存泄露的排查过程 最近在做一个基于 websocket 的长连中间件,服务端使用实现了 socket.io 协议(基于websocket协议,提供长轮询降级能力) 的 netty- ...

  6. Netty堆外内存泄露排查盛宴

    导读 Netty 是一个异步事件驱动的网络通信层框架,用于快速开发高可用高性能的服务端网络框架与客户端程序,它极大地简化了 TCP 和 UDP 套接字服务器等网络编程. Netty 底层基于 JDK ...

  7. Netty堆外内存泄露排查与总结 1

    导读 Netty 是一个异步事件驱动的网络通信层框架,用于快速开发高可用高性能的服务端网络框架与客户端程序,它极大地简化了 TCP 和 UDP 套接字服务器等网络编程. Netty 底层基于 JDK ...

  8. Cassandra Java堆外内存排查经历全记录

    背景 最近准备上线cassandra这个产品,同事在做一些小规格ECS(8G)的压测.压测时候比较容易触发OOM Killer,把cassandra进程干掉.问题是8G这个规格我配置的heap(Xmx ...

  9. 记一次Cassandra Java堆外内存排查经历

    背景 最近准备上线cassandra这个产品,同事在做一些小规格ECS(8G)的压测.压测时候比较容易触发OOM Killer,把cassandra进程干掉.问题是8G这个规格我配置的heap(Xmx ...

最新文章

  1. D - Silver Cow Party POJ - 3268
  2. 生成全1矩阵_全矩阵捕获技术:一种最大限度提升便携式相控阵超声检测设备功能的新技术...
  3. Samba的配置命令
  4. mysql dblink 链接mysql库
  5. Git的撤销操作 git reset HEAD -- <file>
  6. 具体解释站点沙盒期的原因表现与解决的方法
  7. .NET网络编程学习(三)
  8. linux中用户忘记root的密码--ubuntu版本
  9. 机器视觉系统需要考虑的十个问题
  10. php slaveokay 设置,PHP: MongoCursor::slaveOkay - Manual
  11. 一加神秘新机入网:搭载天玑8100 首发长寿版150W超级闪充
  12. Tomcat漏洞修复方法【补丁下载及安装详细流程】
  13. ubuntu drbd双机互备
  14. asp.net怎么实现按条件查询_用这个提取函数王中王,制作数据查询表
  15. Unity编辑器扩展之RequireComponent等详解
  16. node创建项目步骤
  17. 计算机桌面上的图标如何删除,怎么删除电脑桌面上的图标啊?
  18. 江南大学c语言课程绩点评分,江南大学无锡医学院课程考核档案管理办法
  19. Unity 入门教程:贪吃射(1) —— Unity 安装和项目创建
  20. 飞行射击游戏的C++实现:一次课程作业

热门文章

  1. js大写字母转小写字母前加下划线
  2. linux下socket的close和shutdown
  3. Mybatis中动态sql小结
  4. js字符串字母大小写转换
  5. STM32F429使用touchGFX驱动外部flash存储资源
  6. 速汇金:蚂蚁金服收购被否,却与瑞波达成合作
  7. 【学习笔记】BZOJ4479 吃货jyy
  8. .Net Core 微服务实战 - Polly:重试、熔断、限流
  9. java.sql.SQLException: Incorrect string value解决办法
  10. 数睿数据智能工程部部长车文彬:聚焦场景化智能 加速无代码变革