JVM调优的11个底层细节,能说出这条的都是高手

Posted java涛仔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM调优的11个底层细节,能说出这条的都是高手相关的知识,希望对你有一定的参考价值。

一年一度的双十一购物狂欢节已经过去,前不久的双十二也刚结束,各位的钱包还好吗?不过我们今天不聊购物,来聊聊我们最关心的事情。

历年双11,除销售额屡创新高以外,作为一名合格的互联网民工,我当然更关心,它背后,无数程序员同胞不知道要死多少脑细胞才抗住的并发量。

双11当天,交易峰值曾达到32.5W笔/秒,去年更是几乎实现翻倍,说是全球最大的流量洪峰也不为过。

从刚开始服务器动不动就陷入瘫痪,到现在几乎全程流畅下单连个缓冲都少有,可以说,双十一背后的系统架构已经优化到了极致。拆出来看,我们便得到了一个绝佳的研究案例,这里面涵盖了所有你可能遇到的高并发场景及应对策略。

双十一的核心系统是秒杀+交易双系统,其中的技术难点在于:

· 上亿用户同时访问,如何保证各个功能模块快速响应?

· 成百上千万人同时下单,如何应对流量洪峰?

· 各种读写请求高度复杂,如何保证数据一致性?

以及,各类技术处理细节,包括但不限于Spring/MyBatis/Redis/JVM调优/多线程等等。

这里面单拎出来一点,对缺乏经验的程序员来说,都是巨大的挑战。如果全部掌握,工作中90%以上的问题都能得到轻松解决,出去面试大概率也不会被问倒。要知道,去阿里面P6级别的工程师,也不过如此了。

针对于此,网上的公开资料的深度极其有限,基本都是蜻蜓点水一带而过,我推荐大家参加下面这个实训项目深入学习:

局模块。

针对一线互联网公司金九银十的面试需求,从618、双十一亿级流量电商系统实战项目切入,从原理到实战,深度剖析Java性能调优方案,夯实你的技术栈,让性能调优成为你简历的加分项。

金九银十面试题

京东:说下JVM内存模型与Java线程内存模型的区别?

腾讯:JVM的GC执行时机是任何时候都可以吗?安全点知道吗?

美团:CMS垃圾收集器的并发更新失败是怎么回事?如何优化?

阿里:高并发系统为何建议选择G1垃圾收集器?

拼多多:线上系统GC问题如何快速定位与分析?

阿里:阿里巴巴Arthas实现原理能大概说下吗?

百度:单机几十万并发的系统JVM如何优化?

阿里:解释下JVM垃圾收集底层的三色标记算法?

美团:Volatile底层的内存屏障是如何实现的?

滴滴:能说说Mysql索引底层B+树结构与算法吗?

滴滴:聚集索引与覆盖索引与索引下推到底是什么?

阿里:能说说Mysql并发支撑底层Buffer Pool机制吗?

拼多多:能说下Mysql事务底层实现原理吗?

唯品会:MVCC机制是如何保证事务的隔离性的?

京东:超高并发下使用事务时如何避免死锁?

京东:对线上千万级大表加字段时,性能极慢问题如何处理?

免费领取金九银十VIP专属福利—跳槽加薪必考80道Java经典面试题解析,大厂内部资料,已经有好几个粉丝说看完之后面大厂拿到offer了!

通过学习本课程,你将收获:

1.更加深入理解JVM最底层原理,应对大厂面试从容不迫

2.增强分析、定位与解决大型系统生产环境JVM问题的能力

3.深入理解mysql底层优化原理,更有把握面对关于Mysql优化的面试题

4.分析与优化大型系统线上环境Mysql各种性能问题的能力

5.构建性能稳定的大型分布式系统高并发高可用线上环境的能力

关注我,私信回复:“JVM”免费领取

刷题资料

1000道大厂面试题视频,包括答案已经整理成了文档。

分布式、高并发、微服务100问

阿里、京东、蚂蚁等大厂面试真题解析

