`

内存溢出、栈溢出等错误的分析和解决

    博客分类:
  • JAVA
 
阅读更多

转载:

 

java.lang.StackOverflowError:(很少) 

java.lang.OutOfMemoryError:heap space(比较常见) 

java.lang.OutOfMemoryError: PermGen space (经常出现) 

 

以下分别解释一下,从最常见的开始: 

 

java.lang.OutOfMemoryError: PermGen space 这个异常比较常见,是说JVM里的Perm内存区的异常溢出,由于JVM在默认的情况下,Perm默认为64M,而很多程序需要大量的Perm区内存, 尤其使用到像Spring等框架的时候,由于需要使用到动态生成类,而这些类不能被GC自动释放,所以导致OutOfMemoryError: PermGen space异常。解决方法很简单,增大JVM的 -XX:MaxPermSize 启动参数,就可以解决这个问题,如过使用的是默认变量通常是64M[5.0 and newer: 64 bit VMs are scaled 30% larger; 1.4 amd64: 96m; 1.3.1 -client: 32m.],改成128M就可以了,-XX:MaxPermSize=128m。如果已经是128m(Eclipse已经是128m了),就改成 256m。我一般在服务器上为安全起见,改成256m。 

 

java.lang.OutOfMemoryError:heap space或 其它OutOfMemoryError,这个异常实际上跟上面的异常是一个异常,但解决方法不同,所以分开来写。上面那个异常是因为JVM的perm区内存区分少了引起的(JVM的内存区分为 young,old,perm三种)。而这个异常是因为JVM堆内存或者说总体分少了。解决方法是更改 -Xms -Xmx 启动参数,通常是扩大1倍。xms是管理启动时最小内存量的,xmx是管里JVM最大的内存量的。 

注:OutOfMemoryError可能有很多种原因,根据JVM Specification, 可能有一下几种情况,我先简单列出。stack:stack分区不能动态扩展,或不足以生成新的线程。Heap:需要更多的内存,而不能获得。Method Area :如果不能满足分配需求。runtime constant pool(从Method Area分配内存)不足以创建class or interface。native method stacks不能够动态扩展,或生成新的本地线程。 

 

最后说说java.lang.StackOverflowError,老实说这个异常我也没碰见过,但JVM Specification就提一下,规范上说有一下几种境况可能抛出这个异常,一个是Stacks里的线程超过允许的时候,另一个是当native method要求更大的内存,而超过native method允许的内存的时候。根据SUN的文档,提高-XX:ThreadStackSize=512的值。 

 

总的来说调优JVM的内存,组要目的就是在使用内存尽可能小的,使程序运行正常,不抛出内纯溢出的bug。而且要调好最小内存,最大内存的比,避免GC时浪费太多时间,尤其是要尽量避免FULL GC。 

 

如果你发现每次GC后,Heap的剩余空间会是总空间的50%,这表示你的Heap处于健康状态。许多Server端的Java程序每次GC后最好能有65%的剩余空间。经验之谈: 

 

-vmargs

-Xms256m

-Xmx512m

-XX:PermSize=256m

-XX:MaxPermSize=512m

-XX:ReservedCodeCacheSize=64m

-XX:ThreadStackSize=512

分享到:
评论

相关推荐

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

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

    myeclipse内存溢出问题解决方案

    总结来说,解决MyEclipse内存溢出问题需要理解Java内存模型和JVM参数设置,合理分配堆内存、新生代和永久代的大小。通过监控和调整这些参数,可以有效地避免内存溢出问题,提升应用的稳定性和性能。

    内存泄漏与内存溢出

    在软件开发领域,尤其是涉及到数据库应用的场景下,内存泄漏(Memory Leak)和内存溢出(Out of Memory,简称OOM)是两个常见的问题,它们直接影响到程序的性能、稳定性和可扩展性。以下是对这两个概念及其相关知识...

    kettle内存溢出(Java heap space)以及解决方法.docx

    在IT领域,尤其是在大数据处理和...同时,理解数据处理的瓶颈,选择合适的硬件配置和软件配置,都是预防和解决Kettle内存溢出问题的重要手段。在实际操作中,可能需要反复试验和调整,找到最适合当前环境和任务的配置。

    Java 内存溢出解决办法

    Java内存溢出问题通常指的是程序在试图分配内存时,无法找到足够的连续内存空间而抛出的异常。在Java中,内存分为几个区域:堆(Heap)、栈(Stack...同时,保持对JVM和应用性能的持续监控是预防和解决内存溢出的关键。

    Android 内存溢出问题

    本篇文章将深入探讨Android内存管理的两个核心概念:堆(Heap)和栈(Stack),以及如何理解和解决Android内存溢出问题。 1. 堆与栈 堆和栈是Java虚拟机(JVM)中的两种主要内存区域,它们各自具有特定的用途和...

    关于JVM内存溢出的原因分析及解决方案探讨.docx

    关于 JVM 内存溢出的原因分析及解决方案探讨 本文主要讨论了 JVM 中的内存溢出问题,包括内存溢出的定义、内存泄漏和...本文对 JVM 中的内存溢出问题进行了详细的分析和讨论,并提供了一些解决方案,以供读者参考。

    栈溢出利用软件漏洞分析入门

    ### 栈溢出利用软件漏洞分析入门 #### 1. 引言 随着信息技术的快速发展,软件漏洞成为了网络安全领域中的一个重要议题。栈溢出作为最常见的软件漏洞之一,不仅影响广泛,而且利用方式多样,给系统安全带来了极大的...

    JAVA内存溢出详解.doc

    总之,Java内存溢出是复杂的问题,需要结合程序设计、JVM参数配置、垃圾收集机制和内存分析工具等多个方面进行综合分析和处理。理解这些概念并熟练运用,能有效防止和解决Java应用程序中的内存问题。

    Java内存溢出的详细解决方案

    Java内存溢出的详细解决方案 Java内存溢出是指Java虚拟机(JVM)中的内存使用超过了最大限制,导致程序崩溃或无法正常运行的错误。Java内存溢出主要有两种类型:PermGen space和Java heap space。 PermGen space ...

    某应用内存溢出(暨jvm)分析分享

    标题 "某应用内存溢出(暨jvm)分析分享" 提到的是一个关于应用程序,特别是N银行消费信贷backend应用的内存溢出问题及其在Java虚拟机(JVM)层面上的分析。内存溢出是程序运行时由于分配的内存不足导致无法继续执行...

    JAVA内存溢出

    JAVA内存溢出 JAVA中OutOfMemoryError(内存溢出)的三...OutOfMemoryError是Java开发中的一种常见错误,了解JVM的内存管理机制和OutOfMemoryError的三种情况及其解决方法,对于解决Java开发中内存溢出问题非常重要。

    java常见的几种内存溢出和解决方案.docx

    Java 中的内存溢出和解决方案 Java 中的内存溢出是一种常见的错误,可能会导致程序崩溃或hang死。了解 Java 中的内存溢出原因和解决方案是非常重要的。本文将介绍 Java 中的几种常见的内存溢出和解决方案。 1.JVM...

    解决JAVA内存溢出问题

    在探讨如何解决JAVA内存溢出问题时,我们首先需要理解几个关键的概念,...通过上述详细的分析和解释,相信读者已经对如何解决JAVA内存溢出问题有了更全面的理解和掌握,能够更加自信地应对和解决实际开发中的相关挑战。

    JVM内存溢出

    【JVM内存溢出】指的是Java...总的来说,解决JVM内存溢出问题需要深入了解Java内存模型,合理配置JVM参数,并结合性能监控工具进行诊断和优化。这不仅可以避免服务器因内存问题崩溃,还能提升整体系统的稳定性和性能。

    jvm内存溢出

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

    C语言中溢出错误分析和防范.pdf

    《C语言中溢出错误分析和防范》这篇文章探讨了C语言编程中常见的溢出错误及其防范策略。溢出错误是由于程序在分配的内存空间之外写入数据导致的,这通常发生在栈溢出、堆溢出、BSS溢出和格式化串溢出等场景。 1. **...

    Java中堆内存和栈内存详解

    - 栈内存的空间相对较小,当方法中存在大量数据时可能会导致栈溢出错误(StackOverflowError)。 #### 三、堆内存 堆内存主要用于存储通过`new`关键字创建的对象和数组。这是Java程序的主要内存区域之一,所有对象...

    栈溢出攻击技术及实例代码

    栈溢出攻击是一种常见的安全漏洞利用技术,主要针对软件中的缓冲区溢出错误。栈是计算机内存中的一个重要区域,用于存储函数调用时的上下文信息,如返回地址、局部变量等。当程序员未正确处理数据长度,导致向栈中...

Global site tag (gtag.js) - Google Analytics