Java Web项目性能提升的一些思路

Defonds
Java领域优质创作者
博客专家认证
2013-12-13 05:11:45
加精
总结了一些关于 Java Web 项目性能提升的意见(很多是前人总结出来的,也有有自己摸索出来的,还有同事帮忙指点到的,谢谢他们),欢迎网友们进来补充,也欢迎各种板砖。本文已同步到 CSDN 博客,地址是:http://blog.csdn.net/defonds/article/details/17304931

废话少说,上些干货:

使用 Nginx 作为前端接入
用 Nginx 进行动静分离。这个不用多讲,新浪、网易、淘宝、腾讯等巨头的使用已经说明了一切。
保持最简单的架构
遵守 KISS 原则(Keep it simple and stupid)。尽量不要考虑项目外的重用。过多的考虑项目外的重用,必然会增加项目的复杂度。避免过度集成,让每个模块只做自己的事,这对于日后的维护和模块复用都有好处。
精心设计缓存处理、毫不吝啬代码(对象、列表、片段)
对于门户网站的首页来说,往往可能会有近百个 SQL。用户并发上去以后,光首页就足以让服务器 down 掉。缓存不有利于降低负载,而且还能提高响应速度。
调整使用聚集索引
对于每个表来讲,聚集索引只有一个,利用好了,查询速度会有意想不到的提升效果。
使用 /dev/shm 来存储缓存的磁盘文件
在网站运维中,利用好了这一点,往往有意想不到的收获。以 tomcat 为例,可以通过修改 catalina.sh 中的 CATALINA_TMPDIR 值的路径来将缓存设置为 /dev/shm。
以 OSC 为例,他们就是纯 Java 写的,部署在 tomcat 下。在长时间的在线运行之后,管理员发现网站响应速度奇慢,服务器负载正常,又找不出是哪里的问题。后来 df 一下,发现 tomcat 临时目录下的文件足足有 8G 之多,原来是 CPU 等待磁盘操作造成响应速度加长。于是他们将临时目录映射到 /dev/shm,网站响应速度从此奇快。
分析系统中每一个 SQL 的执行效率
以 MySql 为例,对于每个 SQL 最好都 explain 一下。对于有明显效率问题的,通过 sql 优化、调索引等方法进行改进。
健康慢查询日志,检查所有执行超过 100 毫秒的 SQL
对于上线了的项目,健康慢查询日志,检查所有执行超过 100 毫秒的 SQL,看看有没有优化余地。对于没有上线的项目,可以进行场景模拟对嫌疑 SQL,或者对频繁使用的 SQL 进行性能测试,统计它们执行时间,得出平均值,画出曲线分析图,对于单表千万数据,执行时间超过 50ms 的 SQL 要重点关注。参考《sql 性能测试例子》。


末了,帮自己的 CSDN 博客之星拉个选票。页面是http://vote.blog.csdn.net/blogstaritem/blogstar2013/defonds
进入这个页面后,点击“投他一票”按钮就可以啦。在此先谢谢啦!
...全文
4269 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangsufu77 2014-01-28
  • 打赏
  • 举报
回复
性能是javaweb的顽疾。
ltgg2010 2014-01-10
  • 打赏
  • 举报
回复
coolbamboo2008 2014-01-02
  • 打赏
  • 举报
回复
不错,学习了
wang1083292853 2014-01-02
  • 打赏
  • 举报
回复
java.lang.NoClassDefFoundError: org/hibernate/SessionFactory at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2442) at java.lang.Class.getDeclaredMethods(Class.java:1808) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.buildLifecycleMetadata(InitDestroyAnnotationBeanPostProcessor.java:194) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.findLifecycleMetadata(InitDestroyAnnotationBeanPostProcessor.java:176) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessMergedBeanDefinition(InitDestroyAnnotationBeanPostProcessor.java:122) at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessMergedBeanDefinition(CommonAnnotationBeanPostProcessor.java:277) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyMergedBeanDefinitionPostProcessors(AbstractAutowireCapableBeanFactory.java:798) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:493) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:563) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:872) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:423) at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:276) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:197) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4779) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5273) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:895) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:871) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:615) at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1099) at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1621) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) at java.util.concurrent.FutureTask.run(FutureTask.java:166) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) at java.lang.Thread.run(Thread.java:722) Caused by: java.lang.ClassNotFoundException: org.hibernate.SessionFactory at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1711) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1556) ... 34 more
zeroman0 2013-12-26
  • 打赏
  • 举报
回复
lz 总结的非常不错,建议再细粒度一些 另外对于web开发来讲,http协议是非常重要的一部分,像expires, keep-alive, content-encoding等字段都是需要逐一琢磨的(lz所说的动静分离细化),需要结合项目特点和网络的架构进行优化 。 另推荐书籍 <http协议权威指南>,个人感觉是web开发的必读书目,当查询手册也是非常不错的
zeroman0 2013-12-26
  • 打赏
  • 举报
回复
引用 4 楼 defonds 的回复:
引用 3 楼 u010684923 的回复:
nginx在linux下那是没得说,如果在windows下,我测试过,性能不如apache httpd。
Nginx 不是为 Windows 而写
+1
tetsuya 2013-12-24
  • 打赏
  • 举报
回复
学习了
放纵的青春 2013-12-24
  • 打赏
  • 举报
回复
嗯 目前都这么用了 但是缓存为了赶进度就没用了 直接拿数据库 哎
ltgg2010 2013-12-24
  • 打赏
  • 举报
回复
学习了!!!!!!!!
wangsufu77 2013-12-24
  • 打赏
  • 举报
回复
cocoshirley99 2013-12-23
  • 打赏
  • 举报
回复
正好要找这个,很不错,多谢分享
lewis_gong 2013-12-20
  • 打赏
  • 举报
回复
好东西啊啊啊
  • 打赏
  • 举报
回复
有点意思。 针对linux平台的。
wangcoco2013 2013-12-20
  • 打赏
  • 举报
回复
学习了,谢谢分享
  • 打赏
  • 举报
回复
好像很吊的样子
王文的王 2013-12-19
  • 打赏
  • 举报
回复
学习了。。。
niukq0123 2013-12-18
  • 打赏
  • 举报
回复
学习中,参考经验
jinghuihui 2013-12-18
  • 打赏
  • 举报
回复
学习了,分享的不错
云满笔记 2013-12-18
  • 打赏
  • 举报
回复
反正哪里都需要优化 这就对了 任何一点的局部问题都会影响到全局的
lei_yi_jing_123456 2013-12-18
  • 打赏
  • 举报
回复
学习了,刚好在学习性能分析
加载更多回复(25)

23,404

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