当JVM响应变慢或者停滞的时候,我们往往需要对GC和其内存情况是进行分析,下面列举一些常用的分析方法和工具:

获得GC信息的方法

-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps

-XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStopped

-XX:+ PrintGCApplicationConcurrentTime,打印在collection之间,程序运行的时间

-XX:+ PrintGCApplicationStopped,打印的是collection pause的时间

下面是这两个参数的输出样例:

Application time: 1.3874623 seconds

[GC [DefNew: 8064K->63K(8128K), 0.0509215 secs] 11106K->5994K(32704K), 0.0510972 secs]

Total time for which application threads were stopped: 0.0517092 seconds

Application time: 1.5225065 seconds

[GC [DefNew: 8127K->63K(8128K), 0.0432982 secs] 14058K->8273K(32704K), 0.0434172 secs]

Total time for which application threads were stopped: 0.0440447 seconds

Application time: 1.4263524 seconds

[GC [DefNew: 8127K->64K(8128K), 0.0363538 secs] 16337K->10381K(32704K), 0.0364811 secs]

Total time for which application threads were stopped: 0.0369103 seconds

从上面可以看出程序在minor collection之间跑了1.38到1.52秒,minor collection pause在.036到.051。所以minor collection的开销大致在2.6%到3.6%.

jstat

jstat的-option参数有很多种,输出的内容各不相同,详情参考官方文档

dump内存的方法

被动dump

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/dump.hprof

在OutOfMemory时,输出一个dump文件,记录当时的内存快照,并把文件输出到/tmp/dump.hprof文件

主动dump

利用jmap把内存dump下来,比如jmap -dump:live,format=b,file=dump.hprof

内存dump分析工具

jhat

Java内置工具(教程),dump文件少于1G的时候可以用这个,它会起一个web服务,用于查看dump信息。

需要有一台内存大于dump文件大小2倍的机器

HeapAnalyzer

直接分析dump并展示的客户端(下载)

需要有一台内存大于dump文件大小2倍的机器,还需要能显示出来的(桌面操作系)

mat

展示dump的客户端(神器)(下载)(教程)

mat分为展示和分析模块,可以用一个ParseHeapDump.sh先对dump文件分析并产生一堆索引文件(用服务器搞),然后再用mat的桌面应用打开这些文件,4G内存的机器分析8G的dump完全没压力。

如果你下的mat没有ParseHeapDump.sh,可以自己添加一个:

#!/bin/sh

#

# This script parses a heap dump.

# Adjust the path to java, version 5 or later, and the heap size as required.

# Suitable for 64-bit and 32-bit Java, but a 64-bit Java is required

# for larger heap sizes.

#

# Usage: ParseHeapDump.sh [report]*

#

# The leak report has the id org.eclipse.mat.api:suspects

# The top component report has the id org.eclipse.mat.api:top_components

#

java -Xmx8192M -jar "`dirname "$0"`"/plugins/org.eclipse.equinox.launcher_1*.jar -consoleLog -application org.eclipse.mat.api.parse "$@"

相关资料

java jstat gc_分析JVM GC及内存情况的方法相关推荐

  1. java死锁怎么用jvm调试_jvm 内存dump、gc查看、线程死锁,jmap、jstack、jstat

    1. jstat 这个命令对于查看Jvm的堆栈信息很有用.能够查看eden,survivor,old,perm等heap的capacity,utility信息 对于查看系统是不是有能存泄漏以及参数设置 ...

  2. JVM 内存管理、自带性能监测调优工具 (jstack、jstat)及 JVM GC 调优

    0. 内存查看 获取可用内存大小: public static long getAvaliableMemory() {Runtime runtime = Runtime.getRuntime();re ...

  3. 尝试用HSDB分析JVM运行时内存理解Java多态实现机制

    测试代码 // 接口 package ziya; public interface TestParent {void show(); }package ziya; public class Paren ...

  4. java jstat结果分析_JVM调优总结 + jstat 分析

    jstat -gccause pid 1 每格1毫秒输出结果jstat -gccause pid 2000 每格2秒输出结果 不断的在屏幕打印出结果 S0     S1     E      O    ...

  5. java 强制gc_如何强制GC回收垃圾

    Java垃圾回收机制(GC)详解 简介: 垃圾回收GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内 ...

  6. Java工程师必备:JVM原理、内存模型、调优、垃圾回收机制、面试题

    在如今这个时间和知识都是碎片化的时代,C站根据C1-C4认证的成长路径,进行知识细化整理,形成系统化的知识图谱. 通过调研一线互联网大厂的招聘JD,小编对标C站能力认证要求,为大家整理了系列技术干货合 ...

  7. java强制fullgc_触发Full GC执行的情况 以及其它补充信息

    除直接调用System.gc外,触发Full GC执行的情况有如下四种. 1. 旧生代空间不足 旧生代空间只有在新生代对象转入及创建为大对象.大数组时才会出现不足的现象,当执行Full GC后空间仍然 ...

  8. Java技术专题之JVM你的内存泄露了吗?

    一.从一个例子开始 关于JVM的内存泄露,让我们从下面一个例子开始吧,大家来判断一下如果按照下面这种分配方式,会不会出现内存泄露呢? 1 import java.util.List; 2 import ...

  9. idea启动java服务报错OutOfMemoryError: GC overhead limit exceeded解决方法

    在用idea开发java项目时,启动报内存溢出错误,致服务启动失败: Error:java: java.lang.OutOfMemoryError: GC overhead limit exceede ...

最新文章

  1. 蓝凌ekp开发_蓝凌EKP8.0产品白皮书(简).doc
  2. RabbitMQ入门之安装配置与简单实例
  3. MVC (ModelBinder等)技巧
  4. python flask 设置个性化的响应体 响应头 状态码
  5. 深入理解 C 指针阅读笔记 -- 第一章
  6. java技术专家学习路线图_向Java最佳专家的全球专家学习Java
  7. 计算机常用存储芯片分为内存和什么,计算机类论文范例,与安徽省计算机一级考试宝典相关研究生毕业论文开题报告范文...
  8. MongoCola使用教程 1 - MongoDB的基本操作和聚合功能
  9. 软件需求和结构_软件工程复习 3640组考题
  10. Day3-Spring的事务管理、Spring框架的JDBC模板
  11. mysql lru scan depth_如何解决mysql警告:“ InnoDB:page_cleaner:1000毫秒的预期循环用了XXX毫秒。设置可能不是最佳的”?...
  12. 苹果电脑Mac上怎样实现图像文件格式转换?
  13. mysql中的编号怎么自动加_MySQL中实现ID编号自动增加的方法
  14. 注册测绘师学习笔记(二)
  15. 二、JAVA第一行代码
  16. HTML导航条和翻页栏
  17. ZigBee模块(DL-20)在调试过程中的问题及解决方案
  18. IIC上拉电阻的注意事项
  19. 基于程序员职业对于婚配问题的研究——程序员为何单身?
  20. python os.getcwd用法_os.getcwd()

热门文章

  1. python当中的生成器
  2. htmlbuilder php phantomjs
  3. win8.1远程连接Redis数据库
  4. 15、sql语句集,Linux 下PHP查询mysql
  5. bash 的进站欢迎提示
  6. cadence遇到的问题(持续更新)
  7. 修改大型 XML 文件的有效方法
  8. 无埋点实现监测的真相——革新还是噱头?
  9. 在centos安装redis
  10. ECMAScript 6的解构赋值 ( destructuring assignment)