对最近linux下排查java内存相关问题的命令做个小的总结

linux系列

top

top -p PID

pid为12415进程的资源消耗情况。这里是以进程为单位。

top -Hp PID

这里是以线程为单位。其中RES看到没有线程占用的内存都是3.3g,是因为JVM内存区域中大部分都是线程共享的。

同时也可以通过shift+h在-p视图下切换至线程视图(set threads On),如下图:

说明:top命令的TIME/TIME+是指的进程/线程所使用的CPU时间,不是进程/线程启动到现在的时间,因此,如果一个进程/线程使用的cpu很少,那即使这个进程/线程已经存在N长时间,TIME/TIME+也是很小的数值。

/proc/$pid/status

[#]$ cat /proc/12415/status

Name: java

State: S (sleeping)

Tgid: 12415

Pid: 12415

PPid: 1

TracerPid: 0

Uid: 502 502 502 502

Gid: 501 501 501 501

Utrace: 0

FDSize: 512

Groups: 501

VmPeak: 6734784 kB

VmSize: 6732236 kB

VmLck: 0 kB

VmHWM: 3476100 kB

VmRSS: 3473752 kB

VmData: 6560732 kB

VmStk: 88 kB

VmExe: 4 kB

VmLib: 17620 kB

VmPTE: 7404 kB

VmSwap: 0 kB

Threads: 108

SigQ: 0/23301

SigPnd: 0000000000000000

ShdPnd: 0000000000000000

SigBlk: 0000000000000000

SigIgn: 0000000000000002

SigCgt: 2000000181005ccd

CapInh: 0000000000000000

CapPrm: 0000000000000000

CapEff: 0000000000000000

CapBnd: ffffffffffffffff

Cpus_allowed: f

Cpus_allowed_list: 0-3

Mems_allowed: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001

Mems_allowed_list: 0

voluntary_ctxt_switches: 1

nonvoluntary_ctxt_switches: 1

其中VmRSS表示就是占用的物理内存。Threads表示当前开启的线程数。

特别说明RSS【实际使用物理内存】的含义:resident set size, the non-swapped physical memory that a task has used (in kiloBytes). (alias rssize, rsz).

pmap

[~]$ pmap -d 12415

12415: /usr/local/env/jdk1.8/bin/java -server -Xmx1024M -Xms1024M -Xmn512M -XX:MaxMetaspaceSize=128M -XX:MetaspaceSize=128M -XX:MaxDirectMemorySize=128M -XX:+UseConcMarkSweepGC -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses -XX:+CMSClassUnloadingEnabled -XX:+ParallelRefProcEnabled -XX:+CMSScavengeBeforeRemark -XX:-HeapDumpOnOutOfMemoryError -XX:+UseFastAccessorMethods -Xss256k -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:GCTimeRatio

Address Kbytes Mode Offset Device Mapping

0000000000400000 4 r-x-- 0000000000000000 0fc:00001 java

0000000000600000 4 rw--- 0000000000000000 0fc:00001 java

000000000116d000 996 rw--- 0000000000000000 000:00000 [ anon ]

00000000c0000000 1063680 rw--- 0000000000000000 000:00000 [ anon ]

0000000100ec0000 1033472 ----- 0000000000000000 000:00000 [ anon ]

0000003112e00000 88 r-x-- 0000000000000000 0fc:00001 libgcc_s-4.4.7-20120601.so.1

0000003112e16000 2044 ----- 0000000000016000 0fc:00001 libgcc_s-4.4.7-20120601.so.1

0000003113015000 4 rw--- 0000000000015000 0fc:00001 libgcc_s-4.4.7-20120601.so.1

00007f2c7d4a8000 12 r--s- 0000000000020000 0fc:00001 start.jar

00007f2c7d4ab000 4 rw--- 0000000000000000 000:00000 [ anon ]

00007f2c7d4ac000 4 r---- 0000000000000000 000:00000 [ anon ]

00007f2c7d4ad000 4 rw--- 0000000000000000 000:00000 [ anon ]

00007ffddeeed000 84 rw--- 0000000000000000 000:00000 [ stack ]

00007ffddef12000 4 r-x-- 0000000000000000 000:00000 [ anon ]

ffffffffff600000 4 r-x-- 0000000000000000 000:00000 [ anon ]

mapped: 6732236K writeable/private: 3786640K shared: 10820K

为方便展示省去中间部分内容

这里看pmap重点是最后一行,进程实际使用的物理内存是writeable/private: 3786640K。

其他几个点是什么意思呢?linux 会把一些shared libraries 载入到内存中,在pmap 的输出中,这些shared libraries 的名字通常是 lib*.so 。如 libX11.so.6.2.0 。这个 libX11.so.6.2.0 会被很多process load 到自己的运行环境中。上面展示的mapped的内存就包含这部分和其他进程共享的内存【pmap is reporting virtual memory statistics which match top VIRT column . This is including data shared with other processes and other pages stored on disk.】。

google perf

gperftools是google开发的一款非常实用的工具集,主要包括:性能优异的malloc free内存分配器tcmalloc;基于tcmalloc的堆内存检测和内存泄漏分析工具heap-profiler,heap-checker;基于tcmalloc实现的程序CPU性能监测工具cpu-profiler。可以对CPU时间片、内存等系统资源的分配合使用进行分析。使用perf对一个程序分析一般分为下面几个步骤:

加入对google-perftools库的依赖

运行目标程序,并用某种方式启动/终止剖析函数并产生剖析结果

运行剖析结果转换工具,江不可读的结果转化成某种格式的文档(pdf,txt,image等)

原理:该工具主要利用了unix的一个环境变量LD_PRELOAD,它允许你要加载的动态库优先加载起来,相当于一个Hook,于是可以针对同一个函数可以选择不同的动态库里的实现了,比如googleperftools就是将malloc方法替换成了tcmalloc的实现,这样就可以跟踪内存分配路径了。可以理解为在分配内存的同时增加内存分配跟踪的功能。

下面简单说下针对JVM的分析过程:

在JVM参数中增加下面的配置:

export LD_PRELOAD=/usr/lib64/libtcmalloc.so

export HEAPPROFILE=/home/lg/temp

export HEAP_PROFILE_ALLOCATION_INTERVAL= 1073741824

LD_PRELOAD

perftools一切都是以tcmalloc为基础。这里指定tcmalloc的安装位置;

HEAPPROFILE

指定heap profile存放的位置

HEAP_PROFILE_ALLOCATION_INTERVAL

每当一定量的内存被新申请分配出来时,就会输出profile文件,这个变量值就是控制多少字节。默认值是102410241024byte【1G】。一般情况下会调小一些。

运行程序输出heap文件

在jvm中加入上面的参数后,启动程序。这时候日志中会显示类似下面的内容:

Dumping heap profile to /home/lg/temp/_10030.0001.heap (1755151 MB allocated cumulatively, 1267 MB currently in use)

显示累计的对外内存的分配和当前使用的对外内存的大小。同时配置的对应的目录中会产生.heap文件。接下来的工作就是分析这些文件。

通过命令行分析文件

命令:

pprof --text /usr/local/env/jdk1.8/bin/java _10030.0001.heap

输出结果:

Using local file /usr/local/env/jdk1.8/bin/java.

Using local file _10030.0001.heap.

Total: 0.1 MB

0.0 83.9% 83.9% 0.1 99.9% __FRAME_END__

0.0 6.1% 90.0% 0.0 6.1% read_alias_file

0.0 5.6% 95.6% 0.0 5.6% _nl_intern_locale_data

0.0 3.1% 98.6% 0.0 3.1% _nl_make_l10nflist

0.0 0.7% 99.3% 0.0 0.7% __gconv_lookup_cache

0.0 0.3% 99.6% 0.0 0.3% strdup

0.0 0.2% 99.8% 0.0 5.8% _nl_load_locale_from_archive

0.0 0.1% 99.9% 0.0 0.7% __wcsmbs_load_conv

0.0 0.1% 99.9% 0.0 0.1% std::basic_string::_Rep::_S_create

0.0 0.0% 100.0% 0.0 0.0% set_binding_values

0.0 0.0% 100.0% 0.0 0.0% new_composite_name

0.0 0.0% 100.0% 0.0 0.0% 00007f5e3a5f3de1

0.0 0.0% 100.0% 0.0 0.1% 00007f5e3a5f3dc0

0.0 0.0% 100.0% 0.0 0.1% 00007f5e3a602405

0.0 0.0% 100.0% 0.0 0.1% 0x00007ffc250bc6e0

0.0 0.0% 100.0% 0.0 0.1% 0x2f6c61636f6c2f71

0.0 0.0% 100.0% 0.0 9.2% __dcigettext

0.0 0.0% 100.0% 0.0 0.7% __gconv_find_transform

0.0 0.0% 100.0% 0.1 89.5% __libc_start_main

0.0 0.0% 100.0% 0.0 0.1% _init

0.0 0.0% 100.0% 0.0 0.1% _init (inline)

0.0 0.0% 100.0% 0.0 6.1% _nl_expand_alias

0.0 0.0% 100.0% 0.0 9.2% _nl_find_domain

0.0 0.0% 100.0% 0.0 5.8% _nl_find_locale

0.0 0.0% 100.0% 0.0 0.0% bindtextdomain

0.0 0.0% 100.0% 0.0 0.7% mblen

0.0 0.0% 100.0% 0.0 0.7% mbrtowc

0.0 0.0% 100.0% 0.0 6.1% setlocale

0.0 0.0% 100.0% 0.0 0.1% std::basic_string::basic_string

0.0 0.0% 100.0% 0.0 0.1% std::basic_string::copy

0.0 0.0% 100.0% 0.0 7.6% strerror

0.0 0.0% 100.0% 0.0 7.6% strerror_r

0.0 0.0% 100.0% 0.0 0.0% textdomain

以上不是实际问题的数据

结果代表的含义:

c1 Number of profiling samples in this function(函数分析样本数量)

c2 Percentage of profiling samples in this function(函数分析样本的百分比)

c3 Percentage of profiling samples in the functions printed so far(

到目前为止打印的函数中的分析样本的百分比)

c4 Number of profiling samples in this function and its callees(

此函数及其被调用者的性能分析样本数)

c5 Percentage of profiling samples in this function and its callees(此函数及其被调用者的性能分析样本的百分比)

c5 Function name

通过perftools可以定位可能引起问题的函数或者有嫌疑的内存地址。针对JVM进程可能需要进一步借用其他工具来分析。

下一篇再介绍JVM相关的工具。

linux查进程内存问题,关于linux下内存问题排查的工具相关推荐

  1. linux查进程ps和top,Linux中几个进程查看命令总结 ps, top, htop, vmstat

    ps命令可以以快照的方式,一次显示所有或部分系统进程. ps a :当前和中断相关进程[root@centos ~]# ps a PID TTY      STAT   TIME COMMAND 23 ...

  2. linux 用户进程结束后 malloc申请的内存会自动释放吗,进程退出后malloc的内存是否会被释放?

    当一个进程退出后,不管是正常退出或者是异常退出,操作系统都会释放这个进程的资源.包括这个进程分配的内存,打开的文件等等. 内存泄露的前提是进程一直在运行:进程一旦退出,所占的整个虚拟内存都被销毁,所有 ...

  3. linux的进程与线程通信方式,Linux的进程/线程间通信方式总结

    Linux系统中的进程间通信方式主要以下几种: 同一主机上的进程通信方式 * UNIX进程间通信方式: 包括管道(PIPE), 有名管道(FIFO), 和信号(Signal) * System V进程 ...

  4. 【Linux、进程隐藏】在Linux环境下添加系统调用实现进程隐藏

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 [进程隐藏]在Linux环境下添加系统调用实现进程隐藏 前言 一.环境设置: 二.实现方法步骤: 1.思路图 2.利用strace命令 ...

  5. linux查进程是否挂掉,如何检查进程是否正在运行 - Linux

    我正在使用shell脚本调用二进制文件.二进制文件基本上建立一个套接字客户端服务器.这个二进制文件最初工作正常,但是在60mint之后它正在停止.我需要检查它是否没有运行,然后再次启动它.这里是我的代 ...

  6. linux查看进程运行日志文件,【Linux】常用指令、ps查看进程、kill杀进程、启动停止tomcat命令、查看日志、查看端口、find查找文件...

    1.说出 10 个 linux 常用的指令 1) ls 查看目录中的文件 2)cd /home 进入 '/ home' 目录:cd .. 返回上一级目录:cd ../.. 返回上两级目录 3)mkdi ...

  7. Linux创建进程必须fork么,Linux - fork() 创建进程

    Linux - fork() 创建进程 Linux - fork() 创建进程 介绍创建进程之前,先简单地介绍一下 Linux 下的进程内存布局. Stack - 所有函数的 local variab ...

  8. linux大多数进程都是sleep,Linux电源管理(5)_Hibernate和Sleep功能介绍

    Linux电源管理(5)_Hibernate和Sleep功能介绍 作者:wowo 发布于:2014-6-10 16:11 分类:电源管理子系统 1. 前言 Hibernate和Sleep两个功能是Li ...

  9. 在linux中进程表示的是,Linux进程的表示

    2.linux进程相关的数据结构 首先来看内核描述进程所用的数据结构.在Linux内核0.11版本中,进程数据结构的定义在sched.h文件中,定义如下 struct task_struct { /* ...

最新文章

  1. python命令行参数解析OptionParser类用法实例
  2. 盛会再临,2018中国大数据技术大会(BDTC)首曝日程及议题
  3. 创新实训个人记录:metric k-center
  4. 服务器内存技术知识充电
  5. 吃鸡服务器不接受响应,绝地求生:蓝洞优化服务器性能,从此告别掉帧延迟!...
  6. 区块链上智能合约的讲解
  7. 剑指Offer——求1+2..+n的和
  8. idea 模块jdk依赖总是自动变_解决IDEA中导入新的maven依赖后Language Level自动重置问题...
  9. sql 计算单行数据字段空值比例_如何利用工具,迅猛定位低效SQL? | 1分钟系列...
  10. Codeforces Round #753 (Div. 3)E. Robot on the Board 1
  11. 数学建模之主成分分析
  12. NXP推出Icode DNA芯片,助力产品防伪鉴定
  13. 推荐系统 | (4) 可解释推荐系统---知其然,知其所以然
  14. ExcelVBA收纳箱:以A1单元格内容统一插入批注
  15. 计算机屏幕颜色变黄色,win10系统电脑屏幕颜色偏黄如何调节
  16. php高洛峰_PHP 验证码   高洛峰 细说PHP
  17. 作业之安装Python
  18. 新浪产品管培生的结构化面试
  19. ios 按钮文字下划线_iOS 文字下划线
  20. Jscript函数的使用

热门文章

  1. QGIS中坐标偏移处理
  2. PyTorch之Sequential
  3. Gobblin编译支持CDH5.4.0
  4. 【原创】记一次HttpWebRequest中国移动查账单爬虫的攻克历程
  5. 又是一年末来临,年终奖金的算法
  6. javascript入门系列演示·三种弹出对话框的用法实例
  7. 成功与不成功并非智商差别:男人,如何唤醒心灵的巨人
  8. 时序数据库influxdb+grafana
  9. asp.net web submit链接页面_41. Web 安全之 target=quot;_blankquot; 触发钓鱼风险
  10. c语言下列循环的循环次数,在C语言中,若i=3,则语句 while (i) { i--; break;}的循环次数为 答案:1...