1. JVM内存模型
堆的分代
Java的堆是JVM中最大的一块内存区域,主要保存Java中各种类的实例。为了更好的管理堆中各个对象的内存,包括分配内存和回收内存。
JVM将堆分成了几块区域:
新生代(Young)
老年代(Old)
永久代(Perm)
其中新生代占堆的1/3空间,老年代占堆的2/3空间。
而新生代中的Eden占新生代的8/10,From Survivor和To Survivor各占新生代的1/10。
1、一个tomcat能承载请求数?
2、如何提高这个请求数?
3、影响一个系统性能的有网络因素和内存、磁盘等硬件因素。如何在现有硬件条件下,对系统性能进行提升?
a、分析内存的一些异常(内存溢出能否复现)
JAVA_OPTS="-server -Xms256M -Xmx512M -Xss256K -Djava.awt.headless=true -Dfile.encoding=utf-8 -XX:MaxPermSize=256M -XX:PermSize=128M -XX:MaxPermSize=256M"
xms 最小堆内存
xmx 最大堆内存
2. 压测调试工具介绍
2.1 Jmeter
压力测试工具
1、创建线程组:
并发数量(模拟访问用户数)
2.2 Jconsole
Java性能分析工具
3. 案例一:Tomcat优化内存
系统要考虑内存的优化。内存优化考虑因素:
1、GC回收--->内存模型
如何保证GC能将对象正常回收掉
局部变量可以被gc快速回收。
涉及的知识点:
线程
servlet线程模型
线程和内存的关系
一、线程池优化
1.1、线程数优化
maxThreads:最大线程数,默认是200
minSpareThreads:初始线程数,最小空闲线程数。(默认10)
maxSpareThreads:最大空闲线程数,超过的空闲线程会被关闭
acceptCount:最大等待请求数,默认100,当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。
1.2、线程池优化
namePrefix:线程池中线程名称的前缀。
maxThreads:最大线程数
maxIdleTime:超过最小线程数的线程最大等待时间,单位毫秒。
Executor配置的是线程池
name是线程池名称,可以自定义
namePrefix线程池中的线程的名称前缀
maxThreads最大线程数
minSpareThreads 最小空闲线程数(跟CPU核数一致)
maxThreads="300" minSpareThreads="4" />
connectionTimeout="20000"
redirectPort="8443" executor="qianfeng"/>
二、内存优化
打开catalina.bat文件,添加内存配置选项到Catalina.bat文档中,参考如下:
JAVA_OPTS="-server -Xms256M -Xmx512M -Xss256K -Djava.awt.headless=true -Dfile.encoding=utf-8 -XX:MaxPermSize=256M -XX:PermSize=128M -XX:MaxPermSize=256M"
-server:一定要作为第一个参数,在多个CPU时性能佳
-Xms:初始Heap大小,使用的最小内存,cpu性能高时此值应设的大一些。
-Xmx:java heap最大值,使用的最大内存
#-Xms与-Xmx设成一样的值,避免JVM因为频繁的GC导致性能大起大落
上面两个值是分配JVM的最小和最大内存,取决于硬件物理内存的大小,建议均设为物理内存的一半。
-XX:PermSize:设定内存的永久保存区域
-XX:MaxPermSize:(俗称方法区)占整个堆内存的最大值,也称内存最大永久保留区域。
-XX:MaxNewSize:定义单独NEW段的尺寸
-Xss 15120 这使得JBoss每增加一个线程(thread)就会立即消耗15M内存,而最佳值应该是128K,默认值好像是512k.
JVM配置官方文档
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
GC回收官方文档
https://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html
三、I/O运行模式
BIO:阻塞IO流:protocol="HTTP/1.1" (早期版本默认BIO)
NIO:非阻塞IO流(8.0版默认模式,并发性能比较好):protocol=org.apache.coyote.http11.Http11NioProtocol
APR:从操作系统级别来解决并发IO问题:protocol="org.apache.coyote.http11.Http11AprProtocol"
配置server.xml:
connectionTimeout="20000"
redirectPort="8443"/>
内存分析总结
1、内存空间
新生代和年老代空间都被使用完,则会出现内存溢出的BUG。
优化方案:
a、程序代码的优化
尽量不要使用全局变量,特别是在servlet中(单例多线程)。
Springmvc 单例多线程。所以在spring项目中不要有全局变量。不要将数组和集合定义为全局变量。
Session不要保存过大的对象。
对象只要不再使用了,记得释放。
4. Tomcat线程优化
多线程
线程池:
最小线程数
最大线程数
最大休眠时间等等
提升系统的性能
1、使用线程池避免频繁创建线程和回收线程所带来的资源开销。
2、程序代码中,哪些操作有可能影响到线程的优化。
为什么要优化线程池。
5. 线程池优化总结
配置
maxThreads="100" minSpareThreads="10" maxIdleTime="10000"/>
connectionTimeout="20000"
redirectPort="8443" executor="qianfeng"/>
1、让程序代码执行的速度更快。尽快释放线程给下一个人使用。(提高系统的吞吐量===响应速度)。
2、提升现场池的最小线程数,减少大并发环境下的频繁创建线程带来内存开销和增加gc回收的频率。
3、空闲线程的最大等待时间。会导致线程进行了无效的回收。
tomcat I/O优化
因为tomcat请求是一种网络情况,网络请求主要是通过网络IO进行数据传递。
connectionTimeout="20000"
redirectPort="8443" executor="qianfeng"/>
注意:需要下载一个tcnative-1.dll文件拷贝到tomcat的bin目录下。
BIO:阻塞IO流
NIO:非阻塞IO流
应该采用NIO来提高系统性能。
APR:操作系统IO处理技术。(直接利用了操作系统的IO技术)
单体架构tomcat优化
内存
线程池
io流
作业:利用自己二手手机回收的项目优化
建议:刻意降低tomcat的配置
1、优化前
能同时访问的用户数。
访问时间
内存数据
2、优化后
同时访问的用户数
访问系统时间
内存数据
作业建议写测试用例
1、测试目的
2、需要提前准备的环境
(tomcat版本、jdk版本、电脑硬件、网络、内存默认多少、线程池默认多少)
3、测试步骤(看同一个功能点的系统性能,每次只能改变一个因素,其他保持一致,包括测试步骤。每次测试步骤一样)
4、将测试结果预估(现象)。
5、测试次数,通过次数获取的数据综合评判本次测试的结论。
标签:架构,tomcat,day03,XX,线程,内存,IO,优化
来源: https://blog.csdn.net/weixin_45388641/article/details/100145958