前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >今天说说烦人的Java内存溢出问题

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

作者头像
用户1289394
发布2018-02-27 14:45:35
9840
发布2018-02-27 14:45:35
举报
文章被收录于专栏:Java学习网

作为一个开发人员最不想看到的就是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、不要在经常调用的方法中创建对象。 小伙伴们有什么不同看法,可以提哦!!!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java学习网 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档