浅谈数据库、JVM、缓存、SQL等性能调优的方法和原理。2.减少DNS查询3.将css放在页面顶部,js放在页面底部4.压缩js和css以减小文件大小,去除不必要的空白,格式化字符和注释(即格式化代码)5.提取js和css放到外部文件中。此项要灵活运用。把js和css抽出来放在外部文件的好处是:减少html的体积,提高js和css的复用性,提高以后的可维护性缺点:增加http请求,不过这个可以通过缓存解决。页面中什么情况下会写js和css?分几种情况:js、css代码比较少;在其他地方,浏览器向服务请求一个页面,服务器告诉浏览器请求的页面已经转移到另一个页面,并告知另一个页面的地址,然后浏览器向重定向的地址发送请求。这会增加服务器和浏览器之间的往返次数,影响网站性能。重定向状态码为:301***Redirection302TemporaryRedirection。304notmodified并不是真正的重定向,它是用来告诉浏览器get请求的文件在缓存中,避免重新下载。7、去除重复脚本8、使用ajax缓存Ajax的get和post方法:只要是浏览器的get请求,浏览器都会使用缓存。对于同一个地址请求,服务器会向浏览器发送一个304状态码,浏览器会使用缓存中的数据。每次都会执行post请求。浏览器不会缓存9.使用Gzip压缩10.使用CDN(ContentDistributionNetwork)第二:数据库调优数据库调优,大体分为以下三个部分:1.SQL调优:主要是索引,减少交叉表、大数据连接查询等2.优化数据库端架构设计:通过读写分离调整对数据库的写操作,通过垂直拆分和解决数据库端连接池瓶颈等问题水平拆分(分库分表)。3、连接池调优通过熟悉连接池的原理和具体的连接池监控数据,可以不断调试最终的连接池参数。第三:通过缓存降低后端压力。目前分布式缓存比较成熟。常见的有redis、memcached、开源的淘宝分布式Tair。选型注意事项如果数据量较小,不会频繁增长和清空(会导致频繁垃圾回收),那么可以选择本地缓存。具体来说,如果需要一些策略支持(比如全缓存逐出策略),可以考虑Ehcache;如果不需要,可以考虑HashMap;如果需要考虑多线程并发场景,可以考虑ConcurentHashMap。缓存会不会满了,缓存满了怎么办?对于一个缓存服务来说,从理论上讲,随着缓存数据量的增加和容量的限制,缓存肯定有一天会被填满。如何处理?①为缓存服务,选择合适的缓存驱逐算法,比如最常见的LRU。②针对当前设置的容量,设置一个合适的警告值,比如10G缓存。当缓存数据达到8G时,会发出告警,提前排查问题或扩容。③对于一些不需要长期保存的key,尽量设置一个过期时间。第四:数据请求转化为异步使用场景。用户不关心或者用户不需要马上得到这些东西的处理结果。这种情况比较适合异步处理。这里的原则是能异步就异步。通常的做法是创建一个额外的线程。这里可以使用额外的线程或者使用线程池,在IO线程(处理请求响应)以外的线程中处理相应的任务。在IO线程中,让response先返回。如果异步线程处理的任务设计的数据量非常大,那么可以引入阻塞队列BlockingQueue进一步优化。具体做法是让一组异步线程不断的往阻塞队列中丢数据,然后再设置一个额外的处理线程从队列中分批取出一批预设大小的数据进行批处理(比如发送一个批远程服务请求),这进一步提高了性能。另一种方法是使用消息队列(MQ)中间件服务,它本质上是异步的。第五:什么时候调JVM?通过监控系统,监控机器的一些关键指标(gc时间、gc计数、每一代的内存大小变化、机器的负载值和CPU使用率、JVM的线程数等)报警,还可以查看gclog、jstat等命令的输出,结合线上JVM进程服务的一些关键接口的性能数据和请求经验,基本可以定位当前JVM是否有问题,是否需要进行调整。调优工具:Jconsole、jProfile、VisualVMJconsole:jdk自带,功能简单,但系统有一定负载时可以使用。垃圾收集算法有非常详细的跟踪。详细使用说明参考这里的JProfiler:商业软件,需要付费。强大的。详细使用说明参考VisualVM:JDK自带强大功能,类似JProfiler。推荐。怎么调?观察内存释放、集合类检查和对象树。这些调优工具都提供了强大的功能,但总的来说,一般分为以下几类功能。堆信息查看可以查看堆空间分配(新生代、老年代、永久代分配)提供即时垃圾回收功能垃圾监控(长期监控回收)查看堆中的类和对象信息:查看数量以及对象引用的类型等。有了查看堆信息的功能,我们一般可以顺利解决以下问题:--老年代和新生代的大小划分是否合理--内存泄漏--是否有垃圾采集算法设置是否合理线程监控线程信息监控:系统线程数。线程状态监控:每个线程处于什么状态?Dumpthreaddetails:查看线程内部运行状态。死锁检查热点分析。CPU热点:查看系统中哪些方法占用CPU时间较多。内存热点:检查系统中有哪些对象。Quantity***(一定时间内存活对象和销毁对象一起统计)这两个东西对系统优化很有帮助。基于我们发现的热点,我们可以有针对性地寻找系统瓶颈,优化系统,而不是漫无目的地优化所有代码。快照快照是系统运行到某一时刻的定格画面。我们在调优的时候,不可能用眼睛跟踪所有的系统变化。依靠快照功能,我们可以对系统的两个不同运行时、不同对象(或类、线程等)进行对比,从而快速发现问题。例如,我想检查系统执行垃圾收集后是否有任何对象应该被回收。然后,我可以对垃圾回收前后的堆情况进行快照,然后对比两次快照的对象情况。内存泄漏检查内存泄漏是一个比较常见的问题,解决方法也比较笼统。这里可以重点介绍一下,线程和热点的问题都详细分析了。内存泄漏一般可以理解为系统资源(资源、堆、栈、线程等各方面)使用不当,导致使用了无法回收(或不回收)的资源,导致无法完成新的资源分配请求,导致系统错误。内存泄漏对系统的危害更大,因为它会直接导致系统崩溃。性能调优小结:大型网站的性能瓶颈大多在数据库端,所以性能调优总是围绕着如何降低后端的压力进行操作。数据库端的瓶颈往往会引起应用端的雪崩(例如:Long,longtransactions)等,所以需要及时解决后端性能问题。1、通过读写分离、垂直拆分、水平拆分,减轻数据库后台压力。2、通过优化sql语句、索引等,缩短sql的查询时间。2、使用缓存和CDN解决图片、文件等的读取操作,避免对数据库造成压力。3、通过优化web端,压缩js、css等,提高大文件的读取时间,尽量依赖CDN。4、还有一个重点就是监控:及时监控JVM、线程、sql查询时间等健康指标,通过监控及时发现瓶颈,及时优化。
