JVM设置
l 一般使用HotSpot JVM。
l 加上-server。
l -Xms/-Xmx:设置Java堆初始化和最大值,默认是1/64物理内存和1/4物理内存,一般不超过物理内存的80%,且这两个应该设置成一样,,够用就好,太高会导致浪费内存和GC回收周期长。
l -XX:NewSize/-XX:NewRatio:设置成25%-33%java堆总量,太高太低都会导致无效GC。
l -XX:MetaspaceSize/-XX:MaxMetaspaceSize:非堆内内存初始值最大值分别设为128M,256M。
l -XX:+AggressiveOpts:使用最新优化技术。
参考oracle官网。
内存>=8G 基础配置 | 内存<8G 基础配置 |
-server -XX:+DisableExplicitGC -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:+ParallelRefProcEnabled -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCDateStamps -XX:ErrorFile=/var/app/gc/hs_err_pid%p.log -XX:HeapDumpPath=/var/app/gc -Xloggc:/var/app/gc/gc%t.log | -server -XX:+DisableExplicitGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses -XX:+CMSClassUnloadingEnabled -XX:+ParallelRefProcEnabled -XX:+CMSScavengeBeforeRemark -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCDateStamps -XX:ErrorFile=/var/app/gc/hs_err_pid%p.log -XX:HeapDumpPath=/var/app/gc -Xloggc:/var/app/gc/gc%t.log |
以下参数配置适用于非计算密集型的大部分应用
分配内存 | 堆配置推荐 |
2G | -Xmx1344M -Xms1344M -Xmn448M -XX:MaxMetaspaceSize=192M -XX:MetaspaceSize=192M |
3G | -Xmx2048M -Xms2048M -Xmn768M -XX:MaxMetaspaceSize=256M -XX:MetaspaceSize=256M |
4G | -Xmx2688M -Xms2688M -Xmn960M -XX:MaxMetaspaceSize=256M -XX:MetaspaceSize=256M |
5G | -Xmx3392M -Xms3392M -Xmn1216M -XX:MaxMetaspaceSize=512M -XX:MetaspaceSize=512M |
6G | -Xmx4096M -Xms4096M -Xmn1536M -XX:MaxMetaspaceSize=512M -XX:MetaspaceSize=512M |
7G | -Xmx4736M -Xms4736M -Xmn1728M -XX:MaxMetaspaceSize=512M -XX:MetaspaceSize=512M |
8G | -Xmx5440M -Xms5440M -XX:MaxMetaspaceSize=512M -XX:MetaspaceSize=512M |
tomcat 参数调优
tomcat中主要修改maxThreads、acceptCount如果要加大并发连接数,应同时加大这两个参数。
1.tomcat的线程数量并不是越多越好。 thread太多,导致切换过多,性能下降严重。这个数量应该是你单个机器的承载能力, 压力测试下得出的结果。 不可任意加大。一般情况下, 256-512个已经非常高的数值了。
2.JVM参数配置,-Xmn128-256m就够了, 你把gc的收集打印出来,再研究下。
3.-Xss128k 这个参数, 建议你设置成256k, 不然容易造成不够用, 特别是你的程序有比较多的递归行为。 比如排序。
JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于 40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、 -Xmx相等以避免在每次GC 后调整堆的大小。
非堆内存分配
JVM使用-XX:MetaspaceSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxMetaspaceSize设置最大非堆内存的大小,默认是物理内存的1/4。
JVM内存限制(最大值)
首先JVM内存限制于实际的最大物理内存,假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位 处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G- 2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了。(使用java命令测试出支持的最大值)。
Tomcat的server.xml中Context元素的以下参数应该怎么配?
方法一
maxThreads="150" 表示最多同时处理150个连接 ;
minSpareThreads="25" 表示即使没有人使用也开这么多空线程等待 ;
maxSpareThreads="75" 表示如果最多可以空75个线程,例如某时刻有80人访问,之后没有人访问了,则tomcat不会保留80个空线程,而是关闭5个空的;
acceptCount="100" 当同时连接的人数达到maxThreads时,还可以接收排队的连接,超过这个连接的则直接返回拒绝连接。
根据你的配置建议
maxThreads="500"
minSpareThreads="100" 如果你的网站经常访问量都很大的话,缺省就开比较大
maxSpareThreads="300"
acceptCount="100"
这只是说你的服务器可以支持这么多用户,但还要看你安装了哪些东西,还有你的程序是否足够高效率。
方法二
1.如何加大tomcat连接数
在tomcat配置文件server.xml中的配置中,和连接数相关的参数有:
minProcessors:最小空闲连接线程数,用于提高系统处理性能,默认值为10;
maxProcessors:最大连接线程数,即:并发处理的最大请求数,默认值为75
acceptCount:允许的最大连接数,应大于等于maxProcessors,默认值为100
enableLookups:是否反查域名,取值为:true或false。为了提高处理能力,应设置为false;
connectionTimeout:网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。
其中和最大连接数相关的参数为maxProcessors和acceptCount。如果要加大并发连接数,应同时加大这两个参数。
web server允许的最大连接数还受制于操作系统的内核参数设置,通常Windows是2000个左右,Linux是1000个左右。Unix中如何设置这些参数,请参阅Unix常用监控和管理命令。
解决文件上传问题所需修改的tomcat配置
因上传文件过程中文件过大导致服务出现链接超时问题,需在tomcat容器中server.xml配置文件中修改配置如下:
<Connector URIEncoding="UTF-8" connectionTimeout="60000" disableUploadTimeout="false" connectionUploadTimeout="120000" enableLookups="false" executor="tomcatThreadPool" maxHttpHeaderSize="2097152" maxPostSize="104857600" port="8090" protocol="org.apache.coyote.http11.Http11NioProtocol"/>
属性作用:
disableUploadTimeout:上传时是否使用超时机制。
connectionUploadTimeout:上传超时时间,毕竟文件上传可能需要消耗更多的时间,这个根据你自己的业务需要自己调,
以使Servlet有较长的时间来完成它的执行,需要与上一个参数一起配合使用才会生效。
测试方法:
本地:将connectionTimeout属性改为1ms,以模拟上传文件超市问题。