java 监控 native 内存_JVM NativeMemoryTracking 分析堆外内存泄露

Native Memory Tracking (NMT) 是Hotspot VM用来分析VM内部内存使用情况的一个功能。我们可以利用jcmd(jdk自带)这个工具来访问NMT的数据。

NMT介绍

工欲善其事必先利其器,我们先把相关需要的配置和工具介绍清楚,再通过例子来看看具体如何使用NMT。

打开NMT

NMT必须先通过VM启动参数中打开,不过要注意的是,打开NMT会带来5%-10%的性能损耗。

-XX:NativeMemoryTracking=[off | summary | detail]

# off: 默认关闭

# summary: 只统计各个分类的内存使用情况.

# detail: Collect memory usage by individual call sites.

jcmd查看NMT报告

通过jcmd查看NMT报告以及查看对比情况。

jcmd VM.native_memory [summary | detail | baseline | summary.diff | detail.diff | shutdown] [scale= KB | MB | GB]

# summary: 分类内存使用情况.

# detail: 详细内存使用情况,除了summary信息之外还包含了虚拟内存使用情况。

# baseline: 创建内存使用快照,方便和后面做对比

# summary.diff: 和上一次baseline的summary对比

# detail.diff: 和上一次baseline的detail对比

# shutdown: 关闭NMT

VM退出时打印NMT

可以通过下面VM参数在JVM退出时打印NMT报告。

-XX:+UnlockDiagnosticVMOptions -XX:+PrintNMTStatistics

NMT实战

症状

某个服务(C)在客户环境使用后发现其内存占用不断变大且远超Xmx指定的大小,导致整个系统因缺少内存造成其他服务无法启动。当时查看到其RSS大约为11G,-Xmx=6G而且heap利用率不到50%。

user@hostxxx> prstat -p 2780

PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP

2780 user 11G 11G sleep 59 0 44:16:39 0.0% java/196

user@hostxxx> /opt/jdk1.8.0_40/bin/jstat -gcutil 2780

S0 S1 E O M CCS YGC YGCT FGC FGCT GCT

0.00 100.00 90.60 46.80 98.02 97.10 11323 4049.745 11 225.345 4275.090

分析

服务通过-Xmx=6G指定最大堆分配为6G,但实际RSS已达到11G,开始怀疑堆外内存是否有内存泄露。为了有更好详细的数据,就在本地重现这个问题,并且打开了NMT持续监控。

NMT的Report如下,重点关注每个分类下的commit大小,这个是实际使用的内存大小。

6739: #进程ID

Native Memory Tracking:

Total: reserved=8491110KB, committed=7220750KB

- Java Heap (reserved=6293504KB, committed=6291456KB)

(mmap: reserved=6293504KB, committed=6291456KB)

- Class (reserved=1107429KB, committed=66189KB)

