`

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

    博客分类:
  • 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

分享到:
评论

相关推荐

    Tomcat内存溢出的三种情况及解决办法分析

    Tomcat内存溢出的三种情况及解决办法分析 Tomcat内存溢出的原因 在生产环境中tomcat内存设置不好很容易出现内存溢出。造成内存原因是不一样的,当然处理方式也不一样。 这里根据平时遇到的情况和相关资料进行一个...

    Java常见内存溢出异常分析

     栈溢出抛出java.lang.StackOverflowError错误,出现此种情况是因为方法运行的时候栈的深度超过了虚拟机容许的大深度所致。  出现这种情况,一般情况下是程序错误所致的,比如写了一个死递归,有可能造成此种...

    BoundsChecker v6.5 (运行时错误检测工具)

    程序员在开发过程中可能会经常遇到这样的问题:调试时语法没有问题,代码也没有错误,但应用程序运行就是不正常甚至死机,其实这有可能是由于逻辑错误引起的内存溢出或资源泄露等问题,这些错误一般是不容易被检测...

    美团和蚂蚁金服面试笔记.pdf

    虚拟机同样会抛出内存溢出的错误。方法区可以理解 为永久区。堆 虚拟机栈局部变量表 运行时常量池 操作数栈主要保存计算过程的中间结果,同时作为计算过程中的变量临时的存储空间 动态连接 方法返回地址 本地方法区 ...

    操作系统(内存管理)

    在对内存块进行了 free 调用之后,我们需要做的是诸如将它们标记为未被使用的等事情,并且,在调用 malloc 时,我们要能够定位未被使用的内存块。因此, malloc 返回的每块内存的起始处首先要有这个结构: 清单 3...

    Android内存泄漏的轻松解决方法

    严重的时候可能会导致内存溢出错误,即 OOM Error 下面我们从基础说起 基础知识 Java 的内存分配简述 方法区(non-heap):编译时就分配好,在程序整个运行期间都存在。它主要存放静态数据和常量; 栈区:当...

    Java虚拟机

    2.4.2 虚拟机栈和本地方法栈溢出 2.4.3 方法区和运行时常量池溢出 2.4.4 本机直接内存溢出 2.5 本章小结 第3章 垃圾收集器与内存分配策略 3.1 概述 3.2 对象已死吗 3.2.1 引用计数算法 3.2.2 可达性分析...

    C语言中的递归函数及其注意

    在C语言中,递归函数的使用需要谨慎,因为如果使用不当,可能会导致栈溢出错误。递归函数必须有一个或多个退出条件,否则函数会无限期地调用自身,最终导致栈溢出。在上述的阶乘例子中,退出条件是n等于0。 在使用...

    binary_vulnerability:二进制突破之栈溢出原理和利用技术,绕过安全保护技术(绕过NX,ASLR,PIE,Canary,RELRO等),格式化串行突破原理是利用技术,大量溢出漏洞原理和利用技术,glibc2 .30内存管理二进制文件深入分析,堆迭扩展(fastbin攻击,UAF,双重释放,堆重叠和扩展攻击,unlink攻击,house系列攻击)突破原理和攻破技巧

    由于本人水平有限,不能避免可能会在文档中出现错误,敬请原谅。 注意: 该项目版权尽属于我个人所有,这包括项目中的文档和源码,你可以下载和查看,该项目涉及的所有文档和代码仅能进行学习交流目的,但不能以下...

    JVM垃圾回收机制(GC)

    引入:我们都知道,栈内存中方法运行完毕后会有弹栈的操作,不会产生垃圾,而堆内存中却没有这种操作,当堆内存中很多无用的成员变量、对象等等积压到一定程度时,就会发生堆内存溢出的一个错误OutOfMemoryError ...

    招银网络java科技笔试题-WaytoInterview:JVM和设计模式和算法的快速浏览

    中,永久代已完全被元空间(Meatspace)所取代,故此处抛出错误和堆内存溢出一样) Design Pattern 各种经典的设计模式以及简单例子 工厂模式 适配器模式 过滤器模式 代理模式 MVC模式 策略模式 Algorithm 剑指Offer上...

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    调优案例分析与实战 / 106 5.1 概述 / 106 5.2 案例分析 / 106 5.2.1 高性能硬件上的程序部署策略 / 106 5.2.2 集群间同步导致的内存溢出 / 109 5.2.3 堆外内存导致的溢出错误 / 110 5.2.4 外部命令导致系统...

    About Exceptions and Exception Handling

    无限递归导致的栈溢出; 向一个较小的缓冲区写入较大块的数据; 类的纯虚函数被调用; 申请内存失败(内存空间不足); 一个非法的参数被传递给C++函数; C运行时库检测到一个错误并且需要...

    C语言嵌入式Linux编程第4期:堆栈管理

    1)程序运行过程中堆栈的内存分布2)栈初始化、大小、栈在函数调用和参数传递过程中的作用3)栈与作用域、栈对形参和实参的管理4)黑客栈溢出攻击原理及实践5)堆内存的维护、嵌入式裸机环境下、ucos、linux环境下堆...

    数据结构习题,以章节为单位,并附有答案

    为了增加内存空间的利用率和减少溢出的可能性,由两个栈共享一片连续的内存空间时,应将两栈的 ( ④)分别设在这片内存空间的两端,这样,当(⑤)时,才产生上溢。 (D C) ①, ②: A. 空 B. 满 C. 上溢 D. 下溢 ③: A. n-...

    深入解析Windows操作系统中文.part2.rar

    深入解析WINDOWS操作...缓冲区溢出和特殊内存池 861 代码改写和系统代码写保护 863 14.8 高级的崩溃转储分析 864 栈破坏 865 挂起的系统或无响应的系统 866 当没有崩溃转储时 869 术语表 871 术语对照表 895 索引 901

    离线OJ判题系统

    评判结果包括:Accepted(测试通过)、Compile Error(编译失败)、Memory Limit Exceed(内存超出限制)、Presentation Error(格式错误)、Runtime Error(运行时错误,可能是数组越界,改写只读的内存...

    精通Windows.API-函数、接口、编程实例.pdf

    5.1.4 虚拟内存布局、内存的分工、堆与栈 127 5.1.5 内存的保护属性和存取权限 127 5.1.6 本章API列表 127 5.2 堆管理 129 5.2.1 获取堆句柄、分配与再分配堆 129 5.2.2 获取堆中内存块的大小信息 133 ...

    精通WindowsAPI 函数 接口 编程实例

    5.1.4 虚拟内存布局、内存的分工、堆与栈 127 5.1.5 内存的保护属性和存取权限 127 5.1.6 本章API列表 127 5.2 堆管理 129 5.2.1 获取堆句柄、分配与再分配堆 129 5.2.2 获取堆中内存块的大小信息 133 ...

Global site tag (gtag.js) - Google Analytics