- 浏览: 595276 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (213)
- jdk (40)
- J2EE (8)
- JavaScript (16)
- spring (1)
- 正则 (10)
- ORACLE (18)
- CSS (1)
- 生活学习 (14)
- XML (3)
- Linux (11)
- 项目架设 (12)
- Junit (1)
- Derby (3)
- JMX (5)
- 版本控制 (4)
- PowerDesigner (1)
- 加密解密 (1)
- android (4)
- Eclipse (4)
- Hibernate (6)
- Tomcat (4)
- JasperReport&iReport (1)
- SqlServer (6)
- C++ (3)
- 系统架构涉及名词解释 (5)
- Hadoop (8)
- windows (2)
- SOA (1)
- 有趣的Google (1)
- 编程语言 (0)
- 数据结构与算法 (1)
- nodejs (1)
- 一些测试整理备份在这里吧 (0)
- 性能 (3)
- Drill (5)
- 学习 (1)
最新评论
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
JDK自带的JVM查看分析工具jps、jmap、jstat、jconsole
jps
Java进程查看工具,实际上它和Unix/Linux上面的ps命令的功能差不多
jmap
jmap是一个可以输出所有内存中对象的工具.
* -dump:format=b,file=<filename> 转存堆内存到本地文件。
* -histo 打印堆里每个类的情况,包含内存占用大小、对象数量及完整类名。VM的内部类以"*"开头。
例子:
查看log文件
#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每三行显示一下标题。
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出来的文件
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出来的文件
发表评论
-
关于饿汉式单例首次初始化失败后,可以再次尝试?
2012-07-11 15:14 1265思考一个问题,以下代码是一个简单的饿汉式单例代码,显然在第一次 ... -
由ApacheCommon-BeanUtils1.8.3发现的Java HotSpot(TM)的Bug
2012-07-03 15:42 1604由ApacheCommon-BeanUtils1.8.3发现的 ... -
JVM垃圾回收
2012-04-19 13:02 3523一、JVM内存模型及垃圾收集算法 1.根据Java虚 ... -
Java构建HashCode相同字符串算法
2012-01-10 15:05 5563import java.math.BigDecimal; ... -
线程全部结束与集合点
2011-11-12 16:26 1253final int size = 50; fin ... -
ddddddddd
2011-11-12 16:21 1256dddddddddd -
ccccccc
2011-11-12 16:20 1970ccccccccccc -
bbbbbb
2011-11-12 16:19 1764bbbbb -
Aaaaa
2011-11-12 16:19 928aaaaaaaa -
备忘链接
2011-08-16 18:25 954翻译,随便写了写,备忘一下 URLConnection co ... -
jvisualvm监听JVM
2011-08-05 10:14 1206配置好 set JAVA_OPTS=%JAVA_OPTS ... -
JVM 调优 技巧
2011-08-02 15:59 12601.升级 JVM 版本。如果能使用64-bit,使用64-bi ... -
JVM垃圾回收策略
2011-08-02 14:59 1063为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不 ... -
Java GC
2011-08-02 13:38 1052调整JVM GC(Garbage Collection),可 ... -
Java的弱引用(Weak Reference)
2011-05-18 16:07 1250要理解弱引用,首先要 ... -
使用classloader动态加载Class
2011-05-17 14:25 965http://www.javaworld.com/javawo ... -
查看class文件信息
2011-05-16 14:15 1701看了第6章的java class文件这一部分,我觉得对clas ... -
.class文件格式--java字节码文件的格式
2011-05-14 23:07 25441 . 目的 Java 虚拟机识别的 class 文件格式包含 ... -
Calendar
2011-03-30 14:13 1054/**获得参数月份的一号及其下一个月的一号*/ priva ... -
Bad version number in .class file
2011-03-04 15:08 1338java.lang.UnsupportedClassVersi ...
相关推荐
### JVM内存监控工具详解 #### 引言 Java Virtual Machine (JVM) 是运行 Java 应用程序的核心组件,其性能直接影响应用的响应速度和稳定性。JVM 的内存管理是性能优化的关键,尤其是在高并发环境下,合理的内存...
《深入理解IDEA插件JProfiler11:高效优化JVM内存》 在Java开发领域,高效运行和优化JVM内存是至关重要的。IntelliJ IDEA(简称Idea)作为广受欢迎的Java集成开发环境,提供了一系列强大的工具来帮助开发者进行性能...
`vmmap`工具是Mac OS X系统中一个强大的内存分析工具,它可以用来深入观察JVM内存的分配和使用情况。本文将详细讲解如何利用`vmmap`监控JVM,理解其核心概念,以及分析JVM线程。 首先,`vmmap`是Apple提供的命令行...
### JVM内存空间分配详解 #### 一、JVM内存模型概览 JVM(Java虚拟机)内存模型主要由以下几个部分组成:程序计数器、Java虚拟机栈、本地方法栈、Java堆以及方法区(在JDK 8之后称为元空间)。下面将对这几个部分...
在这份由Sun Microsystems公司出版的《JVM内存管理白皮书》中,我们可以找到关于Java虚拟机(JVM)内存管理的详细介绍和深入分析。这份文档对于想要深入了解JVM工作原理的读者来说是一份宝贵的学习资料。在这份...
本文将深入探讨如何在Java中获取JVM内存大小,包括堆内存的总量、最大值以及剩余空间,并解析给定代码片段中的关键概念。 ### JVM内存模型 在讨论如何获取JVM内存大小之前,首先需要理解JVM的内存布局。JVM内存...
【Java JVM内存监控工具详解】 Java JVM内存监控是优化Java应用程序性能的关键环节,而VisualVM作为一款集成多种JDK命令行工具的可视化平台,提供了强大的分析功能。它包含的工具如jps、jstat、jmap、jinfo、jstack...
在开发和优化Java应用程序时,理解JVM内存日志至关重要,因为它可以帮助我们诊断性能问题,例如内存泄漏或过度的垃圾收集。`jmap`是Java的一个命令行工具,用于获取堆内存的详细信息,包括堆dump,这对于分析JVM内存...
因此,实时监控JVM内存用量可以帮助开发者及时发现并解决潜在的性能问题。 要实现这个功能,通常需要以下步骤: 1. **安装插件**:Eclipse有一个名为Memory Analyzer Tool (MAT)的内置工具,用于分析内存泄漏。...
本教程将涵盖JVM内存模型、内存分配以及优化策略。 一、JVM内存模型 1. 堆内存:堆是所有线程共享的一块内存区域,主要用于存储对象实例。Java中的动态内存分配主要在堆上进行,垃圾收集器也会对堆进行管理,进行...
### JVM内存泄露详解 #### 一、引言与背景 在现代软件开发中,Java作为一种广泛应用的编程语言,因其自动垃圾回收机制而受到青睐。然而,尽管Java虚拟机(JVM)内置了垃圾回收功能,但内存泄露问题仍然普遍存在。...
这些工具可以用来监控堆内存的使用情况,识别内存泄漏,分析内存使用趋势,帮助开发者进行性能调优。 总结而言,JVM内存管理涉及多个层面,包括内存结构的划分、内存空间的分配与回收机制、以及内存分析工具的使用...
本文将从JVM内存结构、调优策略以及监控工具等多个角度进行深入考据。 首先,JVM内存分为几个主要区域,包括堆(Heap)、方法区(Method Area)、栈(Stacks)、本地方法栈(Native Method Stack)和程序计数器...
本资料总结主要关注JVM内存分配及其运行原理,这对于理解和优化Java应用程序的性能至关重要。 1. **JVM内存结构** JVM内存分为几个关键区域:方法区(Method Area)、堆(Heap)、栈(Stack)、程序计数器(PC ...
"Java内存泄露_JVM监控工具介绍" Java内存泄露是Java开发中常见的一种问题,发生内存泄露可能会导致Java应用程序崩溃或性能下降。在Java中,内存泄露的原因非常多样,例如,静态变量、循环引用、数据库连接池、...
检测和解决内存泄漏的方法有多种,如使用内存分析工具(如VisualVM、MAT)、监控JVM的内存使用情况、优化代码逻辑等。关键在于识别那些长时间不释放的对象和类,理解它们的生命周期,以及为何垃圾收集器无法回收它们...
总结来说,监控和分析JVM内存状况是Java开发和调优的重要环节。通过输出GC日志,结合各种参数和工具,开发者能够深入理解内存使用情况,进而优化程序性能,防止因内存问题导致的性能瓶颈和系统稳定性问题。
对于描述中提到的博客链接,由于无法直接访问,我们可以假设博主可能讨论了JVM内存的分配策略、垃圾收集算法(如Minor GC、Major GC、Full GC)、内存泄漏检测以及如何通过工具(如VisualVM、JProfiler)进行内存...
总的来说,这些工具为Java开发者提供了一套全面的诊断和监控手段,能够有效地帮助我们理解和优化Java应用程序的性能,防止和解决内存泄露问题。在实际开发中,结合使用这些工具可以极大地提升我们的工作效率和系统的...