服务器:ibm x346,内存4g,最近老是运行一段时间后tomcat就挡掉的情况,查看java和tomcat进程,每次刚启动tomcat,tomcat进程大概240个左右,java也是二百多个,大概运行一两天之后,时间不等,tomcat进程大概会增加到500多个,而且奇怪的是tomcat进程只增不减,增加到五百多个时候tomcat就档掉了,没有办法只能重新启动tomcat。
google到java启动时候的一个内存分配参数:
tomcat根目录下bin目录中catalina.sh文件
我经常会这样来设置服务器端的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收集时间较长的情况下使用更合适。
原来王永兵那边曾经设置过 JAVA_OPTS='-Xms1577m -Xmx2500m',后来google到了这样一篇文章:
Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,需要调大。
Windows下,在文件/bin/catalina.bat,Unix下,在文件/bin/catalina.sh的前面,增加如下设置:
JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】'
需要把这个两个参数值调大。例如:
JAVA_OPTS='-Xms256m -Xmx512m'
表示初始化内存为256MB,可以使用的最大内存为512MB。
另外需要考虑的是Java提供的垃圾回收机制。虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。收集垃圾可以接受的速度与应用有关,应该通过分析实际的垃圾收集的时间和频率来调整。如果堆的大小很大,那么完全垃圾收集就会很慢,但是频度会降低。如果你把堆的大小和内存的需要一致,完全收集就很快,但是会更加频繁。调整堆大小的的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。在基准测试的时候,为保证最好的性能,要把堆的大小设大,保证垃圾收集不在整个基准测试的过程中出现。
如果系统花费很多的时间收集垃圾,请减小堆大小。一次完全的垃圾收集应该不超过 3-5 秒。如果垃圾收集成为瓶颈,那么需要指定代的大小,检查垃圾收集的详细输出,研究 垃圾收集参数对性能的影响。一般说来,你应该使用物理内存的 80% 作为堆大小。当增加处理器时,记得增加内存,因为分配可以并行进行,而垃圾收集不是并行的。
于是将这个参数调小到:
JAVA_OPTS="-server -Xms1000m -Xmx1500m -Xss128k"初始非配内存为1000m,最大使用内存为1500m,每增加一个进程为其非配128k内存。
更改后一直没有出现问题。
结论:java虚拟机有一个回收机制,必须在回收的时间跟频率上寻找一个平衡点,初始内存太大,回收频率慢,太小,回收频率快,都会影响服务器tomcat的运行,因此,开始我们设置太大的初始内存,java回收的太慢,导致了垃圾内存无法回收,累积起来最好有新的进程过来就没有剩余的内存为其分配,所以tomcat就宕掉了。
另外一个问题,就是tomcat、java进程为什么在使用完成之后不会自己清理呢?而是一直累计增加呢?这个问题一直也没有找到答案。
阅读(1733) | 评论(0) | 转发(0) |