微信号:javalearns

介绍:Java学习网免费提供java语言学习知识分享,我们的宗旨是"免费学习Java,成就人生梦想"!

今天说说烦人的Java内存溢出问题

2017-10-13 08:27 javalearns

Java学习网(www.javalearns.com)提拱       

作为一个开发人员最不想看到的就是BUG,可见性的问题可能还不是最关键的,至少我们可以找到问题,很快解决,一般BUG也不会重复出现;但今天要学习的内存溢出就不一样的,很难从根本上解决;因它与各方面的环境有关系,比如计算机内存过低、代码写的不健壮、运行内存设置不合理等等。

网络配图

常见的Java内存溢出类型,你知道哪些?

下面列出开发和运行过程中3种常见的内存溢出类型:

1、java.lang.OutOfMemoryError: PermGen space

通常Java虚拟机(JVM)管理着类内存,堆和非堆。堆是给开发人员使用的,只有在JVM启动时才会创建;非堆则是JVM留给自己使用的,用来放类的信息;非堆在运行生命周期内GC(垃圾收集,回收)是不会主动释放空间。如果我们开发的应用程序代码量很大或用到的第三方Jar包量比较大,而Tomcat的MaxPermSize设置不合理,这时就很可能报这个错误,当然这不一定是马上呈现出来,可能一天、二天或多少天后,你发现程序无法访问,到服务器一看就是这个错在做怪。

2、java.lang.OutOfMemoryError: Java heap space

这种内存是这们开发中最常见的错误之一,产生的主要原因是:

(1)、本身设置的内存参数过小(Xms/Xmx,NewSize/MaxNewSize);

(2)、程序自身的问题。Heap space的默认空间(-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4,这是个通用标准,我们可以根据系统环境进行重新设置;如果我们系统的内存剩余不到40%,JVM就会增大Xmx设置的值,内存剩余超过70%,JVM就会减少Xms设置的值。因此服务器的Xmx和Xms设置的值一般应该是相同的,这样可以有效避免每次GC(回收)后都要调整虚拟机堆的大小。需要注意的是设置的值不能超过物理内存或操作系统的最大限制,这样会导致起服务器无法启动。

网络配图

3、java.lang.OutOfMemoryError: c heap space

系统对于C Heap没有任何限制,所以C Heap发生时,java进程所占用的内存会不断增长,直到死机,唯一的解决方法就是杀掉进程或重启计算机。

网络配图

我们学习的目的是要解决问题,下面看看怎么避免以上错误的发生。

以下是我总结的6种解决方案,如果不全,大家补充一下:

1、写代码时尽早释放无用对象的引用。好的办法是使用临时变量的时候,让引用变量在使用完成后,自动设置为null;

2、我们在程序中涉及字符串处理时,尽理不要使用String,应该使用StringBuffer;

3、尽可能少用静态变量,因为静态变量是全局性的,GC不会主动回收;

4、不要集中创建对象尤其是大对象;

5、尽量运用对象池技术以提高系统性能;

6、不要在经常调用的方法中创建对象。

小伙伴们有什么不同看法,可以提哦!!!

请↙↙↙点击阅读原文” ….

 
Java学习网 更多文章 通常Java开发人员如何进行数据排序? 困扰开发人员的八大代码异常问题 从实践中探索出的软件开发方法 不要浪费时间写完美代码 3个小故事彻底激发你的商业思维
猜您喜欢 中国黑帽网论坛调整 [技术管理] 如果可以,请打造一支精而强的技术团队 设计师为何要保持阅读 回顾每年的不可能任务 朋友,我不介意你赚我的钱