JVM调优并解决OutOfMemoryError,StackOverflowError

  JVM 调优,首先应从内存开始,尤为是在真正的的web服务部署的时候。由于真正的web服务会比开发的时候花费更多的内存,用来处理多用户并发的状况。本人屡次吃过这方面的亏,因此整理一下,但愿能给别人以帮助。java

 

       这个年头变啦,内存变得如大白菜,每一个新装的机器都2G以上的内存,甚至4G,也不是什么新闻。而软件‘吃’内存的状况则变化不大(除了VIsta)。但 JAVA诞生的时候可不是这样——95年,想来当年97年,64M的内存还要500元,因此JVM初始化对内存的要不能太大,并且也要考虑老机器的状况,毕竟如今JRE基本跑在每一个人的机器上。可是JVM初始占用还停留在几年前的状况下,确实没有跟上软件和硬件的发展。而像Tomcat, JBoss, Eclipse(尤为安上MyEclipse插件后),也考虑到每台机器的内存状况,因此初始话定义都很低,常常会抛内存溢出Bugweb

 

    好,言归正传。咱们先从解决bug开始,当Java程序申请内存,超出VM可分配内纯的时候,VM首先可能会GC,若是GC完仍是不够,或者申请的直接超够VM可能有的,就会抛出内存溢出异常。从VM规范中咱们能够获得,一下几种异常。安全

 

     java.lang.StackOverflowError:(不多)服务器

     java.lang.OutOfMemoryErrorheap space(比较常见)并发

     java.lang.OutOfMemoryError: PermGen space (常常出现)框架

 

   如下分别解释一下,从最多见的开始:spa

 

       java.lang.OutOfMemoryError: PermGen space 这个异常比较常见,是说JVM里的Perm内存区的异常溢出,因为JVM在默认的状况下,Perm默认为64M,而不少程序须要大量的Perm区内存,尤为使用到像Spring等框架的时候,因为须要使用到动态生成类,而这些类不能被GC自动释放,因此致使OutOfMemoryError: PermGen space异常。解决方法很简单,增大JVM-XX:MaxPermSize 启动参数,就能够解决这个问题,如过使用的是默认变量一般是64M[5.0 and newer: 64 bit VMs are scaled 30% larger; 1.4 amd64: 96m; 1.3.1 -client: 32m.],改为128M就能够了,-XX:MaxPermSize=128m。若是已是128mEclipse已是128m了),就改为 256m。我通常在服务器上为安全起见,改为256m插件

 

     java.lang.OutOfMemoryErrorheap space或 其它OutOfMemoryError,这个异常实际上跟上面的异常是一个异常,但解决方法不一样,因此分开来写。上面那个异常是由于JVMperm区内存区分少了引发的(JVM的内存区分为 young,old,perm三种)。而这个异常是由于JVM堆内存或者说整体分少了。解决方法是更改 -Xms -Xmx 启动参数,一般是扩大1倍。xms是管理启动时最小内存量的,xmx是管里JVM最大的内存量的。线程

    注:OutOfMemoryError可能有不少种缘由,根据JVM Specification, 可能有一下几种状况,我先简单列出。stackstack分区不能动态扩展,或不足以生成新的线程。Heap:须要更多的内存,而不能得到。Method Area :若是不能知足分配需求。runtime constant pool(Method Area分配内存)不足以建立class or interfacenative method stacks不可以动态扩展,或生成新的本地线程。ip

 

    最后说说java.lang.StackOverflowError,老实说这个异常我也没遇见过,但JVM Specification就提一下,规范上说有一下几种境况可能抛出这个异常,一个是Stacks里的线程超过容许的时候,另外一个是当native method要求更大的内存,而超过native method容许的内存的时候。根据SUN的文档,提升-XX:ThreadStackSize=512的值。

 

    总的来讲调优JVM的内存,组要目的就是在使用内存尽量小的,使程序运行正常,不抛出内纯溢出的bug。并且要调好最小内存,最大内存的比,避免GC时浪费太多时间,尤为是要尽可能避免FULL GC

相关文章
相关标签/搜索