❶ java.lang.OutOfMemoryError: Java heap space内存溢出解决方案
如果你确定不是代码造成的内存泄露,调整jvm虚拟机内存可解决(增大)。
样例:
java -server -Xms4096m -Xmx4096m -XX:PermSize=128m -XX:MaxPermSize=512m -jar ./MssIndexAnalyze.jar
我直接运行的jar包,对tomcat,ide有不同的调整方法。但是参数是通用的。
-Xms4096m -Xmx4096m -XX:PermSize=128m -XX:MaxPermSize=512m
tomcat 设置,$TOMCAT_HOME/bin/catalina.bat:
rem ----- Execute The Requested Command ---------------------------------------
set JAVA_OPTS=%JAVA_OPTS% -server -Xms1024m -Xmx1024m -Xincgc -Xss512k -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=512m
IDE的调整参考以下链接:
〔http://jingyan..com/article/f7ff0bfc73f54f2e26bb138c.html〕
❷ 如何解决JAVA 内存溢出的问题、
可以监控一下你的程序到底是什么原因造成的内存溢出,然后修改导致溢出的程序算法应该可以解决。或者手动执行垃圾回收。使用弱引用类型也可以
❸ Java内存溢出的解决方案都有哪些
内存溢出可能是以下原因:
内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
调用接口超时且超时等待时间设置过长;
集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
代码中存在死循环或循环产生过多重复的对象实体;
启动参数内存值设定的过小;
那么针对的结局方案:
优化数据库查询语句,如改成分页查询;
调用接口超时时间设置短一些,打印错误日志,修正超时的接口;
集合类使用完后设置成null,例:在执行完list之后写上list=null;
使用debug逐步查找死循环的代码
将jvm内存的值增大:-Xms1024m -Xmx1024m -XX:MaxNewSize=1024m -XX:MaxPermSize=1024m (设置的值依据服务器内存的大小来设定)
纯手打,望采纳。
❹ java内存溢出与内存泄漏怎么解决
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of
memory;比如申请了版一个integer,但给权它存了long才能存下的数,那就是内存溢出。
内存泄露 memory
leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
memory leak会最终会导致out of memory!
内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。
内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。一个盘子用尽各种方法只能装4个果子,你装了5个,结果掉倒地上不能吃了。这就是溢出!比方说栈,栈满时再做进栈必定产生空间溢出,叫上溢,栈空时再做退栈也产生空间溢出,称为下溢。就是分配的内存不足以放下数据项序列,称为内存溢出.
❺ Java程序内存溢出怎么修改
for循环里面写:{
addBatch (你的insert语句 )
这里可以控制1万条做一次提交
if(i%10000==0) ps.executeBatch();
//清空batch
ps.clearBatch ()
}
这样就不会频繁调用insert操作数据库,100万也就操作100次提交
❻ java内存溢出的问题如何排查
java程序大家都知道,内存溢出是经常见的错误,下面从基本的开始分析!
内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,造成的内存溢出。如果出现这种现象可行代码排查:
一)是否App中的类中和引用变量过多使用了Static修饰 如public staitc Student s;在类中的属性中使用 static修饰的最好只用基本类型或字符串。如public static int i = 0; //public static String str;
二)是否App中使用了大量的递归或无限递归(递归中用到了大量的建新的对象)
三)是否App中使用了大量循环或死循环(循环中用到了大量的新建的对象)
四)检查App中是否使用了向数据库查询所有记录的方法。即一次性全部查询的方法,如果数据量超过10万多条了,就可能会造成内存溢出。所以在查询时应采用“分页查询”。
五)检查是否有数组,List,Map中存放的是对象的引用而不是对象,因为这些引用会让对应的对象不能被释放。会大量存储在内存中。
六)检查是否使用了“非字面量字符串进行+”的操作。因为String类的内容是不可变的,每次运行"+"就会产生新的对象,如果过多会造成新String对象过多,从而导致JVM没有及时回收而出现内存溢出。
如String s1 = "My name";
String s2 = "is";
String s3 = "xuwei";
String str = s1 + s2 + s3 +.........;这是会容易造成内存溢出的
但是String str = "My name" + " is " + " xuwei" + " nice " + " to " + " meet you"; //但是这种就不会造成内存溢出。因为这是”字面量字符串“,在运行"+"时就会在编译期间运行好。不会按照JVM来执行的。
在使用String,StringBuffer,StringBuilder时,如果是字面量字符串进行"+"时,应选用String性能更好;如果是String类进行"+"时,在不考虑线程安全时,应选用StringBuilder性能更好。
知道原因了,解决起来就非常简单了。
❼ java问题内存溢出
我猜测虽来然内存又跌回了源64M,但是你应该没有OutOfMemoryError的问题了吧.-Xmx的意思只是告诉JRE最大向操作系统申请多少堆内存,并不是一直要占有那么多.如果异常已经没有再出现,那么这个问题并不严重.
❽ java.lang内存溢出怎么解决
Java常见的几种内存溢出及解决方法【情况一】:
java.lang.OutOfMemoryError:Javaheapspace:这种是java堆内存不够,一个原因是真不够(如递归的层数太多等),另一个原因是程序中有死循环;
如果是java堆内存不够的话,可以通过调整JVM下面的配置来解决:
-Xms3062m
-Xmx3062m
【情况二】
java.lang.OutOfMemoryError:GCoverheadlimitexceeded
【解释】:JDK6新增错误类型,当GC为释放很小空间占用大量时间时抛出;一般是因为堆太小,导致异常的原因,没有足够的内存。
【解决方案】:
1、查看系统是否有使用大内存的代码或死循环;
2、通过添加JVM配置,来限制使用内存:
-XX:-UseGCOverheadLimit
【情况三】:
java.lang.OutOfMemoryError:PermGenspace:这种是P区内存不够,可通过调整JVM的配置:
-XX:MaxPermSize=128m
-XXermSize=128m
【注】:
JVM的Perm区主要用于存放Class和Meta信息的,Class在被Loader时就会被放到PermGenspace,这个区域成为年老代,GC在主程序运行期间不会对年老区进行清理,默认是64M大小,当程序需要加载的对象比较多时,超过64M就会报这部分内存溢出了,需要加大内存分配,一般128m足够。
【情况四】:
java.lang.OutOfMemoryError:Directbuffermemory
调整-XX:MaxDirectMemorySize=参数,如添加JVM配置:
-XX:MaxDirectMemorySize=128m
【情况五】:
java.lang.OutOfMemoryError:unabletocreatenewnativethread
【原因】:Stack空间不足以创建额外的线程,要么是创建的线程过多,要么是Stack空间确实小了。
【解决】:由于JVM没有提供参数设置总的stack空间大小,但可以设置单个线程栈的大小;而系统的用户空间一共是3G,除了Text/Data/BSS/MemoryMapping几个段之外,Heap和Stack空间的总量有限,是此消彼长的。因此遇到这个错误,可以通过两个途径解决:1.通过-Xss启动参数减少单个线程栈大小,这样便能开更多线程(当然不能太小,太小会出现StackOverflowError);2.通过-Xms-Xmx两参数减少Heap大小,将内存让给Stack(前提是保证Heap空间够用)。
【情况六】:
java.lang.StackOverflowError
【原因】:这也内存溢出错误的一种,即线程栈的溢出,要么是方法调用层次过多(比如存在无限递归调用),要么是线程栈太小。
【解决】:优化程序设计,减少方法调用层次;调整-Xss参数增加线程栈大小。