`

JVM内存泄露监控

    博客分类:
  • jdk
阅读更多
JVM内存异常例子
java.lang.OutOfMemoryError: PermGen space

permanent space持久空间: 用于类和方法对象的存储。spring在AOP时使用CBLIB会动态产生很多类,JSP页面, Java反射类,当类太多,超过MaxPermSize的时候,就会抛出此异常。
参数问题可以设置jvm启动参数: PermSize, MaxPermSize。
如果是程序问题就要进行内存分析。

网上对Perm讨论的比较火热,有相当多的人认为这是JDK的一个至今未解决的BUG,因为Perm里存储的东西永远不会被JVM垃圾回收的,这个问题已经提出多年,但未得到SUN的解决。

java.lang.OutOfMemoryError: Java heap space

eden space使用率100%,总是被占满,参数问题可以设置jvm启动参数: Xms, Xmx。
如果是程序问题就要进行内存分析。

jdk里包括一个查看JVM状态的工具

jstat -gcutil pid号 1000 20

这里涉及到PID 关于pid 的查看 请查看我的 另外一篇 文章
http://ldbjakyo.iteye.com/admin/blogs/759533

 
   S0     S1       E         O         P        YGC    YGCT    FGC    FGCT      GCT
  0.00   0.00   0.24  55.39  99.60    171    0.667  1339  393.364  394.031
  0.00   0.00   0.24  55.39  99.60    171    0.667  1339  393.364  394.031
  0.00   0.00   0.24  55.39  99.60    171    0.667  1339  393.364  394.031
  0.00   0.00   0.24  55.39  99.60    171    0.667  1339  393.364  394.031
  0.00   0.00   0.24  55.39  99.60    171    0.667  1339  393.364  394.031
  0.00   0.00   0.24  55.39  99.60    171    0.667  1339  393.364  394.031
参数含义:
S0:Heap上的 Survivor space 0 段已使用空间的百分比
S1:Heap上的 Survivor space 1 段已使用空间的百分比
E: Heap上的 Eden space 段已使用空间的百分比
O: Heap上的 Old space 段已使用空间的百分比
P: Perm space 已使用空间的百分比
YGC:从程序启动到采样时发生Young GC的次数
YGCT:Young GC所用的时间(单位秒)
FGC:从程序启动到采样时发生Full GC的次数
FGCT:Full GC所用的时间(单位秒)
GCT:用于垃圾回收的总时间(单位秒)




   S0      S1       E          O         P        YGC    YGCT    FGC    FGCT      GCT
  0.00   0.00  99.99  82.51  53.11   2409    1.205 10117 7250.393 7251.598
  0.00   0.00  83.42  82.55  53.10   2409    1.205 10118 7252.650 7253.855
  0.00   0.00  56.06  82.46  53.10   2410    1.205 10120 7254.467 7255.672
  0.00   0.00  32.11  82.55  53.10   2411    1.205 10121 7256.673 7257.877
  0.00   0.00  99.99  82.55  53.10   2412    1.205 10123 7257.026 7258.231
  0.00   0.00  76.00  82.50  53.10   2412    1.205 10124 7259.241 7260.446
这个数据显示Full GC频繁发生。




JDK自带的JVM查看分析工具jps、jmap、jstat、jconsole


jps

Java进程查看工具,实际上它和Unix/Linux上面的ps命令的功能差不多


jmap

jmap是一个可以输出所有内存中对象的工具.

* -dump:format=b,file=<filename>  转存堆内存到本地文件。
* -histo 打印堆里每个类的情况,包含内存占用大小、对象数量及完整类名。VM的内部类以"*"开头。

例子:
jmap -histo pid号>log文件名
 
jmap -dump: file=a.hprof pid号


查看log文件

Object Histogram:
Size               Count              Class description
-------------------------------------------------------
21396040   135280 * ConstMethodKlass
14231448   11002 * ConstantPoolKlass
14076608  135280 * MethodKlass
13120872   144660 char[]
8795640   11002 * InstanceKlassKlass
8070520   15045 byte[]
8040592   147990 * SymbolKlass

num   #instances    #bytes class name
--------------------------------------
1:    427398    14458448 [I
2:    178798     6830216 [C
3:     50278     6668512 <constMethodKlass>
4:    179924     4318176 java.lang.String
5:     50278     4026648 <methodKlass>
6:     15244     3894200 [B
7:     47809     1773776 [Ljava.lang.Object;
...

#instance是对象的实例个数
#bytes是总占用的字节数
class name对应的就是Class文件里的class的标识
B代表byte
C代表char
D代表double
F代表float
I代表int
J代表long
Z代表boolean
前边有[代表数组,[I 就相当于int[]
对象用[L+类名表示

关于ConstMethodKlass

http://forums.sun.com/thread.jspa?threadID=760714
如果你看到ConstMethodKlass增加, ConstantPoolKlass等你载入“过度“数类(顺便说一句, ConstantPoolXXX对象用于存储有关ConstantPool的信息。class文件- 请参阅http://java.sun.com/docs / books/vmspec/2nd-edition/html/ConstantPool.doc.html 。同样, ConstMethodKlass存储方法的字节码等。) 。可能是因为您的应用程序加载的类地段(甚至可能是那些很多都是动态生成- 例如,JSP页面, Java反射类等)。一个可能的“修复“,就是要增加空间 MaxPermSize选项。


jstat

jstat是vm的状态监控工具,监控的内容有类加载、运行时编译及GC。

使用时,需加上查看进程的进程id,和所选参数。以下详细介绍各个参数的意义。 
    jstat -class pid:显示加载class的数量,及所占空间等信息。 
    jstat -compiler pid:显示VM实时编译的数量等信息。 
    jstat -gc pid:可以显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。 
    jstat -gccapacity:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其他的可以根据这个类推, OC是old内纯的占用量。 
    jstat -gcnew pid:new对象的信息。 
    jstat -gcnewcapacity pid:new对象的信息及其占用量。 
    jstat -gcold pid:old对象的信息。 
    jstat -gcoldcapacity pid:old对象的信息及其占用量。 
    jstat -gcpermcapacity pid: perm对象的信息及其占用量。 
    jstat -util pid:统计gc信息统计。 
    jstat -printcompilation pid:当前VM执行的信息。 
    除了以上一个参数外,还可以同时加上 两个数字,如:jstat -printcompilation 3024 250 6是每250毫秒打印一次,一共打印6次,还可以加上-h3每三行显示一下标题。


jstat -gcutil pid号 1000 20



jconsole

一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。 


Dump出内存

(1)Jconsole 打开后选择dumpHeap, 输入参数p0,p1;p0表示dump出来的文件路径,后缀为.hprof; p1设为true,表示只分析活着的对象。


(2)jmap -dump:file=a.hprof pid


其他内存分析工具

分析Java内存对象的工具,如收费的工具有jprofiler, 而像Eclipse MAT则是优秀的内存对象分析开源工具.它们对于分析内存溢出问题非常有用。以下是一个安装使用Eclipse MAT的简单例子。


(1)装一个Eclipse的内存分析插件MAT
http://download.eclipse.org/technology/mat/latest/update-site/


(2)切换到Memory Analysis模式




通过File > Open Heap Dump....查看dump出来的文件







  • 大小: 39.8 KB
  • 大小: 14.3 KB
分享到:
评论

相关推荐

    jvm内存监控工具使用

    ### JVM内存监控工具详解 #### 引言 Java Virtual Machine (JVM) 是运行 Java 应用程序的核心组件,其性能直接影响应用的响应速度和稳定性。JVM 的内存管理是性能优化的关键,尤其是在高并发环境下,合理的内存...

    idea插件JVM内存工具JProfiler11

    《深入理解IDEA插件JProfiler11:高效优化JVM内存》 在Java开发领域,高效运行和优化JVM内存是至关重要的。IntelliJ IDEA(简称Idea)作为广受欢迎的Java集成开发环境,提供了一系列强大的工具来帮助开发者进行性能...

    JVM内存空间分配笔记

    ### JVM内存空间分配详解 #### 一、JVM内存模型概览 JVM(Java虚拟机)内存模型主要由以下几个部分组成:程序计数器、Java虚拟机栈、本地方法栈、Java堆以及方法区(在JDK 8之后称为元空间)。下面将对这几个部分...

    vmmap 观察jvm内存 监控jvm jvm线程

    `vmmap`工具是Mac OS X系统中一个强大的内存分析工具,它可以用来深入观察JVM内存的分配和使用情况。本文将详细讲解如何利用`vmmap`监控JVM,理解其核心概念,以及分析JVM线程。 首先,`vmmap`是Apple提供的命令行...

    JVM内存管理白皮书

    在这份由Sun Microsystems公司出版的《JVM内存管理白皮书》中,我们可以找到关于Java虚拟机(JVM)内存管理的详细介绍和深入分析。这份文档对于想要深入了解JVM工作原理的读者来说是一份宝贵的学习资料。在这份...

    java获得jvm内存大小

    本文将深入探讨如何在Java中获取JVM内存大小,包括堆内存的总量、最大值以及剩余空间,并解析给定代码片段中的关键概念。 ### JVM内存模型 在讨论如何获取JVM内存大小之前,首先需要理解JVM的内存布局。JVM内存...

    JAVA JVM内存监控工具总结

    【Java JVM内存监控工具详解】 Java JVM内存监控是优化Java应用程序性能的关键环节,而VisualVM作为一款集成多种JDK命令行工具的可视化平台,提供了强大的分析功能。它包含的工具如jps、jstat、jmap、jinfo、jstack...

    JVM内存日志

    在开发和优化Java应用程序时,理解JVM内存日志至关重要,因为它可以帮助我们诊断性能问题,例如内存泄漏或过度的垃圾收集。`jmap`是Java的一个命令行工具,用于获取堆内存的详细信息,包括堆dump,这对于分析JVM内存...

    在Eclipse状态栏上增加JVM内存用量指示器

    因此,实时监控JVM内存用量可以帮助开发者及时发现并解决潜在的性能问题。 要实现这个功能,通常需要以下步骤: 1. **安装插件**:Eclipse有一个名为Memory Analyzer Tool (MAT)的内置工具,用于分析内存泄漏。...

    JVM 深入学习教程深入分析JVM教程!jvm 内存原型,优化等等

    本教程将涵盖JVM内存模型、内存分配以及优化策略。 一、JVM内存模型 1. 堆内存:堆是所有线程共享的一块内存区域,主要用于存储对象实例。Java中的动态内存分配主要在堆上进行,垃圾收集器也会对堆进行管理,进行...

    JVM内存泄露

    ### JVM内存泄露详解 #### 一、引言与背景 在现代软件开发中,Java作为一种广泛应用的编程语言,因其自动垃圾回收机制而受到青睐。然而,尽管Java虚拟机(JVM)内置了垃圾回收功能,但内存泄露问题仍然普遍存在。...

    JVM-内存管理 2012-12.pdf

    这些工具可以用来监控堆内存的使用情况,识别内存泄漏,分析内存使用趋势,帮助开发者进行性能调优。 总结而言,JVM内存管理涉及多个层面,包括内存结构的划分、内存空间的分配与回收机制、以及内存分析工具的使用...

    JVM内存管理、调优与监控考据

    本文将从JVM内存结构、调优策略以及监控工具等多个角度进行深入考据。 首先,JVM内存分为几个主要区域,包括堆(Heap)、方法区(Method Area)、栈(Stacks)、本地方法栈(Native Method Stack)和程序计数器...

    java中jvm内存分配相关资料总结整理

    本资料总结主要关注JVM内存分配及其运行原理,这对于理解和优化Java应用程序的性能至关重要。 1. **JVM内存结构** JVM内存分为几个关键区域:方法区(Method Area)、堆(Heap)、栈(Stack)、程序计数器(PC ...

    Java内存泄露_JVM监控工具介绍

    "Java内存泄露_JVM监控工具介绍" Java内存泄露是Java开发中常见的一种问题,发生内存泄露可能会导致Java应用程序崩溃或性能下降。在Java中,内存泄露的原因非常多样,例如,静态变量、循环引用、数据库连接池、...

    JVM模拟内存泄漏代码

    检测和解决内存泄漏的方法有多种,如使用内存分析工具(如VisualVM、MAT)、监控JVM的内存使用情况、优化代码逻辑等。关键在于识别那些长时间不释放的对象和类,理解它们的生命周期,以及为何垃圾收集器无法回收它们...

    jvm内存状况查看

    总结来说,监控和分析JVM内存状况是Java开发和调优的重要环节。通过输出GC日志,结合各种参数和工具,开发者能够深入理解内存使用情况,进而优化程序性能,防止因内存问题导致的性能瓶颈和系统稳定性问题。

    JVM 内存分析

    对于描述中提到的博客链接,由于无法直接访问,我们可以假设博主可能讨论了JVM内存的分配策略、垃圾收集算法(如Minor GC、Major GC、Full GC)、内存泄漏检测以及如何通过工具(如VisualVM、JProfiler)进行内存...

    【转】Java内存泄露_JVM监控工具介绍jstack_jconsole_jinfo_jmap_jdb_jstat

    总的来说,这些工具为Java开发者提供了一套全面的诊断和监控手段,能够有效地帮助我们理解和优化Java应用程序的性能,防止和解决内存泄露问题。在实际开发中,结合使用这些工具可以极大地提升我们的工作效率和系统的...

Global site tag (gtag.js) - Google Analytics