java性能优化原则:代码运算性能内存回收应用配置(影响java程序注意原因是垃圾回收) 代码层优化:避免过多的循环嵌套调用和复杂逻辑 Tomcat调优主要内容 1。增加最大连接数 2。调整工作模式 3。启用gzip压缩 4。调整JVM内存大小 5。作为web服务器时与Apache整合或Nginx 6。合理选择垃圾回收算法 7。尽量使用较新版的JDK 生产环境实例 Connectorport8080protocolorg。apache。coyote。http11。Http11NioProtocol maxThreads1000 minSpareThreads100 maxSpareThreads200 acceptCount900 disableUploadTimeouttrue connectionTimeout20000 URIEncodingUTF8 enableLookupsfalse redirectPort8443 compressionon compressionMinSize1024 compressableMimeTypetexthtml,textxml,textcss,textjavascript 参数说明: org。apache。coyote。http11。Http11NioProtocol:调整工作模式为Nio maxThreads:最大线程数,默认150。增大值避免队列请求过多,导致响应缓慢。 minSpareThreads:最小空闲线程数 maxSpareThreads:最大空闲线程数,如果超过这个值,会关闭无用的线程。 acceptCount:当处理请求超过此值时,将后来请求放到队列中等待。 disableUploadTimeout:禁用上传超时时间 connectionTimeout:连接超时,单位毫秒,0代表不限制 URIEncoding:URI地址编码使用UTF8 enableLookups:关闭dns解析,提高响应时间 compression:启用压缩功能 compressionMinSize:最小压缩大小,单位Byte compressableMimeType:压缩的文件类型 Tomcat的三种工作模式:Bio、Nio和Apr工作原理分别为 Bio(BlockingIO):默认工作模式阻塞式IO操作没有任何优化技术处理性能比较低 Nio(NewIOorNonBlocking):非阻塞式IO操作有BIO更好的并发处理性能 Apr(apacheportableruntime,apache可移植运行库):首选工作模式主要为上层的应用程序提供一个可以跨越多操作系统平台使用的底层支持接口库 Tomcat利用基于APR库Tomcatnative来实现操作系统级别控制提供一种优化技术和非阻塞式IO操作大大提高并发处理能力 但是需要安装APR和Tomcatnative库 Java性能问题主要来自于jvmjvmGC也比较复杂 1、jvm内存划分为年轻代(YoungGeneration)、年老代OldGeneration)、永久代(PermanentGeneration) 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会对老年代进行完全的垃圾回收(FullGC) 如果GC后还是无法存放从survivor区复制过来的对象就会出现OOM 8、永久代:也称为方法区存放静态类型数据比如类方法属性等 垃圾回收算法 1、标记清除 2、复制 3、标记整理 垃圾收集器 单线程多线程收集器 GMS收集器 JAVAOPTSserverXms1024mXmx1536mXX:PermSize256mXX:MaxPermSize512mXX:UseConcMarkSweepGCXX:UseParallelGCThreads8XX:CMSInitiatingOccupancyFraction80XX:UseCMSCompactAtFullCollectionXX:CMSFullGCsBeforeCompaction0XX:PrintGCXX:PrintGCDetailsXX:PrintGCTimeStampsXloggc:。。logsgc。log 参数描述 Xms堆内存初始大小单位M、G Xmx堆内存最大允许大小一般不要大于物理内存的80 XX:PermSize非堆内存初始大小一般应用设置初始化200M最大1024M就够了 XX:MaxPermSize非堆内存最大允许值 XX:UseParallelGCThreads8并行收集器线程数同时有多少个线程进行垃圾回收一般与CPU数量相等 XX:UseParalle101dGC指定老年代为并行收集 XX:UseConcMarkSweepGCCSM收集器 XX:UseCMSCCompactAtFullCollection开启内存空间压缩和整理防止过多内存碎片 XX:CMSFullGCsBeforeCompaction0表示多少次FullGC后开始压缩和整理0表示每次FullGC后立即执行压缩和整理 XX:CMSInitiatingOccupancyFracetion80表示老年代内存空间使用80时开始执行CMS收集防止过多的FullGC 注意:不是jvm内存设置越大越好具体还是根据项目对象实际占内存大小而定可以通过java自带的分析工具来查看 如果设置过大会增加回收实际从而增加暂停应用时间 gzip压缩作用:节省服务器流量和提高网站访问速度客户端请求服务器资源后服务器将资源文件压缩再返回给客户端有客户端的浏览器负责压缩并浏览 Apache和Tomcat结合 由于Tomcat处理静态文件能力远远不足Apache所有用Apache处理静态文件Tomcat负责处理jsp session会话的保持 TomcatSessionID持久化三种方法 session粘性:通过浏览器cookie绑定sessionID通过sticky模式将同一session请求分片到同一Tomcat上 session复制:tomcat通过广播形式将session同步到其它Tomcat节点并且Linux下要手动开启开放广播地址不宜后端节点过多 session保持数据库(memcacheredis):将sessionID保存在共享的数据库中 OOM异常的几个原因 老年代内存不足:java。lang。OutOfMemoryError:Javaheapspace 永久代内存不足:java。lang。OutOfMemoryError:PermGenspace 代码bug占用内存无法及时回收