java性能优化原则:代码运算性能 内存回收 应用配置(影响java程序注意原因是垃圾回收)
代码层优化:避免过多的循环嵌套 调用和复杂逻辑
Tomcat调优主要内容
1.增加最大连接数
2.调整工作模式
3.启用gzip压缩
4.调整JVM内存大小
5.作为web服务器时 与Apache整合或Nginx
6.合理选择垃圾回收算法
7.尽量使用较新版的JDK
生产环境实例
maxThreads="1000" minSpareThreads="100" maxSpareThreads="200" acceptCount="900" disableUploadTimeout="true" connectionTimeout="20000" URIEncoding="UTF-8" enableLookups="false" redirectPort="8443" compression="on" compressionMinSize="1024" compressableMimeType="text/html,text/xml,text/css,text/javascript"/> 参数说明: org.apache.coyote.http11.Http11NioProtocol:调整工作模式为Nio maxThreads:最大线程数,默认150。增大值避免队列请求过多,导致响应缓慢。 minSpareThreads:最小空闲线程数 maxSpareThreads:最大空闲线程数,如果超过这个值,会关闭无用的线程。 acceptCount:当处理请求超过此值时,将后来请求放到队列中等待。 disableUploadTimeout:禁用上传超时时间 connectionTimeout:连接超时,单位毫秒,0代表不限制 URIEncoding:URI地址编码使用UTF-8 enableLookups:关闭dns解析,提高响应时间 compression:启用压缩功能 compressionMinSize:最小压缩大小,单位Byte compressableMimeType:压缩的文件类型 Tomcat的三种工作模式: Bio、Nio和Apr 工作原理分别为 Bio(Blocking I/O):默认工作模式 阻塞式I/O操作 没有任何优化技术处理 性能比较低 Nio(New I/O or Non-Blocking):非阻塞式I/O操作 有BIO更好的并发处理性能 Apr(apache portable runtime,apache可移植运行库):首选工作模式 主要为上层的应用程序提供一个可以跨越多操作系统平台使用的底层支持接口库 Tomcat利用基于APR库Tomcat-native来实现操作系统级别控制 提供一种优化技术和非阻塞式I/O操作 大大提高并发处理能力 但是需要安装APR和Tomcat-native库 Java性能问题主要来自于jvm jvm GC也比较复杂 1、jvm内存划分为年轻代(Young Generation)、年老代 Old Generation)、永久代(Permanent Generation) 2、年轻代又分为Eden和Survivor区。Survivor区由FromSpace和ToSpace组成。Eden区占大容量,Survivor两个区占小容量,默认8:2 3、堆内存Heap=年轻代+年老代 非堆内存=永久代 4、堆内存用途:存放的是对象 垃圾收集器就是收集这些对象的 然后根据GC算法回收 5、非堆内存用途:JVM本身使用 存放一些类型 方法 常量 属性等 6、年轻代:新生成的对象首选放到年轻代的E区中 当E区满时 经过GC后 还存活的对象被复制到Survivor区的FromSpace中 如果survivor区满 会再被复制到survivor区的ToSpace区 如果还有存活的对象 会再被复制到老年代 7、老年代:在年轻代中经过GC后还存活的对象会被复制到老年代中 当老年代空间不足时 jvm会对老年代进行完全的垃圾回收(Full GC) 如果GC后 还是无法存放从survivor区复制过来的对象 就会出现OOM 8、永久代:也称为方法区 存放静态类型数据 比如类 方法 属性等 垃圾回收算法 1、标记 清除 2、复制 3、标记 整理 垃圾收集器 单线程/多线程收集器 GMS收集器 JAVA_OPTS="-server -Xms1024m -Xmx1536m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC -XX:+UseParallelGCThreads=8 XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:-PrintGC -XX:-PrintGCDetails -XX:-PrintGCTimeStamps -Xloggc:../logs/gc.log" 参数 描述 -Xms 堆内存初始大小 单位M、G -Xmx 堆内存最大允许大小 一般不要大于物理内存的80% -XX:PermSize 非堆内存初始大小 一般应用设置初始化200M 最大1024M就够了 -XX:MaxPermSize 非堆内存最大允许值 -XX:+UseParallelGCThreads=8 并行收集器线程数 同时有多少个线程进行垃圾回收 一般与CPU数量相等 -XX:+UseParalle101dGC 指定老年代为并行收集 -XX:+UseConcMarkSweepGC CSM收集器 -XX:+UseCMSCCompactAtFullCollection 开启内存空间压缩和整理 防止过多内存碎片 -XX:CMSFullGCsBeforeCompaction=0 表示多少次Full GC后开始压缩和整理 0表示每次Full GC后立即执行压缩和整理 -XX:CMSInitiatingOccupancyFracetion=80% 表示老年代内存空间使用80%时开始执行CMS收集 防止过多的Full GC 注意:不是jvm内存设置越大越好 具体还是根据项目对象实际占内存大小而定 可以通过java自带的分析工具来查看 如果设置过大 会增加回收实际 从而增加暂停应用时间 gzip压缩作用:节省服务器流量和提高网站访问速度 客户端请求服务器资源后 服务器将资源文件压缩 再返回给客户端 有客户端的浏览器负责压缩并浏览 Apache和Tomcat结合 由于Tomcat处理静态文件能力远远不足Apache 所有用Apache处理静态文件 Tomcat负责处理jsp session会话的保持 TomcatSessionID持久化三种方法 session粘性:通过浏览器cookie绑定sessionID 通过sticky模式将同一session请求分片到同一Tomcat上 session复制:tomcat通过广播形式将session同步到其它Tomcat节点 并且Linux下要手动开启开放广播地址 不宜后端节点过多 session保持数据库(memcache redis):将sessionID保存在共享的数据库中 OOM异常的几个原因 老年代内存不足:java.lang.OutOfMemoryError:Javaheapspace 永久代内存不足:java.lang.OutOfMemoryError:PermGenspace 代码bug 占用内存无法及时回收