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 太多的对像,会导致内存不足吗,怎么解决??
可以自己在后面写stu=null;
不过一般不会那么容易溢出的 参考技术D 不会。
java有自动垃圾回收机制。会自动回收不再使用的对象。
以上是关于java内存溢出怎么解决?的主要内容,如果未能解决你的问题,请参考以下文章
JAVA 声明new 过多临时对像会导致内存溢出,怎么解决?