`
marb
  • 浏览: 422708 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jvm内存管理之java堆溢出 -实例分析

    博客分类:
  • JAVA
 
阅读更多

java堆用于存储对象实例,我们只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清楚这些对象,就会在对象数量达到最大堆的容量限制后产生内存溢出异常。

下面给出例子代码体验一下java堆溢出的过程:

1.通过jvm参数(-Xms20M -Xmx20M -Xmn10M ),限制java 堆的大小

2.通过jvm参数(-verbose:gc -XX:+PrintGCDetails )打印GC的过程信息

3.通过jvm参数(-XX:+HeapDumpOnOutOfMemoryError),可以让虚拟机在出现内存溢出异常时Dump出当前的内存堆转储快照。

  1. package com.jaynol.jvm.oom.sample;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. /** 
  7.  * VM Args: 
  8.  *  -verbose:gc -XX:+PrintGCDetails  
  9.  *  -Xms20M -Xmx20M -Xmn10M -XX:+HeapDumpOnOutOfMemoryError 
  10.  * @author Johnny 
  11.  * 
  12.  */  
  13. public class HeapOOM {  
  14.   
  15.     static class OOMObject{}  
  16.       
  17.     /** 
  18.      * @param args 
  19.      */  
  20.     public static void main(String[] args) {  
  21.         List<OOMObject> list = new ArrayList<OOMObject>();  
  22.           
  23.         while(true){  
  24.             list.add(new OOMObject());  
  25.         }  
  26.     }  
  27.   
  28. }  
运行结果:

[GC [DefNew: 7669K->1024K(9216K), 0.0146870 secs] 7669K->4602K(19456K), 0.0147209 secs] [Times: user=0.02 sys=0.00, real=0.02 secs] 
[GC [DefNew: 9216K->1024K(9216K), 0.0200416 secs] 12794K->10520K(19456K), 0.0200646 secs] [Times: user=0.03 sys=0.00, real=0.02 secs] 
[GC [DefNew: 9216K->9216K(9216K), 0.0000159 secs][Tenured: 9496K->5712K(10240K), 0.0564110 secs] 18712K->14138K(19456K), [Perm : 166K->166K(12288K)], 0.0564723 secs] [Times: user=0.06 sys=0.00, real=0.06 secs] 
[Full GC [Tenured: 5712K->5712K(10240K), 0.0396698 secs] 14625K->14625K(19456K), [Perm : 166K->166K(12288K)], 0.0396968 secs] [Times: user=0.05 sys=0.00, real=0.04 secs] 
[Full GC [Tenured: 5712K->5700K(10240K), 0.0441324 secs] 14625K->14612K(19456K), [Perm : 166K->166K(12288K)], 0.0441718 secs] [Times: user=0.05 sys=0.00, real=0.04 secs] 
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid1340.hprof ...
Heap dump file created [29756494 bytes in 0.462 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.util.Arrays.copyOf(Unknown Source)
at java.util.ArrayList.grow(Unknown Source)
at java.util.ArrayList.ensureCapacityInternal(Unknown Source)
at java.util.ArrayList.add(Unknown Source)
at com.jaynol.jvm.oom.sample.HeapOOM.main(HeapOOM.java:24)
Heap
 def new generation   total 9216K, used 8920K [0x33210000, 0x33c10000, 0x33c10000)
  eden space 8192K, 100% used [0x33210000, 0x33a10000, 0x33a10000)
  from space 1024K,  71% used [0x33a10000, 0x33ac6038, 0x33b10000)
  to   space 1024K,   0% used [0x33b10000, 0x33b10000, 0x33c10000)
 tenured generation   total 10240K, used 5700K [0x33c10000, 0x34610000, 0x34610000)
   the space 10240K,  55% used [0x33c10000, 0x341a10b8, 0x341a1200, 0x34610000)
 compacting perm gen  total 12288K, used 168K [0x34610000, 0x35210000, 0x38610000)
   the space 12288K,   1% used [0x34610000, 0x3463a390, 0x3463a400, 0x35210000)
    ro space 10240K,  42% used [0x38610000, 0x38a4f150, 0x38a4f200, 0x39010000)
    rw space 12288K,  54% used [0x39010000, 0x3968fad8, 0x3968fc00, 0x39c10000)

从运行结果可以看出,经过JVM的3次Minor GC,再经过两次full GC后已经无法再GC了,空间已经无法再扩展了,最终导致了OutOfMemoryError

分享到:
评论

相关推荐

    java虚拟机jvm及Tomcat中的jvm有关内存的设置与调优

    1. **堆内存(Heap)**:这是JVM管理的最大块内存区域,用于存储所有对象实例以及数组。堆内存又分为年轻代(Young Generation)和老年代(Old Generation),年轻代进一步细分为Eden区和两个Survivor区(S0、S1)。 2. **...

    java获得jvm内存大小

    总之,掌握如何在Java中获取和管理JVM内存大小,是每一个Java开发者都应具备的基本技能之一。通过合理利用`Runtime`类提供的API和灵活调整JVM的启动参数,可以有效地提升应用程序的性能和用户体验。

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

    Java虚拟机(JVM)是Java程序运行的基础,它负责解析字节码并管理程序的内存。本资料总结主要关注JVM内存分配及其运行原理,这对于理解和优化Java应用程序的性能至关重要。 1. **JVM内存结构** JVM内存分为几个...

    jvm 内存分析文档

    【Jvm 内存分析文档】 Java 虚拟机(JVM)是Java程序的核心运行环境,它负责管理和执行字节码。JVM内存管理主要包括内存结构、内存分配以及垃圾回收(GC)等方面。了解这些知识对于优化Java应用程序的性能至关重要...

    02-VIP-JVM内存模型深度剖析(1)1

    Java虚拟机(JVM)内存模型是Java程序运行的基础,它包括了多个区域,如堆内存、栈内存、方法区、程序计数器以及本地方法栈。这些区域各自承担着不同的职责,确保Java应用程序能够正常执行。 1. JVM整体结构及内存...

    jvm内存溢出

    ### JVM内存溢出详解 #### 一、基本概念与理解 **JVM内存溢出**是一种常见的运行时错误,指的是程序在执行过程中因为...通过以上详细的分析和策略,可以有效地预防和解决JVM内存溢出问题,提高程序的稳定性和性能。

    jvm内存管理,pdf

    4. **Java堆**:所有线程共享的内存区域,主要用于存放对象实例。 5. **方法区**:用于存放类的信息、常量、静态变量等数据。 #### 三、对象的生命周期 在Java堆中,对象的生命周期决定了其是否会被垃圾收集器回收...

    JAVA内存溢出详解.doc

    Java内存溢出(Out Of Memory,OOM)是Java应用程序运行时常见的问题,它通常发生在程序对内存需求超过了Java虚拟机(JVM)所能提供的可用内存时。本文将深入探讨Java内存溢出的原因、表现以及如何解决。 1. **Java...

    jvm基础知识与调优-jvm-training.zip

    - Java堆:所有对象实例都在此分配内存,分为新生代、老年代。 - 操作栈:每个线程都有一个独立的操作栈,用于存储方法调用的局部变量、操作数栈等。 - PC寄存器:记录当前线程正在执行的字节码指令地址。 - ...

    JVM内存管理及调优

    JVM内存管理是优化Java应用性能的关键环节,涉及到内存分配、垃圾回收以及内存溢出等问题。毕玄,一位在淘宝有着丰富经验的专家,通过他的演讲PPT,我们能深入理解JVM内存的实现、使用和调优。 ### 一、JVM内存实现...

    java内存溢出解决方案

    Java内存溢出问题通常指的是Java应用程序在运行过程中由于内存分配不当或使用过度导致JVM无法分配更多的内存,从而抛出`java.lang.OutOfMemoryError`异常。本文将深入探讨Java内存溢出的不同类型及其解决方案。 1. ...

    内存溢出配置,内存溢出配置

    内存溢出配置是IT行业中,尤其是在Java应用开发与运维领域中的一个重要话题,它涉及到系统资源管理、性能调优以及故障排查等多个方面。标题与描述中重复提到“内存溢出配置”,这表明了对这一主题的关注与重视。接...

    jvm内存分析工具mat安装包

    MAT,全称Memory Analyzer Tool,是IBM开发的一款强大的JVM内存分析工具,尤其适用于诊断Java应用程序的内存泄漏问题。在Java开发过程中,内存溢出(Out Of Memory)问题常常会导致程序异常终止,而MAT就是解决这类...

    Sun JVM原理与内存管理

    ### Sun JVM原理与内存管理 #### 一、Sun JDK 1.6 GC (Garbage Collector) Sun JDK 1.6 的垃圾收集器(GC)是其内存管理的关键组成部分,它负责自动地回收不再使用的对象所占用的内存。本文将详细介绍Sun JDK 1.6 GC...

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

    在理解内存泄露和溢出之前,我们需要先了解Java虚拟机(JVM)的基本内存结构及其管理机制: 1. **JVM内存区域**: - **年轻代(Young Generation)**: 包括Eden区和两个Survivor区(S0、S1)。新创建的对象首先在这里...

    JVM内存溢出

    【JVM内存溢出】指的是Java虚拟机在运行过程中,由于内存分配不当或者内存使用过度导致内存无法正常管理,从而抛出错误的情况。这通常会导致应用程序崩溃或性能急剧下降。在Tomcat这样的Java应用服务器中,内存溢出...

    Java内存溢出解决办法

    堆内存主要用于存储对象实例,当创建大量对象或者单个对象占用大量内存时,如果堆空间不足,就会抛出`java.lang.OutOfMemoryError: Java heap space`。解决方法包括增大堆大小(通过-Xms和-Xmx设置),优化对象创建...

    Java的内存管理机制分析

    ### Java的内存管理机制分析 #### 一、Java内存区域划分 Java的内存管理机制将内存分为以下几个区域: 1. **栈(Stack)**: - 存储局部变量(如基本类型的变量和对象的引用)。 - 每个线程拥有一个独立的栈。 ...

    Java虚拟机 JVM 内存结构介绍

    Java虚拟机(JVM)内存结构是理解Java应用程序性能和内存管理的关键。本文将详细介绍JVM内存的不同组件,包括它们的功能和重要性。 首先,Java虚拟机规范中的内存管理主要涉及Runtime Data Area,这是一个用于存储...

    JVM实战-对象访问与内存溢出异常解析

    通过本实验,旨在深入理解JVM内存管理机制以及各种内存区域的特点,并通过具体的编程实践来触发并分析这些异常,进而提升对Java应用程序性能调优和故障排查的能力。 #### 实验目标 1. **理解内存区域与内存区域...

Global site tag (gtag.js) - Google Analytics