症状:运行一段时间后,通过jconsole查看内存占用。发现内存占用很高。用不了一两天,就报内存溢出。
解决过程:
A.通过review程序,看是否有重大错误.(代码review后,未发现重大问题)
B.通过jprofile 和 jmater对某些页面左性能测试.暴露了一些问题.过滤器,中对图片也进行编码.
C.后来还是有内存溢出的问题.
所以再用jprofile 查. 看不出问题. char[] 占用非常大200多M.
D.之后通过使用Memory Analyzer tool(MAT)工具,分析内存,终于找到问题的根本.
因为访问tomcat目录未被限制访问,访问后tomcat会把目录下所有文件显示出来,如果文件上万,那么这个页面相当大.访问一下,内存就飙升.通过MAT发现这个页面占用200多M.
将tomcat的/conf/web.xml 中的
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
true 设置为false.就可以了.
问题解决.
tomcat 的启动文件catalita.bat中增加 下面的配置文件
set JAVA_OPTS=-Xms400M -Xmx800M -XX:PermSize=128M -XX:MaxPermSize=256m -verbose:gc -Xloggc:../logs/gclog.log -
XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -XX:+HeapDumpOnOutOfMemoryError
%JAVA_OPTS%
增加 -XX:+HeapDumpOnOutOfMemoryError 这句.如果系统内存溢出的时候,将会将内存dump到
java_pid3159.hprof文件.
然后使用mat进行分析.
相关资料:
[url=http://www.blogjava.net/rosen/archive/2011/01/26/321575.html]使用Memory Analyzer tool(MAT)分析内存泄漏(一)
[/url]
[url=http://www.cnblogs.com/wangtianxj/archive/2010/10/19/1855751.html]使用Memory Analyzer tool(MAT)分析内存泄漏(二)
[/url]
jvm参数配置说明:
JAVA_OPTS="-server -Xms2048m -Xmx2048m -Xss512k"
-server:一定要作为第一个参数,在多个CPU时性能佳
-Xms:初始Heap大小,使用的最小内存,cpu性能高时此值应设的大一些
-Xmx:java heap最大值,使用的最大内存
上面两个值是分配JVM的最小和最大内存,取决于硬件物理内存的大小,建议均设为物理内存的一半。
-XX:PermSize:设定内存的永久保存区域
-XX:MaxPermSize:设定最大内存的永久保存区域
-XX:MaxNewSize:
-Xss 15120 这使得JBoss每增加一个线程(thread)就会立即消耗15M内存,而最佳值应该是128K,默认值好像是512k.
+XX:AggressiveHeap 会使得 Xms没有意义。这个参数让jvm忽略Xmx参数,疯狂地吃完一个G物理内存,再吃尽一个G的swap。
-Xss:每个线程的Stack大小
-verbose:gc 现实垃圾收集信息
-Xloggc:gc.log 指定垃圾收集日志文件
-Xmn:young generation的heap大小,一般设置为Xmx的3、4分之一
-XX:+UseParNewGC :缩短minor收集的时间
-XX:+UseConcMarkSweepGC :缩短major收集的时间
提示:此选项在Heap Size 比较大而且Major收集时间较长的情况下使用更合适。
详细设置为:
%EIO_JRE_HOME%/bin/java -Xms512m -Xmx1024m -XXermSize=128m -XX:NewSize=64m -XX:MaxNewSize=128m -XX:NewRatio=3 -XX:SurvivorRatio=6? -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=40 -Xverify:none -Dsun.java2d.ddlock=true -Dsun.awt.noerasebackground=true -Dswing.aatext=true -jar %EIO_HOME%/EIOffice.jar
=============================================
1.{tomcat_home}\bin\catalina.sh ||catalina.bat
JAVA_OPTS="$JAVA_OPTS -Djavax.servlet.request.encoding=UTF-8 -Dfile.encoding=UTF-8 -Duser.timezone=GMT+8” (LINUX)
JAVA_OPTS=%JAVA_OPTS% -Djavax.servlet.request.encoding=UTF-8 -Dfile.encoding=UTF-8 -Duser.timezone=GMT+8 (WINDOWS)
2.
实际项目中一般是用utf-8的,而Tomcat的默认编码则是iso-8859-1,
因此我们通常编辑conf/下的server.xml,配置Connector项,加上属性URIEncoding="UTF-8"即可。
<Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8" />
3.使用filter来进行过滤;
可做如下参考:http://old.nabble.com/change-server-default-enconding--Where-to-set-JAVA_OPTS-in-catalina.sh-for-UTF8--td6735363.html
===================================================
设置环境变量。
#vi /etc/profile
在最后面加入
# java ......................
JAVA_HOME=/usr/java/jdk1.5.0_08/
CLASSPATH=.:$JAVA_HOME/lib/tools.jar:/lib.dt.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
保存退出
按esc
:wq
3.用户使用
vi /etc/profile.d/java.sh
JAVA_HOME=/usr/java/jdk1.5.0_08/
CLASSPATH=.:$JAVA_HOME/lib/tools.jar:/lib.dt.jar
PATH=$JAVA_HOME/bin:$PATH
JAVA_OPTS="-server -Xmx768m -XX:MaxNewSize=512m -XX:MaxPermSize=700m"
CATALINA_OPTS="-server -Xmx768m -XX:MaxNewSize=512m -XX:MaxPermSize=700m"
export JAVA_HOME CLASSPATH PATH JAVA_OPTS CATALINA_OPTS
保存退出
按esc
:wq
chmod 755 /etc/profile.d/java.sh
4.执行所有的命令
source /etc/profile
source /etc/profile.d/java.sh
------------------查看liunx版本-----------------------------
cat /proc/version
解决过程:
A.通过review程序,看是否有重大错误.(代码review后,未发现重大问题)
B.通过jprofile 和 jmater对某些页面左性能测试.暴露了一些问题.过滤器,中对图片也进行编码.
C.后来还是有内存溢出的问题.
所以再用jprofile 查. 看不出问题. char[] 占用非常大200多M.
D.之后通过使用Memory Analyzer tool(MAT)工具,分析内存,终于找到问题的根本.
因为访问tomcat目录未被限制访问,访问后tomcat会把目录下所有文件显示出来,如果文件上万,那么这个页面相当大.访问一下,内存就飙升.通过MAT发现这个页面占用200多M.
将tomcat的/conf/web.xml 中的
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
true 设置为false.就可以了.
问题解决.
tomcat 的启动文件catalita.bat中增加 下面的配置文件
set JAVA_OPTS=-Xms400M -Xmx800M -XX:PermSize=128M -XX:MaxPermSize=256m -verbose:gc -Xloggc:../logs/gclog.log -
XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -XX:+HeapDumpOnOutOfMemoryError
%JAVA_OPTS%
增加 -XX:+HeapDumpOnOutOfMemoryError 这句.如果系统内存溢出的时候,将会将内存dump到
java_pid3159.hprof文件.
然后使用mat进行分析.
相关资料:
[url=http://www.blogjava.net/rosen/archive/2011/01/26/321575.html]使用Memory Analyzer tool(MAT)分析内存泄漏(一)
[/url]
[url=http://www.cnblogs.com/wangtianxj/archive/2010/10/19/1855751.html]使用Memory Analyzer tool(MAT)分析内存泄漏(二)
[/url]
jvm参数配置说明:
JAVA_OPTS="-server -Xms2048m -Xmx2048m -Xss512k"
-server:一定要作为第一个参数,在多个CPU时性能佳
-Xms:初始Heap大小,使用的最小内存,cpu性能高时此值应设的大一些
-Xmx:java heap最大值,使用的最大内存
上面两个值是分配JVM的最小和最大内存,取决于硬件物理内存的大小,建议均设为物理内存的一半。
-XX:PermSize:设定内存的永久保存区域
-XX:MaxPermSize:设定最大内存的永久保存区域
-XX:MaxNewSize:
-Xss 15120 这使得JBoss每增加一个线程(thread)就会立即消耗15M内存,而最佳值应该是128K,默认值好像是512k.
+XX:AggressiveHeap 会使得 Xms没有意义。这个参数让jvm忽略Xmx参数,疯狂地吃完一个G物理内存,再吃尽一个G的swap。
-Xss:每个线程的Stack大小
-verbose:gc 现实垃圾收集信息
-Xloggc:gc.log 指定垃圾收集日志文件
-Xmn:young generation的heap大小,一般设置为Xmx的3、4分之一
-XX:+UseParNewGC :缩短minor收集的时间
-XX:+UseConcMarkSweepGC :缩短major收集的时间
提示:此选项在Heap Size 比较大而且Major收集时间较长的情况下使用更合适。
详细设置为:
%EIO_JRE_HOME%/bin/java -Xms512m -Xmx1024m -XXermSize=128m -XX:NewSize=64m -XX:MaxNewSize=128m -XX:NewRatio=3 -XX:SurvivorRatio=6? -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=40 -Xverify:none -Dsun.java2d.ddlock=true -Dsun.awt.noerasebackground=true -Dswing.aatext=true -jar %EIO_HOME%/EIOffice.jar
=============================================
1.{tomcat_home}\bin\catalina.sh ||catalina.bat
JAVA_OPTS="$JAVA_OPTS -Djavax.servlet.request.encoding=UTF-8 -Dfile.encoding=UTF-8 -Duser.timezone=GMT+8” (LINUX)
JAVA_OPTS=%JAVA_OPTS% -Djavax.servlet.request.encoding=UTF-8 -Dfile.encoding=UTF-8 -Duser.timezone=GMT+8 (WINDOWS)
2.
实际项目中一般是用utf-8的,而Tomcat的默认编码则是iso-8859-1,
因此我们通常编辑conf/下的server.xml,配置Connector项,加上属性URIEncoding="UTF-8"即可。
<Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8" />
3.使用filter来进行过滤;
可做如下参考:http://old.nabble.com/change-server-default-enconding--Where-to-set-JAVA_OPTS-in-catalina.sh-for-UTF8--td6735363.html
===================================================
设置环境变量。
#vi /etc/profile
在最后面加入
# java ......................
JAVA_HOME=/usr/java/jdk1.5.0_08/
CLASSPATH=.:$JAVA_HOME/lib/tools.jar:/lib.dt.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
保存退出
按esc
:wq
3.用户使用
vi /etc/profile.d/java.sh
JAVA_HOME=/usr/java/jdk1.5.0_08/
CLASSPATH=.:$JAVA_HOME/lib/tools.jar:/lib.dt.jar
PATH=$JAVA_HOME/bin:$PATH
JAVA_OPTS="-server -Xmx768m -XX:MaxNewSize=512m -XX:MaxPermSize=700m"
CATALINA_OPTS="-server -Xmx768m -XX:MaxNewSize=512m -XX:MaxPermSize=700m"
export JAVA_HOME CLASSPATH PATH JAVA_OPTS CATALINA_OPTS
保存退出
按esc
:wq
chmod 755 /etc/profile.d/java.sh
4.执行所有的命令
source /etc/profile
source /etc/profile.d/java.sh
------------------查看liunx版本-----------------------------
cat /proc/version