1、Eclise 中设置jvm内存: 修改eclipse的配置文件,对所有工程都起作用
修改eclipse根目录下的eclipse.ini文件
-vmargs //虚拟机设置
-Xms40m //初始内存
-Xmx256m //最大内存
-Xmn16m //最小内存
-XX:PermSize=128M //非堆内存
-XX:MaxPermSize=256M
2、Eclise 中设置jvm内存:jres VM Arguments参数的设置,对所有工程都起作用
打开eclipse window-preferences-Java-Installed JREs -Edit-Default VM Arguments
在VM自变量中输入:-Xmx128m -Xms64m -Xmn32m -Xss16m
3、Eclise 中设置jvm内存:RunConfigurations VM arguments参数设置,只对这个工程起作用
在Eclipse中-->右击工程/要运行的主类-->Run As-->RunConfigurations-->(x)=Arguments-->VM arguments
中加入 -Xmx36m
4、Eclise 中设置jvm内存:Debug Configurations VM arguments参数设置,只对这个工程起作用
在Eclipse中-->右击工程/要运行的主类-->Debug As-->DebugConfigurations-->(x)=Arguments-->VM arguments
中加入-Xmx36m
5、Tomcat内存设置
windows下在catalina.bat的第一行增加:
Java代码 :set JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m
Linux下在catalina.sh的第一行增加:
Java代码 :JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m
实例+详解
设置Tomcat启动的初始内存其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。
可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置
实例,以下给出1G内存环境下Java jvm 的参数设置参考:
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "
JAVA_OPTS="-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX: NewSize=192m -XX:MaxNewSize=384m"
CATALINA_OPTS="-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:NewSize=192m -XX:MaxNewSize=384m"
linux:
在/usr/local/apache-tomcat-5.5.23/bin 目录下的catalina.sh添加:
JAVA_OPTS='-Xms512m -Xmx1024m'要加“m”说明是MB,否则就是KB了,在启动tomcat时会 报内存不足。
-Xms:初始值-Xmx:最大值-Xmn:最小值
Windows:
在catalina.bat最前面加入set JAVA_OPTS=-Xms128m -Xmx350m
如果用startup.bat启动tomcat,OK设置生效.够成功的分配200M内存.
但是如果不是执行startup.bat启动tomcat而是利用windows的系统服务启动tomcat服务,上面的设置就不生效了,就是说set JAVA_OPTS=-Xms128m -Xmx350m 没起作用.上面分配200M内存就OOM了..
windows服务执行的是bin\tomcat.exe.他读取注册表中的值,而不是catalina.bat的设置.
解决办法:
修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Tomcat Service Manager\Tomcat5\Parameters\JavaOptions
原值为-Dcatalina.home="C:\ApacheGroup\Tomcat 5.0"-Djava.endorsed.dirs="C:\ApacheGroup\Tomcat 5.0\common\endorsed"-Xrs加入 -Xms300m -Xmx350m
重起tomcat服务,设置生效
Tomcat 的JVM 内存溢出问题的解决关键字: tomcat 的jvm 内存溢出问题的解决
最近在熟悉一个开发了有几年的项目,需要把数据库从MySQL移植到Oracle,首先把jdbc的连接指向mysql,打包放到tomcat里面,可以跑起来,没有问题,可是当把jdbc连接指向oracle的时候,tomcat就连续抛java.lang.OutOfMemoryError的错误,上网google了一下,了解了一下tomcat的运行机制,也解决了问题,share出来,以备查。
1、首先是:java.lang.OutOfMemoryError: java heap space 解释:
Heap size 设置 JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。
提示:在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。
提示:Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。
解决方法:
手动设置Heap size 修改TOMCAT_HOME/bin/catalina.bat,在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
Java代码 set JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m -XX:MaxNewSize=256m
或修改catalina.sh 在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行: JAVA_OPTS="$JAVA_OPTS -server -Xms800m -Xmx800m -XX:MaxNewSize=256m"
2、其次是:java.lang.OutOfMemoryError: PermGen space 原因:
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
解决方法:
1. 手动设置MaxPermSize大小 修改TOMCAT_HOME/bin/catalina.bat(Linux下为catalina.sh),在Java代码 “echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行: set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m
catalina.sh下为: Java代码 JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m"
下面给出各种可以用户设置堆大小的命令行参数。注释列提供了一些设置参数的初级或高级建议。此外,后面还会给出更多的详细建议。
参数 | 描述 | 注释 |
-Xms |
设置堆的最小值 | 在生产阶段,最小和最大堆值设置为相同的值 |
-Xmx |
设置堆的最大值 | |
-XX:NewSize= |
设置年轻代的最小值 | 在生产阶段,最小和最大年轻代的值设为相同的值 |
-XX:MaxNewSize= |
设置年轻代的最大值 | |
-XX:NewRatio= |
设置年轻代和年老代的大小比例。例如,数值为2时 年老代将会是年轻代大小的2倍。 |
使用NewSize/MaxNewSize参数或NewRatio参数,但不要两个参数都使用 |
-XX:SurvivorRatio= |
设置eden space和剩余空间的大小比例。例如,剩余空间比例为8时,eden space是任一剩余空间大小的8倍。 | 基于年轻代大小改变比例。比例值为8适用于 小的年轻代(如10M),32适用于比较大的年轻代(如100M)。 |
-XX:MaxTenuringThreshold= |
表示一个对象在被自动放置于年老代之前必须存活的次要回收的次数 | 一般应该使用的值为32 |
-XX:MaxPermSizse= |
设置永久代的大小 | 在用完空间后在设置永久代 |
-XX:+UserTLAB | 在eden space里给应用程序的每一个线程提供它自己的分配区域(线程本地分配块TLAB)。注意它是一个布尔型选项, 用plus(+)可以启动它,用minus(-)(-XX:-UseTLAB)可以禁用它 |
主要对多处理器系统有利 |
-XX:TLABSize= |
每一个TLAB的大小 | 确保年轻代空间足够为应用程序里的每一个线程保存所有的TLAB。应该分别使用64KB、128KB和256KB进行尝试 |
注意:1.
2.
[Full GC 121376K->10414K(130112K), 0.0650971 secs]
[GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]
四、调优总结
1.在eclipse设置JVM参数
打开eclipse-窗口-首选项-Java-已安装的JRE(对在当前开发环境中运行的java程序皆生效,也就是在eclipse中运行的java程序)编辑当前使用的JRE,在缺省VM参数中输入:
-Xmx1024m -Xms1024m -Xmn256m -Xss16m
或者在运行一个java程序的时候执行:
java -Xmx1024m -Xms1024m -Xmn256m -Xss16m Test
Test是一个class文件。
2. 在Tomcat服务器上设置JVM参数
set CATALINA_OPTS=-Xmx512m -Xms512m -Xmn64m -Xss2m 或者
set JAVA_OPTS=-Xmx512m -Xms512m -Xmn64m -Xss2m
设置CATALINA_OPTS 和 JAVA_OPTS都是一个道理,在启动tomcat的时候设置参数。
两者区别是JAVA_OPTS在tomcat停止的时候也会执行这个命令。
注意:Tomcat分为安装版(*.exe)和非安装版或者解压版(*.zip),个人还是比较喜欢解压版。两者虽然在功能上没有什么区别,但是在设置上还是有要注意的地方。这里只谈JVM设置要注意的地方。
安装版:windows的服务会有一个tomcat服务,当启动服务的时候Tomcat会从注册表读取JVM的参数。也就是说当在tomcat的lib文件夹下catalina.bat或者startup.bat中设置JVM参数是无效的。解决办法:设置tomcat的注册表;或者使用startup.bat启动tomcat。
解压版:当点击startup.bat时,它会读取catalina.bat中的配置,不管在startup.bat文件还是在catalina.bat文件中设置JVM参数,都会读取JVM参数。
3. 查看堆的大小
在程序中查看,返回值单位是字节,当然还有其他JVM参数可以查看。
Runtime.getRuntime().maxMemory();
或者在命令行 执行jvisualvm 命令
或者%java_home%\bin 目录下点击jvisualvm.exe
或者在命令行执行jconsole 命令
或者%java_home%\bin 目录下点击jconsole.exe
4. java内存可以分为堆内存和非堆内存
堆和非堆:堆是给开发人员用的,是在JVM启动时创建; 非堆是留给JVM自己用的,用来存放类型(类和接口)的信息。它和堆不同,运行期内GC不会释放空间。如果web app用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小,超出了也会导致这块内存的占用过多造成溢出,或者 tomcat热部署时侯不会清理前面加载的环境,只会将context更改为新部署的,非堆存的内容就会越来越多,热部署上几次就java.lang.OutOfMemoryError: PermGen space .
---- 堆内存设置:程序可以到达的,可以操作的
-Xms 初始堆内存 默认物理内存1/64,也是最小分配堆内存。当空余堆内存小于40%时,会增加到-Xms的最大限制
-Xmx 最大堆内存分配 默认物理内存1/4,当空余堆内存大于70%时,会减小到-Xms的最小限制。
一般设置 -Xms和Xms大小相等
---- 非堆内存设置
-XX:PermSize 非堆内存的初始值,默认物理内存的1/64 ,也是最小非堆内存。
-XX:MaxPermSize 非堆内存最大值,默认物理内存的1/4,
5. 典型JVM参数设置:
java -Xmx128m -Xms128m -Xmn64m -Xss1m
-Xmx128m:设置JVM最大可用内存为128M。
-Xms128m:设置JVM最小内存为128m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-Xmn2g:设置年轻代大小为2G。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
-Xss128k:设置每个线程的堆栈大小。 JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更 多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
-- Ratio 英音:['reiseu] 比率
-- Eden 伊甸
-- Survivor 幸存者
java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0
-XX:NewRatio=4:设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5
-XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6
-XX:MaxPermSize=16m:设置持久代大小为16m。
-XX:MaxTenuringThreshold=0:设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。
对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。