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

项目组最近在开发中经常会出现一些意想不到的内存溢出问题。下面我就说说我们常见的几种内存溢出吧!
1.JVM Heap(堆)溢出:java.lang.OutOfMemoryError: Java heap space
JVM在启动的时候会自动设置JVM Heap的值, 可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。Heap的大小是Young Generation 和Tenured Generaion 之和。在JVM中如果98%的时间是用于GC,且可用的Heap size 不足2%的时候将抛出此异常信息。
解决方法:手动设置JVM Heap(堆)的大小。
2.PermGen space溢出: java.lang.OutOfMemoryError: PermGen space
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域。为什么会内存溢出,这是由于这块内存主要是被JVM存放Class和Meta信息的,Class在被Load的时候被放入PermGen space区域,它和存放Instance的Heap区域不同,sun的 GC不会在主程序运行期对PermGen space进行清理,所以如果你的APP会载入很多CLASS的话,就很可能出现PermGen space溢出。一般发生在程序的启动阶段。
解决方法: 通过-XX:PermSize和-XX:MaxPermSize设置永久代大小即可。
3.栈溢出: java.lang.StackOverflowError : Thread Stack space
栈溢出了,JVM依然是采用栈式的虚拟机,这个和C和Pascal都是一样的。函数的调用过程都体现在堆栈和退栈上了。调用构造函数的 “层”太多了,以致于把栈区溢出了。 通常来讲,一般栈区远远小于堆区的,因为函数调用过程往往不会多于上千层,而即便每个函数调用需要 1K的空间(这个大约相当于在一个C函数内声明了256个int类型的变量),那么栈区也不过是需要1MB的空间。通常栈的大小是1-2MB的。通俗一点讲就是单线程的程序需要的内存太大了。 通常递归也不要递归的层次过多,很容易溢出。
解决方法:1:修改程序。2:通过 -Xss: 来设置每个线程的Stack大小即可。
4.but has failed to stop it. This is very likely to create a memory leak.
这一般是启动程序时一些定时器或其他正在操作的线程还没有停掉造成的。
解决方法:实现ServletContextListener的监听,在contextDestroyed方法中进行关闭。
5. 所以Server容器启动的时候我们经常关心和设置JVM的几个参数如下:
-Xms:java Heap初始大小, 默认是物理内存的1/64。
-Xmx:ava Heap最大值,不可超过物理内存。
-Xmn:young generation的heap大小,一般设置为Xmx的3、4分之一 。增大年轻代后,将会减小年老代大小,可以根据监控合理设置。
-Xss:每个线程的Stack大小,而最佳值应该是128K,默认值好像是512k。
-XX:PermSize:设定内存的永久保存区初始大小,缺省值为64M。
-XX:MaxPermSize:设定内存的永久保存区最大大小,缺省值为64M。
-XX:SurvivorRatio:Eden区与Survivor区的大小比值,设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10
-XX:+UseParallelGC:F年轻代使用并发收集,而年老代仍旧使用串行收集.
-XX:+UseParNewGC:设置年轻代为并行收集,JDK5.0以上,JVM会根据系统配置自行设置,所无需再设置此值。
-XX:ParallelGCThreads:并行收集器的线程数,值最好配置与处理器数目相等 同样适用于CMS。
-XX:+UseParallelOldGC:年老代垃圾收集方式为并行收集(Parallel Compacting)。
-XX:MaxGCPauseMillis:每次年轻代垃圾回收的最长时间(最大暂停时间),如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。
-XX:+ScavengeBeforeFullGC:Full GC前调用YGC,默认是true。

实例如:JAVA_OPTS=”-Xms4g -Xmx4g -Xmn1024m -XX:PermSize=320M -XX:MaxPermSize=320m -XX:SurvivorRatio=6″

好了就到这里吧!欢迎大家关注我的博客,如有疑问,请加qq群:454796847、135430763 共同进步!

时间: 2024-11-03 11:42:29

java常见的几种内存溢出和解决方案的相关文章

kettle java 内存溢出-java调用kettle导入数据内存溢出!!!!!

问题描述 java调用kettle导入数据内存溢出!!!!! 现在用java调用kettle的ktr模板往数据库中导入数据.kettle版本为4.2.0,oracle版本为11g. 无论jvm设置多大,只要文件数量比较多,内存会一直涨到溢出.调用过程就创建多个ktr对象TranMete,然后放在Trans里面运行. 求大神解决问题. 解决方案 提交数量改小点试试?

