网站首页 > 精选教程 正文
java性能优化原则:代码运算性能 内存回收 应用配置(影响java程序注意原因是垃圾回收)
代码层优化:避免过多的循环嵌套 调用和复杂逻辑
Tomcat调优主要内容
1.增加最大连接数
2.调整工作模式
3.启用gzip压缩
4.调整JVM内存大小
5.作为web服务器时 与Apache整合或Nginx
6.合理选择垃圾回收算法
7.尽量使用较新版的JDK
生产环境实例
<Connector port="8080"protocol="org.apache.coyote.http11.Http11NioProtocol"
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 占用内存无法及时回收
- 上一篇: Java Web应用调优线程池:没你想的那么复杂
- 下一篇: Tomcat 和 JVM 的性能调优总结
猜你喜欢
- 2024-09-24 CentOS环境下Nginx实现3台虚拟机负载均衡
- 2024-09-24 JVM调优不知道怎么回答,阿里总结四大模块,学不会就背过来
- 2024-09-24 Tomcat、JVM 参数如何调到性能最好?
- 2024-09-24 Nginx在高并发下的性能优化点!有这篇就够了!
- 2024-09-24 Tomcat 和 JVM 的性能调优总结
- 2024-09-24 Java Web应用调优线程池:没你想的那么复杂
- 2024-09-24 还在不停压榨Tomcat?一份文档带你学习上百种调优方式
- 2024-09-24 《Tomcat和JVM 的性能调优经验总结》
- 2024-09-24 2020最新调优、微服务、框架、分布式指南,我的“大厂”不是梦
- 2024-09-24 linux内核优化--压测调优配置参考
你 发表评论:
欢迎- 最近发表
-
- java 服务之间调用(rpc)(java实现服务器)
- Java机器学习库(Java ML)(二、聚类)
- 「Java库」如何使用优秀的加密库Jasypt来保护你的敏感信息?
- GitHub精选 | 轻量级Android和Java日志库
- Java面试官:MySQL binlog 有什么作用?主从延迟的了解么?
- Excel函数核武器库:50个高频场景公式——第二弹
- Excel函数核武器库:50个高频场景公式——第一弹
- Spring Cache高性能缓存库 - Caffeine简介
- Java通过Kafka Streams库来实现数据流处理
- 一连问了好几个大佬,竟然都不知道Redis为什么默认16个数据库?
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)