通过JDK常用工具监控Java进程的内存占用情况
Tomcat是一款常用的Web容器, 它是运行在 JVM(Java Virtual Machine) 中的一个Java进程.
本文以Tomcat为例, 借助一些JDK的工具对Tomcat在运行过程中的内存占用情况进行监控, 为优化提供数据支撑.
1 JDK 工具的使用
JDK自带的工具位于
${JAVA_HOME}/bin/目录下.
JConsole 可以简单明了地查看到内存的使用情况, 线程的状态, 当前加载的类的总量等.
JVisualVM 可以下载插件(如GC等), 进而查看更丰富的信息. 如果是分析本地的Tomcat的话, 还可以进行内存抽样等, 检查每个类的使用情况.
(1) jps 查看本地运行着的 Java 进程, 及其进程号、进程启动的路径等信息;

(2) jmap 查看垃圾收集策略即 JVM 内存占用情况:
jmap -heap pid# 查看垃圾收集策略, 以及堆内存的分配与使用情况.
jmap -clstats pid# 查看类加载器的统计数据 —— 此命令调用了sun.jvm.hotspot.runtime.VM.initialize()方法, 会导致该 pid 对应的 JVM 进程阻塞.
jmap -histo [pid]# 按照内存使用大小倒序列出内存中的实例类型.
(3) jstack 查看线程栈:
jstack pid # 列出该 pid 对应 JVM 的所有线程栈描述, 主要包括每个线程的状态以及堆栈内各栈帧的方法全限定名、代码位置. 注意: 这些信息的显示只是为了便于开发人员阅读, 并不是栈中存的就是这些信息.
(4) jstat 实时查看堆内存的使用情况:
# 使用方法:
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
# 查看可使用的选项:
jstat –options
-class # 类加载情况的统计
-compiler # HotSpot中即时编译器编译情况的统计
-gc
-gccapacity # 新生代、老年代以及永久代的存储容量情况
-gccause
-gcmetacapacity # 元数据区的容量
-gcnew # 新生代垃圾回收信息
-gcnewcapacity # 新生代的存储容量
-gcold # 老年代垃圾回收信息
-gcoldcapacity # 老年代的存储容量
-gcutil # 实时查看GC信息
-printcompilation # HotSpot编译方法的统计
使用示例: 间隔5s, 每隔10条输出一次头信息, 打印进程号为3308的JVM进程的堆内存使用情况, 以及各代垃圾回收的次数及时间:
jstat -gcutil -h10 77545 5000显示信息如下:

