长期以来一直都是做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
发表于 @ 2009年11月11日 18:08:00 | 评论( 0 ) | 编辑| 举报| 收藏
旧一篇:类图图解重写和重载的区别 | 新一篇:Javascript Best Practices —— 14条Javascript最佳实践
查看最新精华文章 请访问博客首页相关文章
某游戏公司的面试题argument passing in javaJava编程语言和Java指南中关于Java的参数传递的解释修改resin之memory optionsJAVA -Xms与-Xmx区别Solaris内存监控OsCache配置tomcat的上传限制
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/superbeck/archive/2009/11/11/4799407.aspx
分享到:
相关推荐
通过深入学习JVM,我们可以优化程序性能、解决内存泄漏问题,以及更好地理解和调试Java应用。 首先,我们要了解JVM的基本结构。JVM主要包括类装载器、运行时数据区、执行引擎、本地方法接口和本地方法库。类装载器...
Java中的“内存不足OOM (Out Of Memory):java.lang.OutOfMemoryError”是一个常见的运行时错误,它表示Java虚拟机(JVM)在尝试分配新的对象或数据结构时,发现系统内存不足以完成此操作。这个问题通常发生在程序...
在Java程序运行过程中,最常见的两类内存溢出问题是堆内存溢出(Out of Memory: Heap Space)和 PermGen/Metaspace 溢出。堆内存溢出通常由于对象创建过多,导致堆空间不足以容纳所有对象。解决方法包括增大堆内存、...
在命令行启动Java应用时,可以设置`JAVA_OPTS`环境变量来调整内存参数,如`-Xms`用于设置初始堆大小,`-Xmx`用于设置最大堆大小,`-XX:PermSize`和`-XX:MaxPermSize`分别设定永久代的初始和最大大小,`-Xss`设定每个...
Java虚拟机(JVM)是Java程序的核心组成部分,它负责执行字节码并管理程序的内存。以下是对JVM内存模型、内存溢出和线程栈的详细解释: ...理解这些JVM概念对于解决性能问题和优化Java应用程序至关重要。
当程序运行时分配给它的内存空间不足以支撑其正常运行时,就会出现“内存溢出”(Out of Memory Error,简称OOM)。这通常发生在堆内存或方法区等内存区域耗尽时。对于Java应用而言,了解如何有效识别并解决内存溢出...
解决这个问题,除了增加总的内存分配,还可以考虑对每个应用单独配置内存,或者优化应用程序的内存使用,减少内存泄漏。 总的来说,理解和配置Eclipse中的Tomcat内存设置是Java Web开发中的关键技能,能够有效避免...
本文以“JBoss配置内存大小”为主题,详细解释了如何优化JBoss服务器运行时的内存分配,以避免因内存不足导致的性能问题或`Out of Memory`异常。 首先,Java虚拟机在启动时会根据特定的参数来设定内存分配。有两个...
Java OOM(Out Of Memory)是指Java虚拟机(JVM)因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时抛出的错误。出现OOM的原因主要有两点:一是分配的少了,即虚拟机本身可使用的内存太少;...
- **Heap OutOfMemory**:当堆内存不足时,JVM无法为新对象分配空间,此时会抛出`OutOfMemoryError`。通过增加`-Xmx`值或优化代码减少内存占用可以解决该问题。 - **Stack OutOfMemory**:当单个线程的栈空间耗尽...
如果程序运行需要占用更多的内存,超出了这个设置值,就会抛出OutOfMemory异常。 Xss 是指设定每个线程的堆栈大小。这个就要依据你的程序,看一个线程大约需要占用多少内存,可能会有多少线程同时运行等。 以上三个...
在Java应用开发中,JVM(Java虚拟机)性能优化是一项重要的技术环节,它直接影响着应用程序的稳定性和响应速度。本文旨在深入解析JVM调优的关键参数及其应用场景,帮助开发者更好地理解和掌握JVM调优技巧。 #### 一...
- **-XX:+HeapDumpOnOutOfMemoryError**:当程序发生OOM(Out Of Memory)时,触发生成堆转储文件,方便后续分析。 - **-XX:HeapDumpPath=?**:指定堆转储文件的保存位置。结合`-XX:+HeapDumpOnOutOfMemoryError`...
通过合理的配置JVM参数,可以显著提高应用程序的性能,解决诸如OOM等问题。本文档通过具体的案例分析,介绍了JVM的基本概念、工作原理以及调优技巧,希望能够帮助开发者更好地理解和掌握JVM调优的相关知识。
4. **内存溢出(Out Of Memory Error, OOM)**: - **堆溢出**:对象实例数量超过最大堆容量限制。 - **虚拟机栈和本地方法栈溢出**:线程请求的栈深度大于虚拟机所允许的最大深度,或虚拟机在扩展栈时无法申请到...