zoukankan      html  css  js  c++  java
  • java问题之2:JVM堆外内存问题排查--删除

    首先确认堆占用

    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调用过程中,有很多的数据传输对象,而堆外内存大小又没有限制,导致内存持续飙高

  • 相关阅读:
    ES6基础之——对象表达式
    ES6基础之——函数的名字name属性
    ES6基础之——解构参数 Destructured Parameters
    ES6基础之——展开操作符Spread和剩余操作符Rest
    ES6基础之——箭头函数Arrow Fuctions
    ES6基础——默认参数 Default Parameter Values
    node.js 调用第三方服务
    node 创建server 及加载静态页面
    VUE插件-图片濑加载
    Less函数说明
  • 原文地址:https://www.cnblogs.com/duanxz/p/5210057.html
Copyright © 2011-2022 走看看