java 压测 如何调试线程池,day03_ 单体架构之tomcat优化

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、测试次数,通过次数获取的数据综合评判本次测试的结论。

e4c3513fdd63464e20885ede9ca84111.gif

标签:架构,tomcat,day03,XX,线程,内存,IO,优化

来源: https://blog.csdn.net/weixin_45388641/article/details/100145958

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值