jvm调优主要针对堆内存,堆内存分为:新生区、养老区和永久区
永久区存放的是系统jdk自身的interface和class的元数据,所以唯有新生区和养老区具有优化空间。
新生区:伊甸区和幸存者区。所有类都是在伊甸区被new出来,幸存者区又分为0区和1区。伊甸区的空间用完时,
会进行垃圾回收Minor GC(即我们常说的GC),GC后未被销毁的对象会被留到幸存区,0区1区重复Minor GC过程,最终把剩余的对象保存到
养老区,养老区满了进行FullGC。若养老区fullGC任然满,则报outOfMemory Error。
总结三区:频繁收集Young区;较少收集Old区;基本不动Perm区
有了这些理解,下面着手JVM调优。‘
tomcat之启动优化
tomcat之并发优化
BIO默认方式
BIO是最稳定最老的一个连接器,是采用阻塞的方式,意味着每个连接线程绑定到每个
Http请求,直到获得Http响应返回,如果Http客户端请求的是keep-Alive连接,那么这些
连接也许一直保持着直至达到timeout时间,这期间不能用于其它请求。性能差但是最稳定
直接就是出厂默认:注意协议是什么。
BIO适用场景
适用于连接数目比较小,并且一次发送大量数据的场景,这种方式对服务器资源要求比较高,并发局限于应用中。
NIO
NIO是使用Java的异步IO技术,不产生阻塞。nio(new I/O),是Java SE1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。
直接修改server.xml里的Connector节点,修改protocol为 :
protocol="org.apache.coyote.http11.Http11NioProtocol"
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="600" minSpareThreads="100" maxSpareThreads="500" acceptCount="700" connectionTimeout="20000" redirectPort="8443" />
NIO适用场景
服务器需要支持超大量的长时间连接。比如10000个连接以上,并且每个客户端并不会频繁地发送太多数据。例如总公司的一个中心服务器需要收集全国便利店各个收银机的交易信息,只需要少量线程按需处理维护的大量长期连接。
Jetty、Mina、Netty、ZooKeeper等都是基于NIO方式实现。
tomcat之内存优化
Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,有可能导致系统无法运行。
常见的问题是报Tomcat内存溢出错误,Out of Memory(系统内存不足)的异常,从而导致客户端显示500错误,
一般调整Tomcat的使用内存即可解决此问题。
“%TOMCAT_HOME%incatalina.sh”文件,在文件开头增加如下设置:
JAVA_OPTS=-Xms2048m -Xmx2048m
Xmx是用来设置你的应用程序能够使用的最大内存数,如果程序要花很大内存的话,那就需要修改增加此数的值。
Xms是用它来设置程序初始化的时候内存栈的大小,增加这个值的话你的程序的启动性能会得到提高。
xms设置为与xmx相同,避免每次垃圾回收都要重新分配内存。