开发的时候使用 Tomcat 大都使用的默认配置,很少性能调优,主要由于:
- 懒:如果是开发环境确实没什么必要,仅仅是大量压力的时候需要调下,而且默认的设置也是调过很多次的。虽然来是最优也能兼容很大情况。
- 不知道怎么去调试内存。
如果是在生产环境,也很难搞,因为生生环境有真实用户,不太好进行压测。所以要知道生产环境需要启动分配多少heap,多少stack多少prem都是不好说的。
最近研究下,能否通过本地开发环境启动时的配置数据加测试数据,和生产环境的用户数和并发量简单算出一个合适的启动参数呢?但也是不准确的,所以可以慢慢观察。
JVM 的启动参数
- -Xms 限制Java堆的大小最小
- -Xmx 限制Java堆的大小最大 当程序中请求一分配一个内存时、空间不够就会报Out Of Memory错误
如果设置成一样大,则不会去扩展,这点很重要 - -XX:+HeapDumpOnOutOfMemoryError 出现内存错误时dump出一个heap的快照以便分析
这个文件通过Eclipse插件:MAT打开分析 - -Xss : 栈容量 一般不会用到,如果设的小的话,会经常报StackOverflowError,栈桢超出
- -XX: PermSize 给方法堆分配的空间
- -XX:MaxPermSize 给方法堆分配的空间
PermSize一般来说不必太在意,GC时一般不会去回收这部分空间,(当然各JVM版本不同,处理时也不不相同)
再怎么最优配置也是和自身项目的特性有很多不同的,这里只看看JVM内存,一般的机器都不停留在1.1那个时候了,而启动内存确一直没变过,试试。
直接安装后不设置启动,默认内存
可以看到默认使用了247.5M,Non-head区120M左右没算在这里面
Heap区的 流动内存|较高使用内存|经常使用内存 为68:8:170
流动内存虽然Max为68,但有个Total为11.06M,就是68不起什么做用,一到了Total值就会启动GC,对TOMCAT来说,这个值增长还是很快的,有几个活跃用户就可以确保GC秒刷!
如果服务器使用,只跑一个Tomcat,建议设置到50%-80%,我内存1G,就把环境变量设置到512M吧,当然Tomcat的CATALINA_OPTS也是可以设的,和JAVA_OPTS有什么区别不在这里讨论
默认设置时,虽然最大有247M,但Total只有40M,所有即使没用,也只有Free22M,解决办法就是把初始空间和最大空间设为一样大!
JAVA_OPTS=-Xms512M -Xmx512M
这里面的-Xms -Xmx设置为一样大,就可以把启动内存设置为最大内存,启动即占用了,可以看到设置后内存翻了一倍,(设置的是512还是给我扣了20,只有494–!),
非HEAP区还是没变,这个看一下,是PremSize,非HEAP区主要是存放类文件的META等信息,代码缓存等。使用的是堆栈式存储,GC对这部分内存不起作用,如果项目代码多,就有必要设置大一点~当然要是在服务器端运行,还要加入-server 服务器模式可以更好利用CPU
加入Server,和PremSize
JAVA_OPTS=-server -Xms512M -Xmx512M -XX: PermSize=128m -XX:MaxPermSize=128m
更改后,发现名字都变了,前面都加了PS,大概就是服务器模式的意思吧
当然调试是很依据环境的,也并不说用户量大就乘多少,还是要看哪些内存是随用户增加而增加的。建议多用 -XX:+HeapDumpOnOutOfMemoryError 打几次,依小到大,分析。