(classes #11979)

(malloc=1509KB #18708)

(mmap: reserved=1105920KB, committed=64680KB)

- Thread (reserved=159383KB, committed=159383KB)

(thread #156)

(stack: reserved=158720KB, committed=158720KB)

(malloc=482KB #788)

(arena=182KB #310)

- Code (reserved=255862KB, committed=41078KB)

(malloc=6262KB #9319)

(mmap: reserved=249600KB, committed=34816KB)

- GC (reserved=449225KB, committed=449225KB)

(malloc=166601KB #1714646)

(mmap: reserved=282624KB, committed=282624KB)

- Compiler (reserved=395KB, committed=395KB)

(malloc=265KB #856)

(arena=131KB #3)

- Internal (reserved=146041KB, committed=146041KB)

(malloc=132185KB #276370)

(mmap: reserved=13856KB, committed=13856KB)

- Symbol (reserved=31487KB, committed=31487KB)

(malloc=29209KB #91080)

(arena=2278KB #1)

- Native Memory Tracking (reserved=33212KB, committed=33212KB)

(malloc=168KB #2575)

(tracking overhead=33044KB)

- Arena Chunk (reserved=2284KB, committed=2284KB)

(malloc=2284KB)

- Unknown (reserved=12288KB, committed=0KB)

(mmap: reserved=12288KB, committed=0KB)

Virtual memory map:

......

并且在服务器上通过cron job来定期抓取NMT的report保存下来做分析,而且同时也把其对应的RSS和PMAP都抓取了一份。

COLLECTOR_PID=`ps -ef|grep "ProcessName" | grep -v grep | awk '{print $2}'`

OUTDIR=/opt/chkmem

HOSTNAME=`hostname`

prstat -s rss 1 1 > ${OUTDIR}/${HOSTNAME}_coll_${COLLECTOR_PID}_prstat_`date '+%Y%m%d_%H%M%S'`.txt

/opt/jdk1.8.0_40/bin/jcmd ${COLLECTOR_PID} VM.native_memory detail > ${OUTDIR}/${HOSTNAME}_coll_${COLLECTOR_PID}_nmd_`date '+%Y%m%d_%H%M%S'`.txt

pmap -x ${COLLECTOR_PID} > ${OUTDIR}/${HOSTNAME}_coll_${COLLECTOR_PID}_pmap_`date '+%Y%m%d_%H%M%S'`.txt

分析发现NMT中的Symbol域持续增大,从最开始的几十兆已经增加到了2G左右,而且整个jvm的内存使用量也在持续增加。见下图:

674725f2b7c884291230c07df0ec80d6.png

验证后发现问题和JDK8的bug https://bugs.java.com/view_bug.do?bug_id=8180048 非常类似,测试后也证实确实如此,最后通过升级JDK解决了这个问题。 导致这个问题的组件是Jackson Streaming API 中的 JsonFactory.Feature.INTERN_FIELD_NAMES 引起的,由于项目中需要大量解析动态json文件,并且key都被intern到JVM native 内存无法释放导致内存泄露。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356834.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Charles 从入门到精通

目录与版权 转载请保留顶部的 Charles 中国特惠内容,本文的内容主要包括: Charles 的简介如何安装 Charles将 Charles 设置成系统代理Charles 主界面介绍过滤网络请求截取 iPhone 上的网络封包截取 Https 通讯信息模拟慢速网络修改网络请求内容给服务器做…

java 批量验证_正则表达式批量验证函数

正则表达式批量验证函数function checkData(){//判断数据的正确性var idSpans new Array();idSpans[0] new Array("item_4","^[\\s\\S]{1,16}$","productName","商机名称应在1-16字以内","",true); idSpans[1] new Array(…

css3制作炫酷导航栏效果 转

今天主要利用hover选择器。鼠标滑过查看效果。 一。普通导航栏 HomeContentServiceTeamContact对于这种普通的导航栏,只是鼠标滑过的时候颜色会变,所以思路变得很简单。 (1)使用ul标签布局 (2)鼠标经过事件…

桥梁设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 ! 目录 …

简单的遮罩层加登录窗效果

<!DOCTYPE html> <html> <head> <meta charset"utf-8" /> <title>遮罩层加登录窗</title> <style type"text/css"> #wrap{width: 60px;height: 30px; position: absolute; text-align: center; line-height: 30…

java上机面试题 039_深入 Java 虚拟机之面试总结篇

在学习 JVM 相关知识&#xff0c;怎么让自己有动力看下去&#xff0c;且有思考性呢&#xff1f;笔者认为&#xff0c;开头用一些常用的面试题&#xff0c;来引入读者的兴趣比较好&#xff0c;这样才会有看下去的动力。所以&#xff0c;该篇文章会以面试总结的方式&#xff0c;希…

常用加密算法的Java实现(一) ——单向加密算法MD5和SHA

1、Java的安全体系架构 1.1 Java的安全体系架构介绍 Java中为安全框架提供类和接口。JDK 安全 API 是 Java 编程语言的核心 API&#xff0c;位于 java.security 包&#xff08;及其子包&#xff09;&#xff0c;以及sun.securityAPI包&#xff08;及其子包&#xff0…

状态设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01; 目录 …

python基础——错误处理

python基础——错误处理 在程序运行的过程中&#xff0c;如果发生了错误&#xff0c;可以事先约定返回一个错误代码&#xff0c;这样&#xff0c;就可以知道是否有错&#xff0c;以及出错的原因。在操作系统提供的调用中&#xff0c;返回错误码非常常见。比如打开文件的函数ope…

java获取数组的最小值_Java 数组获取最大和最小值的实例实现

以下实例演示了如何通过 Collections 类的 Collections.max() 和 Collections.min() 方法来查找数组中的最大和最小值&#xff1a;Main.java 文件&#xff1a;import java.util.Arrays;import java.util.Collections;public class Main {public static void main(String[] args…

Spring_事务(2)

转载于:https://www.cnblogs.com/yang-hao/p/5830952.html

heroku_本月风味– Neo4j和Heroku

herokuNeo4j今年早些时候发起了一项挑战&#xff0c;即“ 种子播云 ”&#xff0c;以使人们使用Neo4j附加组件在Heroku上创建模板或演示应用程序。 经过许多内部辩论之后&#xff0c;我决定进入&#xff0c;但由于缺乏想法而陷入绝望。 当我没有做任何特别的事情时&#xff0c;…

代理设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01; 目录 …

春云边车

我有一个部署到基于NetflixOSS的云的应用程序&#xff0c;该应用程序具有以下结构&#xff1a; 本质上是一种将信息持久保存到Cassandra群集的服务。 所有应用程序都已注册到Eureka –因此&#xff0c;在本例中&#xff0c;该服务以及Cassandra节点都已在Eureka中注册&#xf…

activemq端口好_ActiveMQ已准备好黄金时段

activemq端口好ActiveMQ项目始于2005年-在很大程度上&#xff0c;它一直是Apache Software Foundation的顶级项目。 ActiveMQ项目的目的一直是提供世界一流的企业消息传递解决方案&#xff0c;使经纪人能够提供从支持IP的智能设备一直到企业后端的高可用性的连通性。 ActiveMQ提…

js创建节点,小试牛刀

实现如下的功能 非常简单的一个小训练。 思想&#xff1a; 1.首先创建text和一个button 代码如下、 1 <body> 2 <input type"text" id"text1"/> 3 <input id"btn1" type"button" value"创建" /> 4 <u…

企业讯息

本文是我们名为“ Spring Integration for EAI ”的学院课程的一部分。 在本课程中&#xff0c;向您介绍了企业应用程序集成模式以及Spring Integration如何解决它们。 接下来&#xff0c;您将深入研究Spring Integration的基础知识&#xff0c;例如通道&#xff0c;转换器和适…

Spring MVC 学习笔记一 HelloWorld

Spring MVC 学习笔记一 HelloWorld Spring MVC 的使用可以按照以下步骤进行&#xff08;使用Eclipse&#xff09;&#xff1a; 加入JAR包在web.xml中配置DispatcherServlet加入Spring MVC的配置文件编写处理请求的处理器&#xff0c;并添加对应注解编写视图下面按照国际惯例先来…

php 避免xss_PHP防止XSS注入

我们在做网站的时候&#xff0c;经常有input提交&#xff0c;通常前端对input中的内容不做判断&#xff0c;只做不为空等简单的操作。但是&#xff0c;有的input中会提交一些javascript或者html,会给网站造成一定的危害。为此&#xff0c;防止XSS注入的任务交给了后端&#xff…

全字符微信名 php,PHP方法处理微信昵称特殊符号过滤

我们在通过PHP获取微信昵称&#xff0c;并且存于数据库的时候&#xff0c;由于一些昵称带有特殊符号&#xff0c;所以存不进去&#xff0c;这时候我们可以通过下面的方式来处理。方法二protected function removeEmoji($clean_text) {// Match Emoticons$regexEmoticons /[\x{…