参数说明:
S0: Heap上的Survivor Space 0区已使用空间的百分比
S1: Heap上的Survivor Space 1区已使用空间的百分比
E: Heap上的Eden Space区已使用空间的百分比
O: Heap上的Old Space区已使用空间的百分比
M: Meta Space(元数据区)已使用空间的百分比
YGC: 从应用程序启动到采样时发生Young GC的次数
YGCT: 从应用程序启动到采样时Young GC所用的时间(单位: 秒)
FGC: 从应用程序启动到采样时发生Full GC的次数
FGCT: 从应用程序启动到采样时Full GC所用的时间(单位: 秒)
GCT: 从应用程序启动到采样时用于垃圾回收的总时间(单位: 秒)
2 查看 GC 日志信息
可以通过配置JVM的启动参数, 打印类的加载情况及对象的回收信息, 可以打印到屏幕或指定文件中, 默认也会打印到catalina.log中. Tomcat容器的JVM启动参数配置文件是: ${TOMCAT_HOME}/bin/catalina.sh, 具体参数如下:
-verbose:gc
# 在输出设备显示垃圾收集信息(JVM发生内存回收时输出相关信息)
-XX:+PrintGC
# 输出GC日志, 形式: Full GC 118250K->113543K(130112K), 0.0094143 secs
-XX:+PrintGCDetails
# 输出GC详细日志, 形式: GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs[Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]
-XX:+PrintGCTimeStamps
# 输出GC的时间戳, 以基准时间的形式输出: 11.851: [GC 98328K->93620K(130112K), 0.0082960 secs], 11.851是JVM启动后的秒数.
-XX:+PrintGCDateStamps
# 输出GC的时间戳, 以日期的形式输出: 2018-08-28T21:53:59.234+0800
-XX:+PrintGCApplicationStoppedTime
# 打印垃圾回收期间程序暂停的时间, 即GC消耗的时间. 可与上面混合使用.
# 输出形式: Total time for which application threads were stopped: 0.0468229 seconds
-XX:+PrintGCApplicationConcurrentTime
# 打印每次垃圾回收前, 程序未中断的执行时间, 即相邻2次GC的间隔.
# 可以和上面的配置混合使用. 输出形式: Application time: 0.5291524 seconds
-XX:+PrintTenuringDistribution
# 观察各个Age的对象总大小
-XX:PrintHeapAtGC
# 打印GC前后的详细堆栈信息
-XX:+HeapDumpOnOutOfMemoryError
# 发生OOM时自动dump堆栈信息, 以便后续分析
-Xloggc:../logs/gc.log
# 与上面选项配合使用, 将日志信息输出到指定的文件以便后续分析
3 添加 JMS 远程监控
对部署在局域网内其他服务器上的Tomcat, 可以打开JMX监控端口, 就可以在另外的服务器上通过该端口查看常用的参数(一些比较复杂的功能不支持).
配置方法: 同样是在JVM启动参数中配置, 配置如下:
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=172.16.11.62 # 设置JVM的JMS监听的IP地址, 防止错误监听为本机127.0.0.1地址
-Dcom.sun.management.jmxremote.port=1090 # 设置JVM的JMS监控的端口
-Dcom.sun.management.jmxremote.ssl=false # 设置JVM的JMS监控不实用SSL
-Dcom.sun.management.jmxremote.authenticate=false # 设置JVM的JMS监控不需要认证
参考资料
版权声明
作者: 马瘦风
出处: 博客园 马瘦风的博客
您的支持是对博主的极大鼓励, 感谢您的阅读.
本文版权归博主所有, 欢迎转载, 但请保留此段声明, 并在文章页面明显位置给出原文链接, 否则博主保留追究相关人员法律责任的权利.
通过JDK常用工具监控Java进程的内存占用情况的更多相关文章
- [2017-08-09]一则使用WinDbg工具调试iis进程调查内存占用过高的案例
最近遇到一个奇葩内存问题,跟了三四天,把Windbg玩熟了,所以打算分享下. 症状简介 我们团队的DEV开发环境只有一台4核16G的win2012r2. 这台服务器上装了SqlServer.TFS(项 ...
- 【转】一则使用WinDbg工具调试iis进程调查内存占用过高的案例
最近遇到一个奇葩内存问题,跟了三四天,把Windbg玩熟了,所以打算分享下. 症状简介 我们团队的DEV开发环境只有一台4核16G的win2012r2.这台服务器上装了SqlServer.TFS(项目 ...
- linux 查看Java 进程的内存使用情况
top -b -n 1 | grep java| awk '{print "PID:"$1",mem:"$6",CPU percent:"$ ...
- JDK常用工具
JDK的命令行工具 jps 查看正在使用的jvm机器进程号. 常用命令,-l显示正在运行的jar包或者软件(基于jvm),-v显示当前进程详细的jvm参数 jps -l jps -v javap 反汇 ...
- 利用VisualVm和JMX远程监控Java进程
自Java 6开始,Java程序启动时都会在JVM内部启动一个JMX agent,JMX agent会启动一个MBean server组件,把MBeans(Java平台标准的MBean + 你自己创建 ...
- Zabbix 通过 JMX 监控 java 进程
参考: [ JMX monitoring ] [ Zabbix Java gateway ] [ JMX Monitoring (Java Gateway) not Working ] [ Monit ...
- linux Java项目CPU内存占用高故障排查
linux Java项目CPU内存占用高故障排查 top -Hp 进程号 显示进程中每个线程信息,配合jstack定位java线程运行情况 # 线程详情 jstack 线程PID # 查看堆内存中的对 ...
- linux下对进程按照内存使用情况进行排序
linux下对进程按照内存使用情况进行排序的命令为:ps aux --sort -rss 详细解说参见 http://alvinalexander.com/linux/unix-linux-proce ...
- MFC下获取系统内存和当前进程的内存使用情况
GlobalMemoryStatusEx来获取系统的内存使用情况 GetProcessMemoryInfo获取某个进程的内存使用情况.和任务管理器看到的是一样的. 具体代码如下: void GetSy ...
随机推荐
- Coursera-AndrewNg(吴恩达)机器学习笔记——第二周编程作业
一.准备工作 从网站上将编程作业要求下载解压后,在Octave中使用cd命令将搜索目录移动到编程作业所在目录,然后使用ls命令检查是否移动正确.如: 提交作业:提交时候需要使用自己的登录邮箱和提交令牌 ...
- PHP session有效期session.gc_maxlifetime详解
一个已知管用的方法是,使用session_set_save_handler,接管所有的session管理工作,一般是把session信息存储到数据库,这样可以通过SQL语句来删除所有过期的sessio ...
- python笔记:#011#循环
循环 目标 程序的三大流程 while 循环基本使用 break 和 continue while 循环嵌套 01. 程序的三大流程 在程序开发中,一共有三种流程方式: 顺序 -- 从上向下,顺序执行 ...
- 在win10下给vs2013配置opencv3.0
opencv这玩意是真难搞呀. 先吐槽下..... 下面进入正文. 1准备工具: opencv3.0+vs2013 这里面不提供链接下载,自行谷歌百度. 2配置环境: a.打开下载好的opencv(解 ...
- python 正则表达式Re
Python正则表达式指南这篇文章很好,推荐阅读. 本文则是简单记录下我自己学习Re的笔记, 环境是python3.5. 1.简单的Re语法 ^ 匹配字符串开始位置. $ 匹配字符串结束位置. \b ...
- 阿里Java架构师谈谈架构和如何成为一个Java架构师
架构的定义 我们来看看软件架构的一般定义: 程序和计算系统软件体系结构是指系统的一个或多个结构. 该结构包括软件的构建,构建的外部可见属性以及它们之间的相互关系. 该体系结构不是可操作的软件. 具体来 ...
- PAT1134:Vertex Cover
1134. Vertex Cover (25) 时间限制 600 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A vertex ...
- 在Linux上使用PGP签名验证文件完整性
文件在下载及存储过程中可能由于传输错误.硬件故障.文件系统错误等网络.硬件和软件方面的原因导致文件损坏,也可能在传输过程中受到攻击(如"中间人攻击")导致下载的文件被篡改或者下载到 ...
- 思维导图软件比较-FREEMIND,XMIND,Mindjet Mindmanager
https://www.zhihu.com/question/22094277
- iOS推送:Java服务器端发送表情(绘文字)
http://blog.csdn.net/musou_ldns/article/details/8692520 功能的时候,客户要求能够给iphone发送表情图标,也就是绘文字. 手机环境:iOS5. ...