欢迎来到天天文库
浏览记录
ID:37581583
大小:252.93 KB
页数:11页
时间:2019-05-25
《javaee构建可扩展的Java》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、javaee:构建可扩展的JavaEE应用(一)疯狂代码http://CrazyCoder.cn/ĵ:http:/CrazyCoder.cn/Java/Article6598.html对于个具备使用价值应用而言其使用者有可能会在段时间内疯狂增长随着越来越多关键性质应用在JavaEE上运行很多Java开发者也开始关注可扩展性问题了但目前来说大部分web2.0站点是基于script语言编写对于Java应用可扩展能力很多人都抱着质疑态度在这篇文章中WangYu基于他本身在实验室项目经验来展示如何构建可扩展java应用同时
2、基于些在可扩展性上做比较失败项目给读者带来构建可扩展java应用实战、理论、算法、框架和经验我直为家互联网性质实验室工作这个实验室采用我们公司最新大型服务器环境为合作伙伴产品和解决方案免费做性能测试我工作部分就是帮助他们在强大CMT和SMP服务器上进行性能调优这些年来我已经为区别解决方案测试了数十种java应用许多产品都是为了解决同样领域问题因此这些产品功能基本都是类似但在可扩展性上表现却非常区别其中有些不能扩展到64CPU服务器上运行但可以扩展到20台服务器做集群运行有些则只能运行在不超过2CPU机器上造成这些差
3、别原因在于设计产品时架构愿景所有具备良好扩展性java应用从需求需求阶段、系统设计阶段以及实现阶段都为可扩展性做了考虑所以你所编写java应用可扩展能力完全取决于你愿景可扩展性作为系统属性的是个很难定义名词经常会和性能混淆当然可扩展性和性能是有关系它目是为了达到高性能但是衡量可扩展性和性能思路方法是不样在这篇文章中我们采用wikipedia中定义:可扩展性是系统、网络或进程可选属性的它表达含义是可以以种优雅方式来处理不断增长工作或者以种很明白方式进行扩充例如:它可以用来表示系统具备随着资源(典型有硬件)增加提升吞吐
4、量能力垂直扩展意思是给系统中单节点增加资源典型是给机器增加CPU或内存垂直扩展为操作系统和应用模块提供了更多可共用资源因此它使得虚拟化技术(应该是指在台机器上运行多个虚拟机)能够运行更加有效水平扩展意思是指给系统增加更多节点例如为个分布式软件Software系统增加新机器个更清晰例子是将台web服务器增加为3台随着计算机价格不断降低以及性能不断提升以往需要依靠超级计算机来进行高性能计算应用(例如:地震分析、生物计算等)现在可以采用这种多个低成本应用来完成由上百台普通机器构成集群可以达到传统基于RISC处理器科学计算
5、机所具备计算能力这篇文章第部分来讨论下垂直扩展Java应用如何让JavaEE应用垂直扩展很多软件Software设计人员和开发人员都认为功能是产品中最重要原因而性能和可扩展性是附加特性和功能完成后才做工作他们中大部分人认为可以借助昂贵意见来缩小性能问题但有时候他们是错上个月我们实验室中有个紧急项目合作伙伴提供产品在他们客户提供CPU机器上测试未达到性能要求因此合作伙伴希望在更多CPU(8CPU)机器上测试他们产品但结果却是在8CPU机器上性能反而比4CPU机器更差为什么会这样呢?首先如果你系统是多进程或多线程并且已
6、经用尽了CPU资源那么在这种情况下增加CPU通常能让应用很好得到扩展基于java技术应用可以很简单使用线程Java语言不仅可以用来支持编写多线程应用同时JVM本身在对java应用执行管理和内存管理上采用也是多线程方式因此通常来说Java应用在多CPU机器上可以运行更好例如Beaweblogic、IBMWebsphere、开源Glassfish和Tomcat等应用服务器运行在JavaEE应用服务器中应用可以立刻从CMT和SMP技术中获取到好处但在我实验室中我发现很多产品并不能充分使用CPU有些应用在8CPU服务器上只
7、能使用到不到20%CPU像这类应用即使增加CPU也提升不了多少热锁(HotLock)是可扩展性关键障碍在Java中用来协调线程最重要工具就是synchronized这个关键字了由于java所采用规则包括缓存Cache刷新和失效Java语言中synchronized块通常都会其他平台提供类似机制更加昂贵即使只是个运行在单处理器上单线程个synchronized思路方法也会比非同步思路方法慢要检查问题是否为采用synchronized关键字造成只需要像JVM进程发送个QUIT指令(译者注:在linux上也可以用kill
8、-3PID方式)来获取线程堆栈信息如果你看到类似下面线程堆栈信息那么就意味着你系统出现了热锁问题:.."Thread-0"prio=10tid=0x08222eb0nid=0x9waitingformonitorentry[0xf927b000..0xf927bdb8]attestthread.WaitThread.run(WaitThread.java:3
此文档下载收益归作者所有