剖析java.lang.OutOfMemoryError: Java heap space产生原因及解决方法

解释:


   JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置。JVM在启动的时候会自动设置Heapsize的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。


   可以利用JVM提供的-Xmn-Xms-Xmx等选项可进行设置。Heapsize的大小是YoungGeneration和TenuredGeneraion之和。在JVM中如果98%的时间是用于GC且可用的Heapsize不足2%的时候将抛出此异常信息。


    提示:


   HeapSize最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。JVM中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。我在WindowsServer2003系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m。
   

  参数汇总


  -Xms:表示java虚拟机堆区内存初始内存分配的大小,通常为操作系统可用内存的1/64大小即可,但仍需按照实际情况进行分配。有可能真的按照这样的一个规则分配时,设计出的软件还没有能够运行得起来就挂了。-Xmx:表示java虚拟机堆区内存可被分配的最大上限,通常为操作系统可用内存的1/4大小。但是开发过程中,通常会将-Xms与-Xmx两个参数的配置相同的值,其目的是为了能够在java垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小而浪费资源。


 一般来讲对于堆区的内存分配只需要对上述-Xms和-Xmx两个参数进行合理配置即可,但是如果想要进行更加精细的分配还可以对堆区内存进一步的细化,那就要用到下面的三个参数了-XX:newSize、-XX:MaxnewSize、-Xmn。当然这源于对堆区的进一步细化分:新生代、中生代、老生代。java中每新new一个对象所占用的内存空间就是新生代的空间,当java垃圾回收机制对堆区进行资源回收后,那些新生代中没有被回收的资源将被转移到中生代,中生代的被转移到老生代。而接下来要讲述的三个参数是用来控制新生代内存大小的.


-XX:newSize:表示新生代初始内存的大小,应该小于-Xms的值;
-XX:MaxnewSize:表示新生代可被分配的内存的最大上限;当然这个值应该小于-Xmx的值;

-Xmn:至于这个参数则是对-XX:newSize、-XX:MaxnewSize两个参数的同时配置,也就是说如果通过-Xmn来配置新生代的内存大小,那么-XX:newSize=- XX:MaxnewSize=-Xmn,虽然会很方便,但需要注意的是这个参数是在JDK1.4版本以后才使用的


上面所述即为java虚拟机对外提供的可配置堆区的参数,接下来讲述java虚拟机对非堆区内存配置的两个参数:
-XX:PermSize:表示非堆区初始内存分配大小,其缩写为permanentsize(持久化内存)-XX:MaxPermSize:表示对非堆区分配的内存的最大上限。


各种运行环境解决方案


手动设置Heapsize


Linux平台


修改TOMCAT_HOME/bin/catalina.sh,在“cygwin=false”上一行加入如下参数:JAVA_OPTS="-Xms512m-Xmx512m-XX:PermSize=128m-XX:MaxPermSize=256m"
Windows平台Tomcat安装版第一种方式:
打开注册表(命令:regedit),修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\ApacheSoftwareFoundation\TomcatServiceManager\Tomcat6\Parameters\Java\Options

在后面加上:-Xms512m-Xmx512m     XX:PermSize=128m-XX:MaxPermSize=256m   -Dcom.sun.management.jmxremote=true


第二种方式:
点击应用“Tomcat6w.exe”,找到“Java”标签,在“JavaOptions”添加以上参数


Windows平台Tomcat解压版


在文件catalina.bat文件中的第一行添加如下:
setJAVA_OPTS=-Xms512m-Xmx512m-XX:MaxNewSize=256m-XX:MaxPermSize=256m

你可能感兴趣的:(jvm,heap,space)