80道跳槽涨薪必备精选面试题

2021最新版大厂面试真题集

关注我,私信回复“111”免费获取

tomcat调优的几个方面(转)

tomcat调优的几个方面 

和早期版本相比最新的Tomcat提供更好的性能和稳定性。所以一直使用最新的Tomcat版本。现在本文使用下面几步来提高Tomcat服务器的性能。
  • 增加JVM堆内存大小
  • 修复JRE内存泄漏
  • 线程池设置
  • 压缩
  • 数据库性能调优
  • Tomcat本地库
  • 其它选项



第1步 – 提高JVM栈内存Increase JVM heap memory


你使用过tomcat的话,简单的说就是“内存溢出”. 通常情况下,这种问题出现在实际的生产环境中.产生这种问题的原因是tomcat使用较少的内存给进程,通过配置TOmcat的配置文件(Windows 下的catalina.bat或Linux下的catalina.sh)可以解决这种问题.这种解决方法是通过增加JVM的栈内存实现的.也就是说,JVM通常不去调用垃圾回收器,所以服务器可以更多关注处理web请求,并要求尽快完成。要更改文件(catalina.sh) 位于"\tomcat server folder\bin\catalina.sh",下面,给出这个文件的配置信息,

 


Java代码 
  1. JAVA_OPTS="-Djava.awt.headless=true-Dfile.encoding=UTF-8
  2. -server -Xms1024m -Xmx1024m
  3. -XX:NewSize=512m -XX:MaxNewSize=512m -XX‘\"0\"‘alt=‘\"\"‘src=‘\"static/image/smiley/default/tongue.gif\"‘smilieid=‘\"7\"‘>ermSize=512m
  4. -XX:MaxPermSize=512m -XX:+DisableExplicitGC"
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8-server -Xms1024m -Xmx1024m-XX:NewSize=512m -XX:MaxNewSize=512m -XXermSize=512m-XX:MaxPermSize=512m -XX:+DisableExplicitGC"
-Xms – 指定初始化时化的栈内存
-Xmx – 指定最大栈内存
在重启你的Tomcat服务器之后,这些配置的更改才会有效。下面将介绍如何处理JRE内存泄漏


第2步 – 解决JRE内存泄露

 

性能表现不佳的另一个主要原因是内存泄漏,正如我之前说过:始终使用最新的tomcat服务器以获得更好的性能和可伸缩性。现在,这句话变成真的。如果我们使用最新的tomcat版本6.0.26及以上就可以解决这个错误,因为它包含了一个监听器来处理JRE和PermGen的内存泄漏。使用的监听器是,

Java代码 
  1. <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
你可以在server.xml文件中找到这个监听器的配置,server.xml位置在“tomcat project folder/conf/server.xml”。接下来,我们将看看如何调整连接属性“maxThreads”。 



第3步 – 线程池设置 

线程池指定Web请求负载的数量,因此,为获得更好的性能这部分应小心处理。可以通过调整连接器属性“maxThreads”完成设置。maxThreads的值应该根据流量的大小,如果值过低,将有没有足够的线程来处理所有的请求,请求将进入等待状态,只有当一个的处理线程释放后才被处理;如果设置的太大,Tomcat的启动将花费更多时间。因此它取决于我们给maxThreads设置一个正确的值。 

Java代码 
  1. <Connector port="8080"address="localhost"
  2. maxThreads="250"maxHttpHeaderSize="8192"
  3. emptySessionPath="true"protocol="HTTP/1.1"
  4. enableLookups="false"redirectPort="8181"acceptCount="100"
  5. connectionTimeout="20000"disableUploadTimeout="true"/>
<Connector port="8080" address="localhost"maxThreads="250" maxHttpHeaderSize="8192"emptySessionPath="true" protocol="HTTP/1.1"enableLookups="false" redirectPort="8181" acceptCount="100"connectionTimeout="20000" disableUploadTimeout="true" />
在上述配置中,maxThreads值设定为“250”,这指定可以由服务器处理的并发请求的最大数量。如果没有指定,这个属性的默认值为“200”。任何多出的并发请求将收到“拒绝连接”的错误提示,直到另一个处理请求进程被释放。错误看起来如下,

