java内存溢出怎么解决?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java内存溢出怎么解决?相关的知识,希望对你有一定的参考价值。

如果线上内存溢出了,应该怎么着手查找问题,一般哪些情况下会出

第一对所有的代码包括页面中的java代码都进行一遍彻底的回顾检查,
1.对那些静态(static)的对象要特别留神,特别是类型为Map,List,Set的,静态的变量会一直驻存在内存中,生命周期比较长,不会被垃圾器回收。
2.对于代码,要审查是否生成了大量的冗余的对象,还有一些逻辑业务处理的类,
算法是否过于复杂,调整算法,对于代码认真审查,再仔细重构一遍代码,能提高代码质量,提高程序运行稳定性。

3.Java中的内存溢出大都是因为栈中的变量太多了。其实内存有的是。建议不用的尽量设成null以便回收,多用局部变量,少用成员变量。

1),变量所包含的对象体积较大,占用内存较多。
2),变量所包含的对象生命周期较长。
3),变量所包含的对象数据稳定。
4),该类的对象实例有对该变量所包含的对象的共享需求。
4.在我的程序中对静态变量的优化后,使程序占用内存量至少提升了5k-10k。所以也不容忽视。

第二还有就是String类相关的东西:
1.字符串累加的时候一定要用StringBuffer的append方法,不要使用+操作符连接两个字符串。差别很大。而且在循环或某些重复执行的动作中不要去创建String对象,因为String对象是要用StringBuffer对象来处理的,一个String对象应该是产生了 3个对象(大概是这样:))。
2.字符串length()方法来取得字符串长度的时候不要把length放到循环中,可以在循环外面对其取值。(包括vector的size方法)。特别是循环次数多的时候,尽量把length放到循环外面。
int size = xmlVector.size();
for (int i = 2; i < size; i++)
。。。

3 写代码的时候处理内存溢出
try
//do sth
....
catch (outofmemoryerror e)//可以用一个共通函数来执行.
system.out.print (“no memory! ”);
system.gc();
//do sth again
....
4.对于频繁申请内存和释放内存的操作,还是自己控制一下比较好,但是System.gc()的方法不一定适用,最好使用finallize强制执行或者写自己的finallize方法。 Java 中并不保证每次调用该方法就一定能够启动垃圾收集,它只不过会向JVM发出这样一个申请,到底是否真正执行垃圾收集,一切都是个未知数。
参考技术A 1、看看是否虚拟机内存配置过小?实际数据超过虚拟机内内存配置,则应该增大内存
2、检查代码,代码是否有循环创建对象,或者创建的对象一直占用内存追问

1,只是增大内存,没有去找原因
2,几十万行代码如何定位

追答

把虚拟机内存溢出的快照拷贝出来分析定位

参考技术B 在程序启动时,设置-Xms和-Xmx参数。将这两个参数的值设置大一些。如果参数值过大,JDK不支持的话,需要使用更高版本的JDK。 参考技术C 内存溢出看报错是栈溢出还是堆溢出。。。
一般是因为死循环或者线程,数据库连接一类的没清。

JAVA 声明new 过多临时对像会导致内存溢出,怎么解决?

比如
List list = new ArrayList();
for(int i=0;i<1000;i++)
Stu stu = new Stu();
stu.setName("XXX");
list.add(stu);

类似这样的代码, new 太多的对像,会导致内存不足吗,怎么解决??

要看你设置的jvm的运行内存了。如果足够大就不会,如果小了就会的! 参考技术A 我觉得应该把Stu stu 放到循环外面,那么每次实例化同一个stu。当你第二次new的时候,stu就取消了对第一次的引用。那么很可能就会被回收掉了。否则你每次都是一个新的stu。每一个引用都存在,系统就会以为你还会使用,所以不会回收。就好比一对多和多个一对一的关系,前面只有一个对象被引用,其余的都可能回收,而后面是每个对象都被引用,所以不会回收,不知道解释的对不对,个人理解。本回答被提问者采纳 参考技术B 以现在机器配置来说,1000是没什么压力的。如果list长度达到百万级,并且对象类型比较复杂的话,堆溢出就很常见了。一般来说造成如果可能造成内存溢出,那么代码一定不合理,仔细考虑一下是不是一定要把上百万的数据量集中到一起处理,最好是分段进行,处理一部分就清空一次内存,这样就不会内存溢出了 参考技术C java有垃圾回收机制
可以自己在后面写stu=null;
不过一般不会那么容易溢出的
参考技术D 不会。
java有自动垃圾回收机制。会自动回收不再使用的对象。

以上是关于java内存溢出怎么解决?的主要内容,如果未能解决你的问题,请参考以下文章

java栈内存溢出怎么解决

在java中上传文件出现内存溢出怎么解决

内存溢出

JAVA 声明new 过多临时对像会导致内存溢出,怎么解决?

你好,java 向数据库添加大量数据时内存溢出 在不改变内存的情况下如何解决? 你当时是怎么解决的

tomcat编译内存溢出怎么解决