`
tomcat_oracle
  • 浏览: 311474 次
社区版块
存档分类
最新评论

关于java堆内存溢出的几种情况

    博客分类:
  • Java
阅读更多
【情况一】:
  java.lang.OutOfMemoryError: Java heap space:这种是java堆内存不够,一个原因是真不够,另一个原因是程序中有死循环;
  如果是java堆内存不够的话,可以通过调整JVM下面的配置来解决:
  <jvm-arg>-Xms3062m</jvm-arg>
  <jvm-arg>-Xmx3062m</jvm-arg>
  【情况二】
  java.lang.OutOfMemoryError: GC overhead limit exceeded
  【解释】:JDK6新增错误类型,当GC为释放很小空间占用大量时间时抛出;一般是因为堆太小,导致异常的原因,没有足够的内存。
  【解决方案】:
  1、查看系统是否有使用大内存的代码或死循环;
  2、通过添加JVM配置,来限制使用内存:
  <jvm-arg>-XX:-UseGCOverheadLimit</jvm-arg>
  【情况三】:
  java.lang.OutOfMemoryError: PermGen space:这种是P区内存不够,可通过调整JVM的配置:
  <jvm-arg>-XX:MaxPermSize=128m</jvm-arg>
  <jvm-arg>-XXermSize=128m</jvm-arg>
  【注】:
  JVM的Perm区主要用于存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space,这个区域成为年老代,GC在主程序运行期间不会对年老区进行清理,默认是64M大小,当程序需要加载的对象比较多时,超过64M就会报这部分内存溢出了,需要加大内存分配,一般128m足够。
  【情况四】:
  java.lang.OutOfMemoryError: Direct buffer memory
  调整-XX:MaxDirectMemorySize= 参数,如添加JVM配置:
  <jvm-arg>-XX:MaxDirectMemorySize=128m</jvm-arg>
  【情况五】:
  java.lang.OutOfMemoryError: unable to create new native thread
  【原因】:Stack空间不足以创建额外的线程,要么是创建的线程过多,要么是Stack空间确实小了。
  【解决】:由于JVM没有提供参数设置总的stack空间大小,但可以设置单个线程栈的大小;而系统的用户空间一共是3G,除了Text/Data/BSS /MemoryMapping几个段之外,Heap和Stack空间的总量有限,是此消彼长的。因此遇到这个错误,可以通过两个途径解决:1.通过 -Xss启动参数减少单个线程栈大小,这样便能开更多线程(当然不能太小,太小会出现StackOverflowError);2.通过-Xms -Xmx 两参数减少Heap大小,将内存让给Stack(前提是保证Heap空间够用)。
  【情况六】:
  java.lang.StackOverflowError
  【原因】:这也内存溢出错误的一种,即线程栈的溢出,要么是方法调用层次过多(比如存在无限递归调用),要么是线程栈太小。
  【解决】:优化程序设计,减少方法调用层次;调整-Xss参数增加线程栈大小。
4
1
分享到:
评论
2 楼 frank1234 2015-02-28  
另外JVM的Perm区也是可以被回收的,Perm区满也是导致Full GC的一个原因,可以加上参数-XX:+TraceClassUnloading查看class的回收情况,只是回收的条件非常严格,得加载class的classloader下所有的class实例都没有引用时才可以被回收。
另外默认值都是跟jdk的版本 、32还是64位、client模式还是server模式、以及机器的硬件情况相关联的,不可以一概而论。
1 楼 cs6641468 2015-02-27  
Perm Gen可不叫年老代,而是永久代。 它还有一个逻辑概念,可以称为"方法区"。 在JDK1.8中Perm Gen已经去掉,取而代之的是本地内存Metaspace。

真正的年老代是属于Heap的一部分,FullGC的时候也是会回收年老代内存的。

相关推荐

    解决Java程序内存溢出的办法

    解决Java程序内存溢出的几种办法和处理问题的一些经验

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

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

    java poi 导入大数据量Excel数据 防止内存溢出处理.zip

    java 使用 poi 解析导入大数据量(几万数据量+)时,报出OOM。这是使用POI 第二种处理方法,解决大数据量导入内存溢出问题,并提升效率

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

    Tomcat内存溢出的三种情况及解决办法分析 Tomcat内存溢出的原因 在生产环境中tomcat内存设置不好很容易出现内存溢出。... 以上就是针对Tomcat内存溢出的几种解决方案。本文来自George的博客:《tomcat内存溢出总结》

    Java内存溢出及分析

     java内存有几种:程序计数器,虚拟机栈,方法常量区,堆,本地方法栈,直接内存。既然分析内存溢出,那从这几种内存逐一分析。  1,程序计数器:是一个较小的内存空间,是但钱线程的字节码行号指示器,这个不会...

    详解Java内存溢出的几种情况

    主要介绍了详解Java内存溢出的几种情况,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    java内存机制及异常处理

    描述java内存回收机制,异常出现原因,解决方案

    java堆栈的区别 -- 详解

    一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放,...

    JAVA面试题最全集

    76.EJB有哪几种?区别是什么? 77.JavaBean与EJB有什么区别? 78.软件开发生命周期有哪几个阶段? 79.软件开发有哪些因素? 80.软件开发中如何进行版本控制? 81.UML中,类视图如何表示类中的继承与聚合? 82.客户端...

    java 面试题 总结

    比如说内存溢出。不可能指望程序能处理这样的情况。 exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。 16、同步和异步有何异同,在什么情况下分别使用他们?举例说明。 ...

    2013java面试题搜集

    24、java会出现内存溢出的问题吗?? 25、说出几个你遇到过的异常 26、说一下spring有什么好处?? 27、linux杀死进程的方式: 28、linux中查看当前线程的方式: 29、说出jdbc的具体实现步骤: 30、 你...

    高级开发jvm面试题和答案.pdf

    面试高级开发的期间整理的面试题目,记录我面试遇到过的jvm题目以及答案,比较常见的虚拟机面试题目 虚拟机内存 jvm jvm内存结构; 栈的顺序:先进后出,栈中方法的顺序 ...有几种垃圾回收器; 描述一下CMS和G1的异同;

    游戏画面就弹出内存不能为read修复工具

    解决方法:Win XP的“预读取”技术这种最佳化技术也被用到了应用程序上,系统对每一个应用程序的前几次启动情况进行分析,然后新增一个描述套用需求的虚拟“内存映像”,并把这些信息储存到WindowsPrefetch文件夹。...

    操作系统(内存管理)

    然后,当通过 free() 将该指针传递回来时,我们只需要倒退几个内存字节就可以再次找到这个结构。 在讨论分配内存之前,我们将先讨论释放,因为它更简单。为了释放内存,我们必须要做的惟一一件事情就是,获得我们...

    java面试题

    答:运行时异常时(JVM)java虚拟机在运行过程中发生的问题,比如:内存溢出等问题。这类异常没法要求程序员去一一捕获并抛出,一般异常是Java类库或程序员自己写的代码发生的错误,这类异常可以由我们去一一捕获并...

    超级有影响力霸气的Java面试题大全文档

    比如说内存溢出。不可能指望程序能处理这样的情况。 exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。 19、同步和异步有何异同,在什么情况下分别使用他们?举例说明。 ...

    涵盖了90%以上的面试题

    数组初始化的方式有哪几种 length属性和length()方法有什么区别 finally块中的代码什么时候被执行 Java中的异常处理机制的简单原理和应用。 java socket java序列化 JVM加载class文件的原理 双亲委派模型 为什么要...

    Java虚拟机筑地篇之垃圾收集算法

    上一篇介绍了Java虚拟机的运行时内存区域,接下来将来学习下几种常见的垃圾收集算法,进入正题。 概述 在早期,人们就在思考GC(Garbage Collection,GC)需要完成的三件事: 哪些内存需要回收? 什么时候回收? ...

    JAVA性能调优 – 概述

    性能低的几个直观表现(4个) 执行速度慢 内存消耗过多,甚至溢出 启动时间太长 负载承受差,当系统压力上升的时候,系统的执行速度、响应时间急速下降 评价性能高低的指标(6个) ...几种软件优化的

Global site tag (gtag.js) - Google Analytics