Java代码 
  1. org.apache.tomcat.util.threads.ThreadPool logFull SEVERE: All threads (250) are
  2. currently busy, waiting. Increase maxThreads (250) or check the servlet status
org.apache.tomcat.util.threads.ThreadPool logFull SEVERE: All threads (250) arecurrently busy, waiting. Increase maxThreads (250) or check the servlet status
如果应用提示上述错误,务必检查上述错误是否是由于单个请求花费太长时间造成的,这个问题的原因是这样的,有时候如果数据库连接不释放的话,进程将不会处理其它请求。


注意: 如果请求的数量超过了“750”,这将不是意味着将maxThreads属性值设置为“750”,它意外着最好使用“Tomcat集群”的多个实例。也就是说,如果有“1000”请求,两个Tomcat实例设置“maxThreads= 500”,而不在单Tomcat实例的情况下设置maxThreads=1000。 

根据我的经验,准确值的设定可以通过将应用在在各种环境中测试得出。接下来,我们来看看如何压缩的MIME类型。

第4步- 压缩



Tomcat有一个通过在server.xml配置文件中设置压缩的选项。压缩可以在connector像如下设置中完成,

Java代码 
  1. <Connector port="8080"protocol="HTTP/1.1"
  2. connectionTimeout="20000"
  3. redirectPort="8181"compression="500"
  4. compressableMimeType="text/html,text/xml,text/plain,application/octet-stream"/>
<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8181" compression="500"compressableMimeType="text/html,text/xml,text/plain,application/octet-stream" />
在前面的配置中,当文件的大小大于等于500bytes时才会压缩。如果当文件达到了大小但是却没有被压缩,那么设置属性compression="on"。否则Tomcat默认设置是“off”。接下来我们将看看如何调优数据库。

 

第5步- 数据库性能调优

 

Tomcat性能在等待数据库查询被执行期间会降低。如今大多数应用程序都是使用可能包含“命名查询”的关系型数据库。如果是那样的话,Tomcat会在启动时默认加载命名查询,这个可能会提升性能。另一件重要事是确保所有数据库连接正确地关闭。给数据库连接池设置正确值也是十分重要的。我所说的值是指Resource要素的最大空闲数(maxIdle),最大连接数(maxActive),最大建立连接等待时间(maxWait)属性的值。因为配置依赖与应用要求,我也不能在本文指定正确的值。你可以通过调用数据库性能测试来找到正确的值。

 

第6步 – Tomcat原生库

 

Tomcat的原生库基于Apache可移植运行时(Apache Portable Runtime简称APR),给程序员提供了超强的扩展性和性能,在产品运作中帮助融合原生的服务器技术以展现最佳的性能。想知道安装说明的朋友请参考Tomcat Native Library – (APR) Installation

 

第7步 – 其他选项

这些选项是:

  • 开启浏览器的缓存,这样读取存放在webapps文件夹里的静态内容会更快,大大推动整体性能。
  • 每当开机时,Tomcat服务器应当自动地重启。
  • 一般情况下HTTPS请求会比HTTP请求慢。如果你想要更好的安全性,即使慢一点我们还是要选择HTTPS。

就这么多啦。在这篇文章里,我教给了大家一些提高Tomcat服务器性能的方法。如果你觉得这篇文章有用,或者你对提高Tomcat服务器性能有别的看法,请不要忘记留下宝贵的评论。祝你今天编程愉快!
































以上是关于JVM调优的11个底层细节,能说出这条的都是高手的主要内容,如果未能解决你的问题,请参考以下文章

JVM 性能调优实战之:一次系统性能瓶颈的寻找过程

JVM常用调优参数 ——JVM篇

jvm调优如何做?

jvm参数解析(含调优过程)

JVM虚拟机---性能调优

JVM调优的几种场景(建议收藏)