基于java的程序OutOfMemory问题的解决及Xms/Xmx/Xss的解释和应用

来源:互联网 发布:反智 知乎 编辑:程序博客网 时间:2024/05/21 06:46

长期以来一直都是做java应用的开发,所使用的开发工具基本上也都是基于java的,经常用的有eclipse, netbeans, ant, maven, cruisecontrol, tomcat, findbugs等。在使用这些工具的时候,有时候会碰到OutOfMemory的问题。

 

问题


一般在遇到这个问题的时候,我们的第一印象是:一定是机器的内存不够用了。

可是通过进程管理器查看,物理内存都还有好多空余呢,根本就没有被占满。

 

那这又是什么原因呢?

直接原因是:在启动某个基于java的程序时,同时会设置一些参数以限制这个程序对内存的使用(如果不人工设置的话,也会有默认的设置),那么java虚拟机在启动并运行这个程序的时候,就会按照设定的内存大小来运行,而当程序运行时需要更大内存的话,就可能会抛出异常。比如说,启动时我设置某程序最大使用100M内存,那么,当这个程序需要使用100M以上内存时,就会抛出OutOfMemory的异常。

 

 

具体解释


具体如下,在使用命令java和javaw时,命令行格式如下,其中"argument"部分就可以设置一些参数。
    java [ options ] class [ argument ... ]
    java [ options ] -jar file.jar [ argument ... ]
    javaw [ options ] class [ argument ... ]
    javaw [ options ] -jar file.jar [ argument ... ]

这里,跟内存使用相关的参数主要有三个:Xmx, Xms,Xss。

参考资料2中提供了这三个参数的相关说明。


-Xmsn
Specify the initial size, in bytes, of the memory allocation pool. This value must be a multiple of 1024 greater than 1MB. Append the letter k or K to indicate kilobytes, or m or M to indicate megabytes. The default value is chosen at runtime based on system configuration. For more information, see HotSpot Ergonomics
Examples:
       -Xms6291456
       -Xms6144k
       -Xms6m
      
-Xmxn
Specify the maximum size, in bytes, of the memory allocation pool. This value must a multiple of 1024 greater than 2MB. Append the letter k or K to indicate kilobytes, or m or M to indicate megabytes. The default value is chosen at runtime based on system configuration. For more information, see HotSpot Ergonomics
Examples:
       -Xmx83886080
       -Xmx81920k
       -Xmx80m

-Xssn
Set thread stack size.

 

 

简单的总结一下。

Xms是指设定程序启动时占用内存大小。一般来讲,大点,程序会启动的快一点,但是也可能会导致机器暂时间变慢。

Xmx是指设定程序运行期间最大可占用的内存大小。如果程序运行需要占用更多的内存,超出了这个设置值,就会抛出OutOfMemory异常。

Xss是指设定每个线程的堆栈大小。这个就要依据你的程序,看一个线程大约需要占用多少内存,可能会有多少线程同时运行等。

以上三个参数的设置都是默认以Byte为单位的,也可以在数字后面添加[k/K]或者[m/M]来表示KB或者MB。而且,超过机器本身的内存大小也是不可以的,否则就等着机器变慢而不是程序变慢了。

 

因此,对于一般的java应用程序来讲,我们只要把前两个参数设置合适基本上就可以了。第三个参数还是需要有很强的

 

各应用程序的设置方法


1. 自开发的应用程序

  我们启动时是以命令行方式启动,那么在命令行中加入Xms和Xmx即可。

  Sample: java -jar test.jar -Xms32m -Xmx512m

 

2. eclipse

  用文本编辑软件打开eclipse根目录下的eclipse.ini文件,修改里面的Xms和Xmx的值。

 

3. maven

  有两种方法。

  1). 用文本编辑软件打开%MAVEN_HOME%/bin下的mvn.bat文件(unix/linux为mvn),里面有一行设置MAVEN_OPTS的注释行,在maven 2.0.5中内容如下:

  @REM set MAVEN_OPTS=-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000

我们只要在这行下面添加下面的一行即可。

  set MAVEN-OPTS=-Xms32m -Xmx512m

 

  2). 因为我们是使用命令行来调用maven的,所以可以在调用mvn之前,先执行上面那一行,这也是可以的。

 

4. ant, findbugs, cruisecontrol等程序的设置方法和maven是类似的。

    ant有ANT_OPTS, findbugs有jvmargs, cruisecontrol有CC_OPTS。

 

5. 有些程序是在别的GUI程序中启动的,比如说在eclipse中启动web服务器(tomcat等)。类似于这样的启动方式,我们一般可以在宿主程序(本例中为eclipse)中的某个设置画面上找到关于启动参数的设置的。

 

参考资料


1. http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/java.html
2. http://java.sun.com/javase/6/docs/technotes/tools/windows/java.html

3. http://java.sun.com/javase/6/docs/technotes/guides/vm/gc-ergonomics.html

4. JVM调优总结 -Xms -Xmx -Xmn -Xss

 

原创粉丝点击