tomcat调优

1、JDK内存优化 修改catalina.sh文件

  

  

  

JAVA_OPTS="-server -Xms512m -Xmx5000m -XX:PermSize=256M -XX:MaxPermSize=512m -XX:NewSize=256m -XX:MaxNewSize=512m -Djava.awt.headless=true "

  

  

-Xms JVM初始分配的堆内存 (默认是物理内存的1/64)

-Xmx JVM最大允许分配的堆内存,按需分配 (默认是物理内存的1/4,建议:物理内存80%)

-Xmn:设置JVM最小内存(128-256m就够了,一般不设置)

  

-XX:PermSize JVM初始分配的非堆内存 初始化永久代保存区大小

-XX:MaxPermSize JVM最大允许分配的非堆内存,按需分配 永久代空间最大值

-XX:NewSize 新生代初始大小

-XX:MaxNewSize 新生代最大大小 默认为16M

-XX:NewRatio 新生代与老年代的比例

  

2、性能优化 https://www.cnblogs.com/xbq8080/p/6417671.htm

  

1. 禁用AJP协议

  

(1)通过禁用AJP协议,达到在集群的时候提高处理请求的时间。

(2)启动tomcat后,不论从刚刚的管理员界面,还是从控制台上(如图1所示)都可以看出,AJP协议是开启的。

  我们要做的就是要将此协议禁用,禁用方法:在server.xml中,将  

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

  注释掉,重新启动tomcat,可以看出控制台上已经不存在上图 黑框中所示的。

  

2. 将BIO通讯模式修改为NIO通讯模式

(1)tomcat通讯协议支持http1.0和1.1,tomcat默认走的是BIO通讯模式,tomcat7和tomcat8之所以默认的都是效率低下的BIO通讯模式,是因为和前面的就项目做兼容。

  (2)在控制台上(如图1所示)或者管理界面都可以看到,tomcat启动的通讯模式是bio的。

  (3)应用场景:tomcat集群的时候,若项目比较新,都是1.5类库之前,即JDK版本大于1.5,可将集群中每一个tomcat的启动模式设置为高并发高性能的应答模式(NIO)。

  (4)配置方法:在server.xml中 ,将 <Connector connectionTimeout="20000" port="8066" protocol="HTTP/1.1" redirectPort="8448"/> 改为:  

<Connector connectionTimeout="20000" port="8066" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8448"/>

  其中,原来的protocol="HTTP/1.1"表示遵循http1.1协议,同时,也是一个最原始的未经优化的通信协议,

  修改之后的 protocol="org.apache.coyote.http11.Http11NioProtocol" ,表示以 NIO模式启动。

  

3. 启用外部连接池,来满足高并发已经复用的请求

  

 maxThreads:tomcat起动的最大线程数,即同时处理的任务个数,默认值为200。将

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="300" minSpareThreads="4"/>

注释打开,并修改maxThreads的值,然后在<Connector connectionTimeout="20000" port="8066" protocol="org.apache.coyote.http11.Http11NioProtocol"/>

中加入 executor="tomcatThreadPool",即最后为:

<Connector connectionTimeout="20000" port="8066" executor="tomcatThreadPool" protocol="org.apache.coyote.http11.Http11NioProtocol"/>

根据业务场景和服务器硬件资源条件可以适当的加大线程连接池,根据第三方工具去开启并发测试来确定一个最好的连接池数。

4. 优化连接器

最佳实践:

<Connector port="8066" executor="tomcatThreadPool" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
enableLookups="false"
maxPostSize="10485760"
URIEncoding="UTF-8"
useBodyEncodingForURI="true"
acceptCount="100"
acceptorThreadCount="2"
disableUploadTimeout="true"
maxConnections="10000"
SSLEnabled="false"
/>

5. 在tomcat中设置JVM参数

修改bin/catalina.bat文件设置参数(注释后第一行),增加

set JAVA_OPTS=-Dfile.encoding=UTF-8
-server
-Xms1024m
-Xmx2048m
-XX:NewSize=512m
-XX:MaxNewSize=1024m
-XX:PermSize=256m
-XX:MaxPerPermSize=356m
-XX:NewRatio=2
-XX:MaxTenuringThreshold=50
-XX:+DisableExplicitGC

 -Xms:设置JVM初始内存大小(默认是物理内存的1/64)

-Xmx:设置JVM可以使用的最大内存(默认是物理内存的1/4,建议:物理内存80%)

-Xmn:设置JVM最小内存(128-256m就够了,一般不设置)

默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、

-Xmx相等以避免在每次GC 后调整堆的大小。

 在较大型的应用项目中,默认的内存是不够的,有可能导致系统无法运行。常见的问题是报Tomcat内存溢出错误"java.lang.OutOfMemoryError:Java heap space",从而

导致客户端显示500错误。

-XX:PermSize :为JVM启动时Perm的内存大小

