在开发过程中,常常由于项目占用的内存空间比较大,在项目启动或运行的过程中常常会抛出
eclipse JVM配置
java.lang.OutOfMemoryError
java.lang.OutOfMemoryError: PermGen space
等的由于JVM堆栈或永久区空间不足的错误,导致不能正常运行
在eclipse中可通过如下配置修改JVM的运行环境:
-Xmx1024m -Xms1024m -XX:NewRatio=4 -XX:MaxPermSize=1024m
可根据情况进行调整
在eclipse中点击运行按钮下拉菜单,选择【Run Configurations】,选择要运行的程序或tomcat,在【Arguments】栏下的【VM arguments】参数下追加以上的配置信息就OK了。
eg:
下次再运行的时候就再也不怕JVM的资源问题了,但前提你得要有足够的内存资源供分配额。
windows下jvm运行情况查询
如要查看当前JVM下运行的状态,直接用JDK自带的工具查看就可以,在windows下找到JDK安装目录下的jvisualvm.exe,双击打开就可以运行了。
linux下JVM允许情况查询
在linux下查询jvm运行状态我一般这样查询:
[root@localhost ~]# jps
9862 jar
714 Bootstrap
1114 Jps
先通过jps查询出当前运行的进程ID,再通过jstat 查询出JVM相关的运行状态
[root@localhost ~]# jstat -gc 9862 1000 5
S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT
1728.0 1728.0 93.0 0.0 14272.0 6821.0 35312.0 34974.2 47808.0 47538.1 6288 14.705 6 0.613 15.318
1728.0 1728.0 93.0 0.0 14272.0 6821.0 35312.0 34974.2 47808.0 47538.1 6288 14.705 6 0.613 15.318
1728.0 1728.0 93.0 0.0 14272.0 6821.0 35312.0 34974.2 47808.0 47538.1 6288 14.705 6 0.613 15.318
1728.0 1728.0 93.0 0.0 14272.0 6821.0 35312.0 34974.2 47808.0 47538.1 6288 14.705 6 0.613 15.318
1728.0 1728.0 93.0 0.0 14272.0 6821.0 35312.0 34974.2 47808.0 47538.1 6288 14.705 6 0.613 15.318
术语解释如下:
#S0C 生还者区0 容量(KB)
#S1C 生还者区1 容量(KB)
#S0U 生还者区0 使用量(KB)
#S1U 生还者区1 使用量(KB)
#EC 伊甸园区容量(KB)
#EU 伊甸园区使用量(KB)
#OC 老年区容量(KB)
#OU 老年区使用量(KB)
#PC 永久区容量(KB)
#PU 永久区使用量(KB)
#YGC 新生代GC次数
#YGCT 新生代GC时间
#FGC full GC 事件的次数
#FGCT full GC的时间
#GCT 总GC时间
从上面的例子可以看出,OC OU PC PU这个栏的数据的数据老年区和永久区很快就会满了。
由于老年区存放的能被GC进行回收,故不对其进行优化配置,程序也不会出现内存溢出,所以对于这里OU可以不用对其进行配置。
由于PU永久区存放的是目前内存中的对象信息,如这个程序中一个List里存了大量数据,那么它就会存放在永久区中, 如果不对其进行优化,会导致程序出现outofmemoryError的错误异常。在这里,我刚刚查看的是tomcat的运行情况,那么就很有可能会导致出现tomcat在运行过程中宕机的问题,故需要根据机器的物理信息对其进行优化配置
linux下tomcat的JVM相关参数配置
tomcat对永久区的配置方法如下:
修改TOMCAT_HOME/bin/catalina.sh
在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行: 如
JAVA_OPTS="-server -Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m"
我这里这样设置的
# Bugzilla 37848: only output this if we have a TTY
if [ $have_tty -eq 1 ]; then
#这里是我添加的配置信息,-Xms 初始化堆大小 -Xmx最大堆大小 -XX:PermSize 初始化永久区大小 -XX:MaxPermSize:最大永久区大小
JAVA_OPTS="-server -Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=256m"
echo "Using CATALINA_BASE: $CATALINA_BASE"
echo "Using CATALINA_HOME: $CATALINA_HOME"
echo "Using CATALINA_TMPDIR: $CATALINA_TMPDIR"
保存,重启tomcat再查询下状态信息如下:
[root@localhost bin]# jps
9862 jar
1269 Bootstrap
1393 Jps
[root@localhost bin]# jstat -gc 1269 1000 3
S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT
8704.0 8704.0 5012.6 0.0 69952.0 6781.4 174784.0 60132.0 65536.0 41832.6 12 0.272 0 0.000 0.272
8704.0 8704.0 5012.6 0.0 69952.0 6781.5 174784.0 60132.0 65536.0 41832.6 12 0.272 0 0.000 0.272
8704.0 8704.0 5012.6 0.0 69952.0 6781.5 174784.0 60132.0 65536.0 41832.6 12 0.272 0 0.000 0.272
[root@localhost bin]#
这里的pc明显增大了许多,说明配置生效了
JAR程序JVM相关参数配置
对于某些JAR包的程序,它由于可能直接通过java -jar命令来运行,也可以对其进行相关的JVM配置,如spring boot的jar应用
其方法是直接在java 命令后加下参数即可,如
java -Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=256m -jar program1.jar
我在这里这样配置:
nohup java -Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m -jar myProgram.jar &
采用nohup让这个程序永久在机器上后台运行
在网上查询这些相关资料时,发现这篇博文很不错,对jstat的使用记录得很清楚:
地址--> http://blog.csdn.net/maosijunzi/article/details/46049117