你是否正在寻找扩展Java应用的方法?但是我要告诉你一个不幸的消息:你的Java应用很可能不能扩展。Java应用的扩展能力不好。习惯它,是因为它很简单。 现在,我知道你在想什么了。
你认为这个简单的断言是错误的;毕竟,所有那些基于Servlet和JSP的应用,虽然是编写于10年前,但都可以毫无问题地在JAVA虚拟机(JVM)运行,并分散在水平和垂直扩展集群上。确实,这些应用的扩展性好一些。但是,当把较大的JAVA应用扩展到大量的处理器上,就会出现问题了。 Java扩展性问题 你是知道的,Java的扩展性问题不会露出它丑陋的一面,直到把它们移植到大的多处理器系统上。
Java的扩展性在两……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
你是否正在寻找扩展Java应用的方法?但是我要告诉你一个不幸的消息:你的Java应用很可能不能扩展。Java应用的扩展能力不好。习惯它,是因为它很简单。
现在,我知道你在想什么了。你认为这个简单的断言是错误的;毕竟,所有那些基于Servlet和JSP的应用,虽然是编写于10年前,但都可以毫无问题地在JAVA虚拟机(JVM)运行,并分散在水平和垂直扩展集群上。确实,这些应用的扩展性好一些。但是,当把较大的JAVA应用扩展到大量的处理器上,就会出现问题了。
Java扩展性问题
你是知道的,Java的扩展性问题不会露出它丑陋的一面,直到把它们移植到大的多处理器系统上。Java的扩展性在两三个,或者是五六个处理器可以表现的很好,但一旦处理器超过个位数,那么Java的扩展性是不会呈线性增长的,如果扩展性不线性增长,那么它也就没有什么扩展了。
如果我们有两处理在运行,那我们就希望程序能以像在一个处理器时的两倍速度运行。而8个处理器就应该是4个处理器的2倍,以此类推,呈线性增长。事实上,没有哪一个系统的扩展性能线性增长,但线性扩展一直都是我们的目标。不幸,Java应用并没有接近线性扩展,这就是为什么把其归咎于锁定了。
对象对Java语言的基本构建块。对象包含数据,有时对象指向包含其它对象的数据。随着Java应用越来越复杂,越来越多的列表、数组支持对象和数据,而随着越来越多的列表、数组支持数据块,并间接地指向其他的数据部分,跟踪是谁,在哪里指向了什么,变得非常的困惑。
为了维持表面秩序,当程序的一部分(我们称作方法A)需要访问量数据时,并发Java应用就会使用线程来锁定数据块。如果程序的另一部(方法B)也需要访问同一个数据块时,方法B会被拒绝,并等待方法A完成并解锁数据。
在Java应用中抛出越多的处理器,这种冲撞的机率就越高,最后你就撞到点子上了,整个JVM陷入了管理、操纵解锁过程的泥沼中。最终达到的效果是,增加一个处理器就像在开发团队增加一个神秘人一样富有成效。
“Java提供了线程和锁作为操作过程最早的并行程序模型。它很简单,很直接,但却是一个昂贵的模型。事实证明,在大的应用中进行实践,除非你到处都添加上锁,不然很难做出正确的编码。这样的结果就是你的程序不能进行扩展,因为所有线程都在竞争锁,尤其是没有一个可用的底层数据急用时,竞争会更激烈。” Cliff Click在早期的这一主题讨论上的如此说。“JVM使其向廉价廉价再廉价锁迈进了一大步,但最终也不会使成本消失的。”
扩展Java也许并不是大问题
Java应用扩展不必惊恐到如此程度。不必抛弃所有过去创建的Java应用,而用.NET完全代替。好消息是,很少有应用程序曾经打破进8或16处理器的机器上的成规。
记住,问题往往发生在大量的处理竞争同一数据块时。当你有大量的小的,独立的,设备其全的,个体的应用要部署的多核,多处理器的服务器上时,你永远也体会不到这个关于扩展性的特殊问题。没有一个个体应用会把重要负载放在支持多于一个,甚至两个处理器的系统上,这也意味着死锁和数据冲突不可能会成为问题。
对于大多数用户, Java应用程序实现线性扩展这个问题简直是微不足道的——就像是带到宴会上的东西或冷水机旁的东西,并不是需要的整个企业架构重新设计的问题。但是如果Java应用确实达到了线性扩展的底限,怎么做?这有Java扩展悖论的解决方案,在文章的第二部分有讨论。
相关推荐
-
.NET架构师:函数式语言做领域驱动设计
Scott一位.NET架构师,同时也是掌握函数式编程的作者,他很欣赏函数式编程,对于Scott来说,面向对象编程的那些概念也很恐怖,比如多态、泛型、继承、协变等。
-
软件开发就像炒股 关键看你怎么选股票!
本文作者Paulo Ortins在这里分享了对于选择哪种编程语言作为软件开发工作的起点的话题,并阐述了自己的观点。
-
增进离岸Java开发效率的十个提示
近日,Cygnet Infotech公司发布了一篇博文,谈到了如何增进离岸Java开发的效率。众多的ISV与软件厂商总是在不断寻找能以最低的代价实现其业务目标的解决方案。
-
Java性能优化的最差实践
关于Java性能优化的方法已经有很多文章讨论过,其中总有一些不值得提倡甚至应该杜绝的方法,需要让开发者时刻保持警觉。