最近在研究JVM优化方面的知识,今天就顺便用JVM的查看工具测试了一下当发生OutOfMemoryError的时候如何通过工具来分析出错原因。
需要的工具Eclipse Memory Analyzer。
1.在eclipse的run argument中输入以下VM参数(关于Xms,Xmx,Xmn的具体含义参考http://unixboy.iteye.com/blog/174173)。设置了堆空间为20M,年轻代为10M。通过参数-XX:+HeapDumpOnOutOfMemoryError指定发生OutOfMemoryError的时候dump下内存(文件名为java_pid〈进程ID〉.hprof)。通过参数 -XX:+PrintGCDetails -Xloggc:gc.log设置程序输出gc的信息到gc.log文件。
2.以下为java代码
package com.fnk.spring.manager;
import java.util.LinkedList;
class TestGC {
public static void main(String[] args) {
LinkedList<String> l = new LinkedList<String>();
while(true){
l.add(new String("Testttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt"));
}
}
}
3. 以下为gc.log文件。
先说一下日志输出的结构:(1.6和1.5略微有一些不同,只是1.6对于时间统计更加细致)
[GC [<collector>: <starting occupancy1> -> <ending
occupancy1>, <pause time1> secs] <starting occupancy3>
-> <ending occupancy3>, <pause time3> secs]
<collector>GC收集器的名称
<starting occupancy1> 新生代在GC前占用的内存
<ending occupancy1> 新生代在GC后占用的内存
<pause time1> 新生代局部收集时jvm暂停处理的时间
<starting occupancy3> JVM Heap 在GC前占用的内存
<ending occupancy3> JVM Heap 在GC后占用的内存
<pause time3> GC过程中jvm暂停处理的总时间
那么第一行数据可以发现发生min GC的时候年轻代从7680K到1272K回收了6408K,堆空间从7680K到7632K回收了48K,说明有6360K的数据被转移到了年老代。
那么第二行数据可以发现发生Full GC的时候年轻代从1272K到0K回收了1272K,年老代从6360K到7629K增多了1269K,堆空间从7632K到7629K回收了3K。
通过观察年老代不断的增多,一直到上限10240K。最后当年轻代的数量达到7679K的时候就发生了outofmemory的错误。
可以发生eden的space是7680K,from和to space的都是1280k。因为from和to的空间不能同时使用,因此可用的年轻代空间是8960K。默认的eden和surver的空间比例是6:1.
0.386: [GC [PSYoungGen: 7680K->1272K(8960K)] 7680K->7632K(19200K), 0.0439756 secs] [Times: user=0.06 sys=0.00, real=0.05 secs]
0.430: [Full GC [PSYoungGen: 1272K->0K(8960K)] [PSOldGen: 6360K->7629K(10240K)] 7632K->7629K(19200K) [PSPermGen: 2059K->2059K(12288K)], 0.0241013 secs] [Times: user=0.01 sys=0.00, real=0.02 secs]
0.460: [Full GC [PSYoungGen: 7680K->5068K(8960K)] [PSOldGen: 7629K->10240K(10240K)] 15309K->15308K(19200K) [PSPermGen: 2059K->2059K(12288K)], 0.0492533 secs] [Times: user=0.05 sys=0.00, real=0.05 secs]
0.512: [Full GC [PSYoungGen: 7680K->7680K(8960K)] [PSOldGen: 10240K->10240K(10240K)] 17920K->17920K(19200K) [PSPermGen: 2065K->2065K(12288K)], 0.0475882 secs] [Times: user=0.05 sys=0.00, real=0.05 secs]
0.559: [Full GC [PSYoungGen: 7680K->7480K(8960K)] [PSOldGen: 10240K->10240K(10240K)] 17920K->17720K(19200K) [PSPermGen: 2065K->2059K(12288K)], 0.0626773 secs] [Times: user=0.06 sys=0.00, real=0.06 secs]
0.622: [Full GC [PSYoungGen: 7680K->7680K(8960K)] [PSOldGen: 10240K->10240K(10240K)] 17920K->17920K(19200K) [PSPermGen: 2059K->2059K(12288K)], 0.0479926 secs] [Times: user=0.05 sys=0.00, real=0.05 secs]
0.671: [Full GC [PSYoungGen: 7680K->7679K(8960K)] [PSOldGen: 10240K->10240K(10240K)] 17920K->17919K(19200K) [PSPermGen: 2059K->2059K(12288K)], 0.0484853 secs] [Times: user=0.05 sys=0.00, real=0.05 secs]
0.719: [Full GC [PSYoungGen: 7679K->7679K(8960K)] [PSOldGen: 10240K->10240K(10240K)] 17919K->17919K(19200K) [PSPermGen: 2059K->2059K(12288K)], 0.0477472 secs] [Times: user=0.05 sys=0.00, real=0.05 secs]
0.767: [Full GC [PSYoungGen: 7679K->7679K(8960K)] [PSOldGen: 10240K->10240K(10240K)] 17919K->17919K(19200K) [PSPermGen: 2059K->2059K(12288K)], 0.0489797 secs] [Times: user=0.06 sys=0.00, real=0.06 secs]
1.892: [Full GC [PSYoungGen: 7679K->0K(8960K)] [PSOldGen: 10240K->137K(10240K)] 17919K->137K(19200K) [PSPermGen: 2059K->2059K(12288K)], 0.0100488 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]
Heap
PSYoungGen total 8960K, used 209K [0x073e0000, 0x07de0000, 0x07de0000)
eden space 7680K, 2% used [0x073e0000,0x07414518,0x07b60000)
from space 1280K, 0% used [0x07b60000,0x07b60000,0x07ca0000)
to space 1280K, 0% used [0x07ca0000,0x07ca0000,0x07de0000)
PSOldGen total 10240K, used 137K [0x069e0000, 0x073e0000, 0x073e0000)
object space 10240K, 1% used [0x069e0000,0x06a02490,0x073e0000)
PSPermGen total 12288K, used 2065K [0x029e0000, 0x035e0000, 0x069e0000)
object space 12288K, 16% used [0x029e0000,0x02be4558,0x035e0000)
4. 通过memery analyzer可以分析出内存泄漏发生在linkedlist
总结:Memery Analyzer是一个很好的分析工具,在程序运行的时候可以通过Jmap dump下内存,然后通过它来分析。
一个问题是,垃圾回收动作何时执行?
- 当年轻代内存满时,会引发一次普通GC,该GC仅回收年轻代。需要强调的时,年轻代满是指Eden代满,Survivor满不会引发GC
- 当年老代满时会引发Full GC,Full GC将会同时回收年轻代、年老代
- 当永久代满时也会引发Full GC,会导致Class、Method元信息的卸载
另一个问题是,何时会抛出OutOfMemoryException,并不是内存被耗空的时候才抛出
- JVM98%的时间都花费在内存回收
- 每次回收的内存小于2%
- 大小: 17.8 KB
- 大小: 36.6 KB
分享到:
相关推荐
Java开发过程中,遇到`OutOfMemoryError`是一种常见的挑战,它表明程序在运行时耗尽了内存资源。MAT(Memory Analyzer Tool)是IBM提供的一款强大的Java内存分析工具,它专为解决此类问题而设计,帮助开发者深入理解...
1. **对象过度创建**:程序中存在过多的对象创建,尤其是在循环或递归过程中,如果对象未被及时垃圾回收,将导致堆内存迅速耗尽。 2. **内存泄露**:某些对象引用未能正确释放,导致垃圾回收器无法回收这些对象,...
java.lang.OutOfMemoryError处理错误 java.lang.OutOfMemoryError是Java虚拟机(JVM)中的一种常见错误,...java.lang.OutOfMemoryError是Java虚拟机中的一种常见错误,解决这种错误需要根据实际情况进行分析和解决。
在IT领域,尤其是在Java开发中,`OutOfMemoryError`是一个常见的问题,通常表明程序在运行过程中耗尽了分配给它的内存资源。这个问题在本案例中发生在网店系统的升级后,经过压力测试,系统突然崩溃,抛出了`...
- **java.lang.OutOfMemoryError**: 这是一个运行时异常,表示JVM在执行过程中遇到了内存不足的情况。 - **Java heap space**: 堆是JVM管理的一部分内存,用于存储对象实例和数组。当堆内存无法满足新对象的分配需求...
- `java.lang.OutOfMemoryError: Java heap space`表示Java程序在运行过程中耗尽了所有可用的堆内存空间。 - 当程序创建新的对象或者分配内存时,如果无法在现有的堆内存中找到足够的连续空闲内存块,则会抛出此...
### 解决过程概述 在AIX 5.3操作系统下,使用WebSphere Application Server (WAS) 6.1和Oracle 10g的技术平台上,一个J2EE应用程序出现了OutOfMemoryError异常,导致整个系统挂死。该问题发生在项目上线大约半年...
在Java开发过程中,我们经常会遇到`java.lang.OutOfMemoryError`(简称OOM)的问题。这个问题的发生主要是由于JVM内存不足或程序中存在内存泄漏所引起的。本文将深入探讨OOM产生的原因以及如何有效地解决这一问题。 ...
在进行Java项目编译的过程中,可能会遇到`java.lang.OutOfMemoryError: Java heap space`这种异常。这类异常通常表明Java虚拟机(JVM)在运行过程中遇到了内存不足的问题,特别是当堆内存无法满足程序的需求时。 ##...
Java程序在运行过程中可能会遇到各种异常,其中"nested exception is java.lang.OutOfMemoryError: Java heap space"是一个常见的问题,通常发生在程序试图分配超过堆内存限制的空间时。这个错误表明Java虚拟机(JVM...
在Java应用程序运行过程中,"java.lang.OutOfMemoryError: PermGen space"错误是常见的一个问题,尤其是在使用Tomcat这样的Java应用服务器时。这个错误表明应用程序在 PermGen 区域(Permanent Generation)耗尽了...
总的来说,处理`OutOfMemoryError`需要理解Java内存模型,熟悉JVM参数配置,以及使用内存分析工具。通过这些步骤,我们不仅能解决当前的问题,还能提高程序的健壮性和性能,防止类似问题的再次发生。记住,每一次的`...
在Java应用程序开发与维护过程中,经常会遇到`java.lang.OutOfMemoryError: Java heap space`这一异常情况。该异常通常表明Java虚拟机(JVM)的堆内存不足以支持当前程序运行所需的内存分配请求。本文将详细介绍该...
本文将针对两种常见的Java内存溢出错误——`java.lang.OutOfMemoryError: PermGen space`和`java.lang.OutOfMemoryError: Java heap space`进行详细的分析和解决方案的探讨。 首先,我们来看`java.lang....
"java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError" 是一个典型的错误提示,它表明在并发执行过程中遇到了内存不足的问题。下面我们将深入探讨这个问题的原因、影响以及如何解决。 内存溢出...
在Java程序中,`java.lang.OutOfMemoryError: Java heap space` 是一个常见的错误,意味着程序在运行过程中耗尽了JVM分配的堆内存。这个错误通常发生在创建大量对象或者单个对象占用过多内存时。 一、问题描述与...
Java内存溢出(Out Of Memory, OOM)是开发者在编程过程中经常遇到的问题,尤其是在处理大量数据或长时间运行的应用程序时。本篇文章将详细解析三种常见的Java内存溢出类型:JVM PermGen space溢出、JVM heap space...
在Java开发过程中,JVM(Java Virtual ...总之,JVM崩溃日志分析是一个细致的过程,需要结合代码、日志和各种工具来定位问题。通过深入学习和实践,开发者可以更好地理解和处理这类问题,确保Java应用的稳定运行。
在运行过程中,由于各种因素,如内存泄漏、高并发、大型数据处理等,可能会导致服务器性能下降甚至崩溃。在这种情况下,理解并分析服务器的内存状态至关重要。"websphere application server 内存分析工具"就是为了...