java内存溢出的有关问题解决

java内存溢出的问题解决
    今天解决一个java.lang.OutOfMemoryError的问题。写写自己的解决路径,如何排查的。以及最终的总结。
    问题原因  业务庞大,逻辑复杂,尽量减少全局变量的引用,让程序使用完变量的时候释放该引用能够让垃圾回收器回收,释放资源。[首先,然后,]
二就是物理解决,增大物理内存,然后通过:-Xms256m -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m的修改【此修改是有可能方法中和对象中临时对象较多导致一调用就出此错误,正常跑了很久后才出java.lang.OutOfMemoryError都不是此能解决,除非调节到很高但是当数据量加大后还是会出现错误】
    

     首先:如果频繁使用的方法中,过多String字符串的拼接是很耗费内存的【建议改为使用StringBuffer】,当你启动线程或者循环次数较多的调用此方法时候。就会出现 堆栈 已满。抛出异常:java.lang.OutOfMemoryError.....为什么会这样:此问题貌似String 和StringBuffer的区别。简单的说:String存储是改变’栈‘的指向。并没有马上生成一块新的堆存储新的字符串。

    
    然后:找寻方法中的新的对象的生命周期很重要。我在本方法还没结束去调用其他方法没有把用完的对象置为null。就进行调用其他方法。那么本方法中对象生命还是存在的也就是临时对象xxx=都会是保持的。不会被内存回收。查找代码中是否有此问题。
比如:

public void test(){
     List list=news ArrayList<TabNewsPart>();
     ...这里为list对象中赋予很多的对象TabNewsPart
     if(条件){
          test();
      }
}

如上:如此上list对象每次都很多很多对象进去,暂用内存但是又没结束跳出方法,导致每次加载list对象一直存在没有回收出现内存溢出。


    其次在spring管理的机制里面。每个对象在spring容器管理的。对象中初始news的对象。如:
private List list=news ArrayList<TabNewsPart>();

此类对象都会保存同对象的生命周期同等的。当你在一个serviceImpl对象中定义此类对象。并在一个线程或者循环次数多的循环中,频繁的使用就会导致内存溢出。
java.lang.OutOfMemoryError

总结:
其实出现内存溢出的都是由于某些对象设置的生命周期问题。导致在调用的时候进入了递归调用,而其中的某一些对象一直存在使的内存满了,出现内存溢出

个人理解,仅供参考 呵呵!
第一次写这个,表述不清楚的!见谅!