`

java-jvm-jmap(高内存排查)

阅读更多
功能:打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)

-dump:[live,]format=b,file=<filename> 使用hprof二进制形式,输出jvm的heap内容到文件=. live子选项是可选的,假如指定live选项,那么只输出活的对象到文件.

-finalizerinfo 打印正等候回收的对象的信息.

-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况.

-histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量.

-permstat 打印classload和jvm heap长久层的信息. 包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来.


1、-heap
打印当前heap的概要信息:heap的总量,年轻代,老年代,Perm Generation的量
GC使用的算法
heap的配置:总量
当前heap的使用情况:占用量,总量,百分比
.
sudo jmap -heap 27409

输出:
Attaching to process ID 27409, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.45-b08

using thread-local object allocation.
Parallel GC with 4 thread(s)

Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 2147483648 (2048.0MB)
   NewSize          = 268435456 (256.0MB)
   MaxNewSize       = 17592186044415 MB
   OldSize          = 5439488 (5.1875MB)
   NewRatio         = 2
   SurvivorRatio    = 8
   PermSize         = 268435456 (256.0MB)
   MaxPermSize      = 268435456 (256.0MB)
   G1HeapRegionSize = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 704643072 (672.0MB)
   used     = 429546320 (409.6472930908203MB)
   free     = 275096752 (262.3527069091797MB)
   60.959418614705406% used
From Space:
   capacity = 5767168 (5.5MB)
   used     = 4327344 (4.1268768310546875MB)
   free     = 1439824 (1.3731231689453125MB)
   75.03412420099431% used
To Space:
   capacity = 5767168 (5.5MB)
   used     = 0 (0.0MB)
   free     = 5767168 (5.5MB)
   0.0% used
PS Old Generation
   capacity = 1431830528 (1365.5MB)
   used     = 574251648 (547.6490478515625MB)
   free     = 857578880 (817.8509521484375MB)
   40.106118480524536% used
PS Perm Generation
   capacity = 268435456 (256.0MB)
   used     = 72128064 (68.78668212890625MB)
   free     = 196307392 (187.21331787109375MB)
   26.869797706604004% used

31742 interned Strings occupying 3432376 bytes.


2、-histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量.
sudo jmap -histo 27409>a.log

输出:
Object Histogram:

num       #instances    #bytes  Class description
--------------------------------------------------------------------------
1:              164294  173445488       byte[]
2:              4426453 106234872       java.util.concurrent.ConcurrentSkipListMap$Node
3:              448524  74384360        char[]
4:              2215688 53176512        java.lang.Double
5:              96356   33816408        int[]
6:              965084  23162016        java.util.concurrent.ConcurrentSkipListMap$Index
7:              125211  18655880        * ConstMethodKlass
8:              733892  17613408        java.lang.Long
9:              125211  16039712        * MethodKlass
10:             444730  14231360        java.util.HashMap$Entry
11:             11617   13094656        * ConstantPoolKlass
12:             426560  10237440        java.lang.String
13:             11611   8346592 * InstanceKlassKlass
14:             115808  7411712 com.mysql.jdbc.ConnectionPropertiesImpl$BooleanConnectionProperty
15:             9526    7374880 * ConstantPoolCacheKlass
。。。。

另外继续分析日志,每个对象存在的数量以及占用内存的大小:
grep "qunar" data.txt |grep "afare"

输出:
17:             28137   4051728 com.gym.afare.dubbo.model.AfareBlackList
664:            30      1680    com.gym.afare.dubbo.model.AfareBlackListPlus
977:            10      720     com.gym.flight.afare.model.RefreshCmRequest
1055:           12      576     com.gym.flight.afare.model.ErrorEnum
1099:           6       528     com.gym.afare.dubbo.model.request.AfareResultRequest
1146:           12      480     com.gym.flight.afare.model.RefreshTask
1151:           10      480     com.gym.flight.afare.model.RefreshPriceRequest
1206:           13      416     com.gym.flight.afare.model.ApiResponse
1480:           4       224     com.gym.afare.dubbo.model.AfareBlackList$FlightType[]
1544:           5       200     com.gym.afare.dubbo.model.AfareBlackList$UnLockTypeEnum
1574:           3       192     com.gym.afare.dubbo.model.AfareBlackList$UnLockTypeEnum[]
1596:           4       192     com.gym.afare.dubbo.model.AfareBlackList$FlightType
1666:           3       168     com.gym.afare.dubbo.model.AfareBlackList$LockTypeEnum[]
1841:           4       160     com.gym.afare.dubbo.model.AfareBlackList$LockTypeEnum
2015:           3       120     com.gym.afare.dubbo.model.AfareBlackList$LockStatusEnum[]
2022:           1       120     com.gym.flight.afare.model.ErrorEnum[]
2305:           2       80      com.gym.afare.dubbo.model.AfareBlackList$LockStatusEnum
2669:           1       56      com.gym.flight.afare.task.DeleteUnlockBlackListTask
2713:           1       48      com.gym.flight.afare.dubbo.provider.AfareBlackListServiceImpl
2952:           1       40      com.gym.flight.afare.dao.impl.AfareBlackListDAOImpl
2961:           1       40      com.gym.flight.afare.service.impl.RefreshPriceServiceImpl
3012:           1       40      com.gym.flight.afare.service.impl.RefreshPriceServiceImpl$RefreshThreadFactory
3036:           1       40      com.gym.flight.afare.dao.impl.AfareBlackListPlusDAOImpl
3182:           1       32      com.gym.flight.afare.dubbo.provider.AfareResultQueryServiceImpl
3197:           1       32      com.gym.flight.afare.dao.CacheManager
3282:           1       32      com.gym.flight.afare.dao.impl.AfareResultDaoImpl
3289:           1       32      com.gym.flight.afare.dubbo.provider.AfareResultUpdateServiceImpl
3292:           1       32      com.gym.flight.afare.service.Qc
3297:           1       32      com.gym.flight.afare.web.RefreshPriceController
3476:           1       24      com.gym.flight.afare.model.TaskListener
3479:           1       24      com.gym.flight.afare.task.ReloadBlacklistCacheTask
3543:           1       24      com.gym.flight.afare.task.ArchiveAfareResultTask
3676:           1       24      com.gym.flight.afare.dao.CacheManager$1
3720:           1       24      com.gym.flight.afare.web.BackController
4058:           1       16      com.gym.flight.afare.web.interceptor.TraceInterceptor
4119:           1       16      com.gym.flight.afare.util.SpringUtil

从中不难看出,SpringUtil 等类都是单例的,所以只有一个对象,而AfareBlackList 是系统内的对象,数量存在较多

3、-dump:[live,]format=b,file=<filename> 使用hprof二进制形式,输出jvm的heap内容到文件=. live子选项是可选的,假如指定live选项,那么只输出活的对象到文件.
sudo jmap -F -dump:live,format=b,file=heap.bin 27409


输出到heap.bin文件里
eg
class C{
	byte b = 100;
}

class B {
	List<C[]> d = new ArrayList<C[]>();

	public B() {
		for (int i = 0; i < 100000; i++) {
			d.add(new C[i]);
		}
	}

}

class A {
	List<B> bList = new ArrayList<B>();

	public A() {
		for (int i = 0; i < 1000; i++) {
			bList.add(new B());
		}
	}
}

public class Test {
	public static void main(String[] args) throws Exception {
		A a = new A();
		new Thread() {}.start();

		a.toString();
		
	}
}



运行参数:
-server -Xms1024m -Xmx1024m -Xmn512m -XX:+UseParallelOldGC -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCDateStamps -XX:+PrintGCDetails  -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=c:/heap.bin








其他:
-permstat 打印classload和jvm heap长久层的信息. 包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来.
-dump:[live,]format=b,file=<filename> 使用hprof二进制形式,输出jvm的heap内容到文件=. live子选项是可选的,假如指定live选项,那么只输出活的对象到文件. 

参考资料:
http://www.tuicool.com/articles/VzYziu
  • 大小: 129.5 KB
  • 大小: 1.1 MB
0
1
分享到:
评论

相关推荐

    Java虚拟机-jvm故障诊断与性能优化-源码

    在《实战Java虚拟机——JVM故障诊断与性能优化》一书中,作者深入探讨了如何对JVM进行故障排查和性能调优,通过源码分析来帮助读者理解其内部工作原理。下面我们将根据书中的主题,详细阐述相关的知识点。 1. **JVM...

    练习JVM调优-jvm_demo.zip

    在Java开发领域,JVM(Java Virtual Machine)是至关重要的组成部分,它负责解析并执行Java程序。JVM调优是一项核心技能,可以帮助我们优化应用程序的性能,减少内存消耗,提高响应速度,以及避免可能出现的垃圾收集...

    1. JVM 内存结构的组成、各部分功能作用,学会利用内存诊断工具排查内存相关问题;2. JVM 的招牌-jvm.zip

    了解JVM内存结构及其功能对于优化Java应用程序的性能和排查内存问题至关重要。 首先,我们来详细探讨JVM的内存结构。在Java中,内存主要分为以下几个区域: 1. **程序计数器(Program Counter Register)**:每个...

    jvm问题排查

    在日常的软件开发与维护过程中,针对JVM(Java虚拟机)的性能调优和问题排查是非常关键的一环。本手册旨在提供一套全面且实用的JVM问题排查方法和技术,帮助开发者快速定位并解决JVM相关的性能瓶颈或异常情况。 ###...

    整理-JVM相关面试题2024

    - **定义**:JVM(Java Virtual Machine)即Java虚拟机,是一种抽象的计算机,它提供了一个运行环境,使Java代码可以在任何安装了JVM的操作系统上运行,而无需重新编译。 - **作用**:通过字节码执行机制,实现了...

    带你全面理解JVM,掌握常规JVM调优-JVM.zip

    Java源代码被编译成字节码后,JVM将其加载到内存中,经过验证确保代码安全,解析方法表,初始化类变量,最后通过解释器或即时编译器(JIT)转化为机器码执行。 二、JVM内存模型 1. 堆内存:所有对象都在堆中创建,...

    jvm调优-jvm.zip

    Java虚拟机(JVM)是Java程序运行的基础,它负责解释和执行字节码,管理内存,以及优化代码性能。JVM调优是一项关键技能,它涉及到调整JVM的配置参数,以达到最佳的程序运行效率,防止内存泄漏,以及确保应用程序的...

    jvm信息jmap使用的基本方法教程

    jmap是JDK自带的一个命令行工具,用于收集和分析JVM内存信息,主要包括堆内存、类加载器统计和对象 finalize 队列等。本文将详细介绍jmap的使用方法。 ### 前言 在Java性能调优过程中,开发者通常会使用各种开源...

    jvm原理机器调优-jvm.zip

    JVM原理和调优是每个Java开发人员必须掌握的关键技能,这涉及到内存管理、垃圾收集、性能优化等多个方面。在深入理解JVM的工作机制后,我们可以更好地调整和优化应用程序,提升系统的性能和稳定性。 一、JVM结构与...

    java内存泄露、溢出检查方法和工具

    长期的内存泄露会导致Java虚拟机(JVM)的堆内存耗尽,引发OutOfMemoryError。 检查Java内存泄露的方法主要包括以下几个步骤: 1. **生成堆转储文件**:在Linux环境中,可以使用JVM提供的`jmap`命令生成堆转储文件...

    jvm瓶颈定位 java jvm 学习

    Java虚拟机(JVM)是Java开发中的核心组成部分,它负责执行字节码,管理内存,以及优化程序性能。在Java应用的运行过程中,如果出现性能问题,JVM瓶颈定位就显得至关重要。本文将深入探讨如何理解和解决Java JVM的...

    java-虚拟机 操作系统监控工具-源码

    支持Java虚拟机监控:GC信息、内存使用情况、内存池信息、类加载器、线程堆栈 支持生成火焰图(采样事件包括CPU、内存分配、线程栈、Java方法调用栈等) 支持Java代码反编译生成 支持Java代码热更新(可指定...

    jvm日志解读

    《JVM日志解读——揭示Java虚拟机的秘密》 在Java开发中,JVM(Java Virtual Machine)扮演着至关重要的角色。它负责运行我们的代码,管理内存,执行垃圾收集等。当程序出现异常或者性能问题时,JVM生成的日志文件...

    JVM 基础 JAVA 并发 JVM 性能调优 LeetCode 算法 .......

    "JVM 基础知识点" JVM(Java Virtual Machine)是 Java 语言的运行环境,负责执行 Java 字节码。...排查 JVM 问题可以使用 jmap 查看 JVM 中各个区域的使用情况,可以使用 jstack 查看 JVM 中的线程信息。

    【JAVA WEB实用技巧与优化方案】如何排查JVM线程和内存相关问题

    在Java Web开发中,性能优化和问题排查是关键任务,特别是涉及到JVM(Java虚拟机)的线程和内存管理。本文将详细讲解如何利用`javacore`和`heapdump`分析工具来解决相关问题。 `javacore`文件是JVM在特定时刻生成的...

    Java虚拟机调优及问题排查手册.docx

    本手册主要介绍Java虚拟机(JVM)的调优和问题排查解决方案。该手册涵盖了JVM排查、数据库连接排查、堆栈快照排查等多方面的内容。 JVM排查 JVM排查是指通过各种命令和工具来排查JVM的状态和性能问题。常用的命令...

    java-1.8.0_121.tar.gz

    6. **jcmd**: jcmd是Java诊断命令工具,提供了大量用于性能分析和故障排查的命令,如GC日志、线程堆栈转储、JVM配置信息查看等。它是Java 7及更高版本引入的,大大增强了开发者对JVM的控制和调试能力。 7. **安全性...

    java IBM websphere 内存溢出 javacore deapdump CPU内存分析工具

    总结来说,面对Java IBM WebSphere的内存溢出问题,我们需要结合`javacore`和`deapdump`等诊断工具,通过分析脚本和相关库文件,理解内存管理原理,调整JVM配置,并优化代码,才能有效地排查和解决问题。

    ha456.jar(IBMHeapAnalyzer)JVM内存分析工具

    【ha456.jar(IBMHeapAnalyzer)JVM内存分析工具】是一款由IBM开发的专业工具,主要用于诊断Java虚拟机(JVM)的内存问题。它能够解析和分析JVM生成的内存转储文件(通常称为heap dump或hprof文件),帮助开发者识别...

Global site tag (gtag.js) - Google Analytics