-XX:MaxPermSize :为最大可占用的Perm内存大小(默认为32M)

-XX:MaxNewSize,默认为16M

  

PermGen space的全称是Permanent Generationspace,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到

PermGenspace中,它和存放类实例(Instance)的Heap区域不同,GC(GarbageCollection)不会在主程序运行期对PermGenspace进行清理,所以如果你的应用中有很CLASS的

话,就很可能出现"java.lang.OutOfMemoryError:PermGen space"错误。

对于WEB项目,jvm加载类时,永久域中的对象急剧增加,从而使jvm不断调整永久域大小,为了避免调整),你可以使用更多的参数配置。如果你的WEBAPP下都用了大量的第三

方jar, 其大小超过了jvm默认的大小,那么就会产生此错误信息了。

  

其它参数:

  

-XX:NewSize :默认为2M,此值设大可调大新对象区,减少FullGC次数

-XX:NewRatio :改变新旧空间的比例,意思是新空间的尺寸是旧空间的1/8(默认为8)

-XX:SurvivorRatio :改变Eden对象空间和残存空间的尺寸比例,意思是Eden对象空间的尺寸比残存空间大survivorRatio+2倍(缺省值是10)

-XX:userParNewGC 可用来设置并行收集【多CPU】

-XX:ParallelGCThreads 可用来增加并行度【多CPU】

-XXUseParallelGC 设置后可以使用并行清除收集器【多CPU】

  

 

  

  

  

下载方式:https://pan.quark.cn/s/a4b39357ea24 布线问题(分支限界算法)是计算机科学和电子工程领域中一个广为人知的议题,它主要探讨如何在印刷电路板上定位两个节点间最短的连接路径。 在这一议题中,电路板被构建为一个包含 n×m 个方格的矩阵,每个方格能够被界定为可通行或不可通行,其核心任务是定位从初始点到最终点的最短路径。 分支限界算法是处理布线问题的一种常用策略。 该算法与回溯法有相似之处,但存在差异,分支限界法仅需获取满足约束条件的一个最路径,并按照广度先或最小成本先的原则来探索解空间树。 树 T 被构建为子集树或排列树,在探索过程中,每个节点仅被赋予一次成为扩展节点的机会,且会一次性生成其全部子节点。 针对布线问题的解决,队列式分支限界法可以被采用。 从起始位置 a 出发,将其设定为首个扩展节点,并将与该扩展节点相邻且可通行的方格加入至活跃节点队列中,将这些方格标记为 1,即从起始方格 a 到这些方格的距离为 1。 随后,从活跃节点队列中提取队首节点作为下一个扩展节点,并将与当前扩展节点相邻且未标记的方格标记为 2,随后将这些方格存入活跃节点队列。 这一过程将持续进行,直至算法探测到目标方格 b 或活跃节点队列为空。 在实现上述算法时,必须定义一个类 Position 来表征电路板上方格的位置,其成员 row 和 col 分别指示方格所在的行和列。 在方格位置上,布线能够沿右、下、左、上四个方向展开。 这四个方向的移动分别被记为 0、1、2、3。 下述表格中,offset[i].row 和 offset[i].col(i=0,1,2,3)分别提供了沿这四个方向前进 1 步相对于当前方格的相对位移。 在 Java 编程语言中,可以使用二维数组...
源码来自:https://pan.quark.cn/s/a4b39357ea24 在VC++开发过程中,对话框(CDialog)作为典型的用户界面组件,承担着与用户进行信息交互的重要角色。 在VS2008SP1的开发环境中,常常需要满足为对话框配置个性化背景图片的需求,以此来化用户的操作体验。 本案例将系统性地阐述在CDialog框架下如何达成这一功能。 首先,需要在资源设计工具中构建一个新的对话框资源。 具体操作是在Visual Studio平台中,进入资源视图(Resource View)界面,定位到对话框(Dialog)分支,通过右键选择“插入对话框”(Insert Dialog)选项。 完成对话框内控件的布局设计后,对对话框资源进行保存。 随后,将着手进行背景图片的载入工作。 通常有两种主要的技术路径:1. **运用位图控件(CStatic)**:在对话框界面中嵌入一个CStatic控件,并将其属性设置为BST_OWNERDRAW,从而具备自主控制绘制过程的权限。 在对话框的类定义中,需要重写OnPaint()函数,负责用图片资源并借助CDC对象将其渲染到对话框表面。 此外,必须合理处理WM_CTLCOLORSTATIC消息,确保背景图片的展示不会受到其他界面元素的干扰。 ```cppvoid CMyDialog::OnPaint(){ CPaintDC dc(this); // 生成设备上下文对象 CBitmap bitmap; bitmap.LoadBitmap(IDC_BITMAP_BACKGROUND); // 获取背景图片资源 CDC memDC; memDC.CreateCompatibleDC(&dc); CBitmap* pOldBitmap = m...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值