位图引起的内存溢出OutOfMemory解决方案

位图引起的内存溢出OutOfMemory解决方案 作者:老帅 一.问题描述:Android下的相机在独自使用时,拍照没有问题,通过我们的代码调用时,也正常,但是更换了不同厂商的平板,ROM由Android4.0变成了Android4.1后,拍照出现了OutOfMemory异常,程序中断退出.如何解决这个问题呢? 二.先看看我们之前所写的代码 1) 调用系统相机(没有怀疑这里出错,代码略) 2)显示图片 mImageView = (ImageView) findViewById(R.id.imag

Java常见内存溢出(OOM)解决方案

1,         程序计数器 一块很小的内存空间,作用是当前线程所执行的字节码的行号指示器. 2,         java栈 与程序计数器一样,java栈(虚拟机栈)也是线程私有的,其生命周期与线程相同.通常存放基本数据类型,对象引用(一个指向对象起始地址的引用指针或一个代表对象的句柄),reeturnAddress类型(指向一条字节码指令的地址) 栈区域有两种异常类型:如果线程请求的栈深度大于虚拟机所允许的深度,将抛StrackOverflowError异常:如果虚拟机栈可以动态扩展(大

Android常见的几种内存泄漏小结

一.背景 最近在项目的版本迭代中,出现了一些内存问题的小插曲,然后自己花了一些时间优化了APP运行时内存大小的问题,特此做个总结,与大家分享. 二.简介 在Android程序开发中,当一个对象已经不需要再使用了,本该被回收时,而另外一个正在使用的对象持有它的引用从而导致它不能被回收,这就导致本该被回收的对象不能被回收而停留在堆内存中,内存泄漏就产生了.内存泄漏有什么影响呢?它是造成应用程序OOM的主要原因之一.由于Android系统为每个应用程序分配的内存有限,当一个应用中产生的内存泄漏比较多时

java.lang.OutOfMemoryError: CG(q0) 内存溢出问题

问题描述 java.lang.OutOfMemoryError: CG(q0) [javelin/java/JavaScope._resolve([Ljavelin/java/ast/NameNode;II)Ljava/lang/Object;] JVM@cgFail (src/jvm/code/codemanagerat javelin.java.JavaScope.resolve(JavaScope.java:1454)at javelin.java.JavaScope.resolveTyp

java BufferedImage加载图片内存溢出

问题描述 有个需求是生成一张1700*2338像素的图片并在图片上添加文字,大小大概是160k左右,单独在main方法里面用java.awt.image.BufferedImage类生成图片是没问题的,但是在web后台一调用BufferedImage的构造方法就报java.lang.OutOfMemoryError:Javaheapspace,内存溢出,代码如下:intwidth=1700;intheight=2338;BufferedImagebuffImage=newBufferedImag

内存溢出的解决方案

      最近做新闻客户端的时候在加载ListView的大图时会发生内存溢出的问题.内存溢出(OOM).为了便于理解,我们不妨打个比方.缓冲区溢出好比是将十磅的糖放进一个只能装五磅的容器里.一旦该容器放满了,余下的部分就溢出在柜台和地板上,弄得一团糟.由于计算机程序的编写者写了一些编码,但是这些编码没有对目的区域或缓冲区--五磅的容器--做适当的检查,看它们是否够大,能否完全装入新的内容--十磅的糖,结果可能造成缓冲区溢出的产生.如果打算被放进新地方的数据不适合,溢得到处都是,该数据也会制造很

JVM内存区域与内存溢出异常

Java虚拟机在执行java程序时会把它所管理的内存会分为若干个不同的数据区域,不同的区域在内存不足时会抛出不同的异常. >>运行时数据区域的划分 (1)程序计数器 程序计数器(Program Counter Register)是一块比较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器: PCR为线程私有内存,程序计数器是唯一一个在Java虚拟机规范中没有规定任何OOM情况的区域. (2)方法区方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已

Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结(转)

java.lang.OutOfMemoryError这个错误我相信大部分开发人员都有遇到过,产生该错误的原因大都出于以下原因:JVM内存过小.程序不严密,产生了过多的垃圾. 导致OutOfMemoryError异常的常见原因有以下几种: 内存中加载的数据量过于庞大,如一次从数据库取出过多数据: 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收: 代码中存在死循环或循环产生过多重复的对象实体: 使用的第三方软件中的BUG: 启动参数内存值设定的过小: 此错误常见的错误提示: tomcat