注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天朝布衣田中码农参上

苦逼码农的点点滴滴,请多多指教!

 
 
 

日志

 
 
 
 

Java出现OutOfMemoryError[内存溢出]错误的情况及解决办法  

2017-03-27 17:53:26|  分类: JAVA |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
Java coder在解决java内存溢出问题之前,需要对Jvm(Java虚拟机)的内存管理有一定的认识。而Jvm管理的内存大致包括三种不同类型的内存区域:
1) Permanent Generation space(永久保存区域),主要存放Class(类)和Meta的信息,Class第一次被Load的时候被放入PermGen space区域,Class需要存储的内容主要包括方法和静态属性。
2) Heap space(堆区域),堆区域用来存放Class的实例(即对象),对象需要存储的内容主要是非静态属性。每次用new创建一个对象实例后,对象实例存储在堆区域中,这部分空间也被jvm的垃圾回收机制管理。
3)Java Stacks(Java栈),而Java栈则保存主要基本类型变量以及方法的输入输出参数。Java程序的每个线程中都有一个独立的堆栈。
那么经过上面的说明后问题就很明显了,容易发生内存溢出问题的就主要在于:1)Permanent Generation space和2)Heap space。
1)针对PermGen space,程序中使用了大量的jar或class,才使java虚拟机装载类的空间不够。解决这类问题就是修改相应的参数:XX:PermSize和XX:MaxPermSize,其中XX:PermSize是初始永久保存区域大小,XX:MaxPermSize是最大永久保存区域大小。
例【这里参数最好自己尝试】:

 -XX:PermSize=64M -XX:MaxPermSize=128M

另外,如果机器上跑很多Java程序的话,最好将lib下的通用的jar放置在JAVA_HOME的lib下面,这样也可以节省一部分资源。
B)针对Heap space,主要出错原因在于java虚拟机创建的对象太多,在进行垃圾回收之间,虚拟机分配的到堆内存空间已经用满了。解决这类问题之前必须要先reviwe code,看是否有死循环或不必要地重复创建大量对象。如果有找到,请修改程序和算法。然后还是同样的招式,修改相应的参数:Xms(初始堆大小)和Xmx(最大堆大小)参数的大小。
【这里参数最好自己尝试】

-Xms256M -Xmx512M

C)针对ava Stacks,最经常遇到的是递归调用时压入Stack Frame,当递归调用太深的时候,就有可能耗尽Stack Space,爆出StackOverflow的错误。Stack Space的大小随着OS,JVM以及环境变量的大小而发生变化。一般说来默认的大小是512K。理论上来说,应该是够了,如果不够的话,请设置-Xss(Stack Space的大小)。
【这里参数最好自己尝试】

-Xss2048k

对了,不要忘记,以上三个参数可以同时设置的,大家可以自行去探索看那个参数数值会比较合适自己的应用。

  评论这张
 
阅读(0)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018