精华内容
下载资源
问答
  • 参照以往学者的研究,根据商业商业网点的数目和分布形态对其布局结构和空间形态进行了分类,将其划分为“回”字式、单轴式、层叠式3种结构和与此对应的斑状型、块状型、立体型3种空间形态.基于以上研究,有利于对比各...
  • soa服务划分实例

    千次阅读 2015-08-03 14:18:03
     时间换空间空间换时间  牺牲一定的一致性  二八原则   三、关键技术  1.session处理方式 粘性session session复制 集中式session 不是有session  2.分布式存储  分布式...

     

    传统的IT系统在向互联网化方向转型时,通常需要面对以下几个技术挑战。

     

         ■ 性能。用户体验是影响转化率的重要因素,据统计如果4秒钟打不开网站,将有60%的顾客会流失,糟糕体验将导致大量的客户选择放弃或从竞争对手处购买服务。如何在高并发访问的情况下保证系统的低延迟响应,以提升用户体验。

     

         ■ 伸缩性。互联网/移动互联网用户的访问行为是动态的,在一些特殊的热点引爆后,流量能够通常达到平时的10倍甚至几十倍以上。如何快速响应业务爆发时的资源开销需求,提供无差别的用户体验。

     

         ■ 容错与最大可用性。互联网应用系统基于分布式计算架构部署,基于大量的x86服务器和通用网络设备。而机器一定会坏,当机器数量到一定规模时,小概率事件就成为常态,当硬件出现故障时应该如何自动化处理,人一定会在开发中写出Bug,怎么进行系统的损害控制。如何基于单机QPS和并发数对服务端和客户端进行限流,实现动态流量分配,识别服务之间的依赖链路风险和系统重要功能点依赖,评估最大可能的风险点,分布式系统最大可用性故障检测,对故障模块进行隔离,对未完成事物进行Rollback,通过牺牲非关键功能通过优雅降级保证核心功能可用。

     

         ■ 容量管理。系统性能一定会到达瓶颈,如何进行更科学的容量评估和扩容,自动计算前端请求与后端机器数量的对应关系,对软硬件容量需求进行预测。

     

         ■ 服务化。如何将业务逻辑功能抽象成一个个原子服务,对服务进行封装和组合,并基于分布式系统环境部署,以实现更灵活的业务逻辑和流程。如何从业务视角厘清这些服务的关系,对大规模分布式系统中的单条服务调用链进行跟踪与展现,并能够及时发现服务调用异常。

     

         ■ 低成本。随着系统的演进性能指标不断发生变化,如何保证以最低成本满足特定访问量的要求。

     

         ■ 自动化运维管理。不断发展的大规模系统需要不断维护、快速迭代和优化。如何应对从一台到上千台甚至上万台服务器的运维量变,通过自动化工具和流程管理大规模软硬件集群,对系统进行快速部署、升级、扩容和维护。

     

         随着业务的快速发展,淘宝技术架构经历从最初的LAMP架构,到IOE架构,再到分布式架构,最后到现在的云计算平台架构这一变化过程在不断解决上面的技术问题。

     

     

      淘宝技术架构变迁

     

         自2003年创立以来的,淘宝业务发展非常迅速,几乎是每年以100%的速度在成长。创立之初,为了快速上线,抢占市场,选择了当时流行的LAMP架构,用PHP作为网站开发语言, Linux作为操作系统,Apache作为Web服务器,MySQL为数据库,用了三个月不到的时间淘宝就上线了。当时整个网站应用服务器大概10台左右,MySQL数据库采用了读写分离、一主两备的部署方式。

     

         2004年在淘宝业务发展的推动下,我们参考电信运营商、银行等的一些企业解决方案,将LAMP架构改造为Oracle+IBM小型机的数据库架构和EMC存储方式(图2)。虽然方案成本昂贵,但性能非常好。同时,随着网站流量的增加,系统显得有些不堪重负。当时最担心的问题是网站流量如果持续增加,交易量持续增加,网站的系统架构怎么设计?如何选择数据库?如何选择缓存?如何构建业务系统?……后来参考eBay的互联网设计架构,设计了一个Java的技术方案,并使用了非常多的Java开源产品。例如,选择当时比较流行的JBoss,作为应用服务器;选择一个开源的IOC容器Spring,来管理业务类;封装了一个数据库访问工具IBatis,作为数据库和Java类的Object-Reletionship映射工具。另外,对于商品搜索功能,采用自己开发的ISearch搜索引擎来取代在Oracle数据库中进行搜索,降低数据库服务器的压力。做法比较简单,每天晚上全量将Oracle小型机的数据dump出来,Build成ISearch的索引,当时商品量也不大,一台普通配置的服务器,基本上可以将所有的索引都放进去,没做切分,直接做了一个对等集群。

    做了一个对等集群。

     

    TB1qhq7GVXXXXcHXXXXb.oU6VXX-969-624.jpg

     从2006年开始,淘宝为了改善用户体验,开始建立自己的CDN站点,由于淘宝的主要流量来源于各种商品图片、商品描述等静态数据,自建CDN可以使这些资源离用户更近,提升用户访问速度,改善用户浏览网站的体验。

     

         2007年,淘宝全年的交易额超过400亿元,平均近1亿多一天,每天有100多万笔交易被创建。当时面对的几个主要问题是:一些系统的流量非常大,如商品详情等,如果直接访问数据库,会导致数据库压力非常大;如用户信息,访问一个页面,都需要查询买家信息、卖家信息、显示出买家的信用、卖家的服务星级等。此时,淘宝采用分布式缓存TDBM(Tair的前身)将这些热点静态数据缓存在内存中,提高访问性能。另外,将自己研发的分布式文件系统TFS部署在多台x86服务器上,取代商业的NAS存储设备来存储淘宝的各种文件信息,如商品图片、商品描述信息、交易快照信息,来达到降低成本和提高整体系统的容量和性能的目的,同时可以实现更灵活的扩展性。第一期上线大概200台TFS服务器。另外,将ISearch搜索引擎改为分布式架构,支持水平扩展,部署了48个节点。图3展示了这一架构思路。

     

     

    TB1TcWWGVXXXXXgaXXX8Q.9PFXX-933-620.jpg

    此时引入缓存、分布式存储和分布式搜索引擎都是为了解决oracle的数据库瓶颈,此时还没有达到“去IOE”。

    去IOE是阿里在2008年才提出来的,为了彻底解决Oracle数据库集中式架构的瓶颈问题。

    2008年初,为了解决Oracle数据库集中式架构的瓶颈问题(连接数限制、I/O性能),将系统进行了拆分,按照用户域、商品域、交易域、店铺域等业务领域进行拆分,建立了20多个业务中心,如商品中心、用户中心、交易中心等。所有有用户访问需求的系统,必须使用业务中心提供的远程接口来访问,不能够直接访问底层的MySQL数据库,通过HSF这种远程通信方式来调用业务中心的服务接口,业务系统之间则通过Notify消息中间件异步方式完成调用。图4是淘宝的分布式架构图。

    (是的,阿里在2008年就已经开始使用分布式服务框架hsf,俗称“好舒服”,区别tfs,tfs是阿里的分布式文件系统。

    在2010年的csdn博客 淘宝(taobao)HSF框架就介绍了这个框架:

      随着网站访问量增加,仅仅靠增加机器已不能满足系统的要求,于是需要对应用系统进行垂直拆分和水平拆分。在拆分之后,各个被拆分的模块如何通信?如何保证性能?如何保证各个应用都以同样的方式交互?这就需要一种负责各个拆分的模块间通信的高性能服务框架(HSF)。。。

     

    TB1ltOPGVXXXXcFXFXXx8D1ZpXX-739-623.jpg

     

         从2010年开始,淘宝网重点着眼于统一架构体系,从整体系统层面考虑开发效率、运维标准化、高性能、高可扩展性、高可用、低成本方面的要求,底层的基础架构统一采用了阿里云计算平台(图5),使用了SLB、ECS、RDS、OSS、ONS、CDN等阿里云计算服务,并通过阿里云服务提供的高可用特性,实现双机房容灾和异地机房单元化部署,为淘宝业务提供稳定、高效和易于维护的基础架构支撑。

    TB13c55GVXXXXbOXpXXi1UNJVXX-676-454.jpg

     

         在从IOE架构最终向云计算平台技术架构转移的过程中,主要面临以下几个技术挑战。

     

         ■ 可用性:脱离小型机和高端存储的高冗余机制,采用基于PC服务器的分布式架构的云计算平台能否做到高可用。

     

         ■ 一致性:Oracle基于RAC和共享存储实现的物理级别一致性,基于RDS for MySQL能否达到同样的效果。

     

         ■ 高性能:高端存储的I/O能力很强,基于PC服务器的RDS能否提供同样甚至更高的I/O处理能力,MySQL和Oracle对SQL的处理性能是否相同。

     

         ■ 扩展性:业务逻辑如何拆分,如何服务化,数据分多少库分多少表,什么维度分,后期二次拆分如何更方便等。

     

         基于阿里云计算平台,通过采用合适的技术策略和最佳实践,包括:应用无状态,有效使用缓存(浏览器缓存、反向代理缓存、页面缓存、局部页面缓存、对象缓存和读写分离),服务原子化,数据库分割,异步解决性能问题,最小化事物单元,适当放弃一致性。以及自动化监控/运维手段包括监控预警、配置统一管理,基础服务器监控,URL监控,网络监控,模块间调用监控,智能分析监控,综合故障管理平台,容量管理。可以很好地解决以上问题,从而达到整体系统的高可扩展性、更低的成本、更高的性能和可用性的实现效果。

     

    注(原创):

    在笔者所在的互联网税务公司中,将服务划分为纳税人域、申报缴税域、发票管理域,

    对应nsr(nsr-hxfw-java等)、sbzs(sbzs-hxfw-java等)、sxsq(sxsq-hxfw-java等)

     

     

    淘宝(taobao)架构发展历程

    一、淘宝系统架构    

         2008年,淘宝每天增加800G的数据,高峰期超过30G/s,处理超过1000G的日志,处理40亿次用户请求信息。淘宝架构发展经历了三个阶段。

         第一阶段(V1.0)

         采用经典的LAMP结构,mySQL采用M-S模式,实现了读写分离。后期采用了SQLrelay中间件技术。

         第二阶段(V2.0):

         这一阶段,用java替换了php,引入了MVC框架,使用Antx管理项目,使用了搜索引擎ISearch。在后期,逐渐引入了SPring框架,抛弃了EJB;对数据库实现分库存储;使用了分布式存储和分布式缓存,对搜索引擎升级。

         第三阶段(V3.0):

         在现有框架下增加了应用透明性和数据透明伸缩性的尝试。在应用透明性方面,有了session框架,高性能服务框架HSF,消息系统Notify,建立了业务中心;在数据库透明伸缩性方面,引入分布式数据层TDDL。

     

    二、WEB架构设计

        WEB应用一般采用分层结构,服务器端主要包括展现层、业务逻辑层和持久层。

        1.展现层要实现可扩展,关键是session的处理。

        2.业务逻辑层要实现透明可扩展

    •  建立领域模型
    •  统一、隔离
    •  无状态业务层
    •  负载均衡

        3.持久层透明可扩展

    •   数据库按功能垂直分割,按规则水平分割
    •   时间换空间或空间换时间
    •   牺牲一定的一致性
    •   二八原则

     

    三、关键技术

        1.session处理方式

    • 粘性session
    • session复制
    • 集中式session
    • 不是有session

        2.分布式存储

          分布式存储是相对于集中式存储的一种处理方式,把数据存在在不同的节点上,通过查询位置服务器找到数据所在的节点。提高数据存储的可扩展性和查询效率。

        3.分布式缓存

        见http://rdc.taobao.com/blog/qa/?p=5299,关于Tail的介绍

     

     

     

     

     

    展开全文
  • java堆内存的划分

    千次阅读 2016-04-04 17:57:19
    现在的商业虚拟机都采用这种收集算法来回收新生代,新生代中的对象98%都是“朝生夕死”的,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块比较大的Eden空间和两块较小的Survivor空间,每次使用

    根据对象的存活率(年龄),Java对内存划分为3种:新生代、老年代、永久代

    1、新生代:
    比如我们在方法中去new一个对象,那这方法调用完毕后,对象就会被回收,这就是一个典型的新生代对象。

    现在的商业虚拟机都采用这种收集算法来回收新生代,新生代中的对象98%都是“朝生夕死”的,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块比较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor。当回收时,将Eden和Survivor中还存活着的对象一次性地复制到另外一块Survivor空间上,最后清理掉Eden和刚才用过的Survivor空间。HotSpot虚拟机默认Eden和Survivor的大小比例是8:1,也就是说,每次新生代中可用内存空间为整个新生代容量的90%(80%+10%),只有10%的空间会被浪费。

    当然,98%的对象可回收只是一般场景下的数据,我们没有办法保证每次回收都只有不多于10%的对象存活,当Survivor空间不够用时,需要依赖于老年代进行分配担保,所以大对象直接进入老年代。同时,长期存活的对象将进入老年代(虚拟机给每个对象定义一个年龄计数器)。

    这里写图片描述

    Minor GC和Full GC:
    GC分为两种:Minor GC和Full GC

    Minor GC:

      Minor GC是发生在新生代中的垃圾收集动作,采用的是复制算法。

    对象在Eden和From区出生后,在经过一次Minor GC后,如果对象还存活,并且能够被to区所容纳,那么在使用复制算法时这些存活对象就会被复制到to区域,然后清理掉Eden区和from区,并将这些对象的年龄设置为1,以后对象在Survivor区每熬过一次Minor GC,就将对象的年龄+1,当对象的年龄达到某个值时(默认是15岁,可以通过参数 –XX:MaxTenuringThreshold设置),这些对象就会成为老年代。

    但这也是不一定的,对于一些较大的对象(即需要分配一块较大的连续内存空间)则是直接进入老年代

    Full GC:

      Full GC是发生在老年代的垃圾收集动作,采用的是标记-清除/整理算法。

    老年代里的对象几乎都是在Survivor区熬过来的,不会那么容易死掉。因此Full GC发生的次数不会有Minor GC那么频繁,并且做一次Full GC要比做一次Minor GC的时间要长。

    另外,如果采用的是标记-清除算法的话会产生许多碎片,此后如果需要为较大的对象分配内存空间时,若无法找到足够的连续的内存空间,就会提前触发一次GC。

    2、老年代:
    在新生代中经历了N次垃圾回收后仍然存活的对象就会被放到老年代中。而且大对象直接进入老年代。

    3、永久代:
    即方法区。

    参考博文:http://www.knowsky.com/889010.html

    展开全文
  • 云存储云计算选择开源还是商业

    千次阅读 2018-04-11 18:06:25
    现在市场上有很多云计算架构可供选择,既有成熟的商业版本,也有基于开源的技术。 每个公司在面临存储运算瓶颈时,都会面临一番挣扎,本篇文章我们来调研梳理开源与商业版本的选择对比。 选择商用云平台还是选择...

    本文由张小凡整理,转载请注明出处: http://my.525.life/article?id=1510739742055

    现在市场上有很多云计算架构可供选择,既有成熟的商业版本,也有基于开源的技术。
    每个公司在面临存储运算瓶颈时,都会面临一番挣扎,本篇文章我们来调研梳理开源与商业版本的选择对比。

    选择商用云平台还是选择开源云平台创建企业的私有云,这确实是个问题。企业需要综合考虑,权衡利弊,依据企业自身技术能力,资金投入总量,实现业务效果等等各个方面去考虑云平台技术选型。
    开源云平台具有先天优势,是当下的流行趋势。开源云平台技术新,起点高,同时定制开发自由度大,总体拥有成本低。但是在选择开源云平台技术之前要考虑清楚,企业是否真的准备好了去应付高昂的开发费用和人力成本,而且这将是持续不断的投入过程。

    选择了开源,意味着会节省成本。与专有解决方案相比,开源的一个优势就是敏捷性。开源开发非常迅速,通过转向采用开源解决方案,那些需要快速开发和部署的企业级业务将会得到最好的服务。像OpenStack和Ceph这样的项目正在非常快速地发展,让企业能够利用开源解决方案创建大规模分布式数据和存储平台。短期内虽然难以动摇传统存储市场,但一席之地还是有的。

    开源是目前IT的行业趋势,表面看似乎降低了IT成本,实则增加了一定的风险,毕竟商业软件的稳定性、可靠性和售后支持方面会更好一些,所以开源软件包括开源的存储软件这方面还有很长的路要走,对于传统厂商来说,目前还尚不构成威胁。当然开源软件自身有很多的优势,扬长避短才能发展的更好。

    开源简介

    因为开源最大的魅力就是在于不依赖于某个厂商,大众可以自行修改代码以满足自身的需要,等于站在巨人的肩膀上成长,却不会被特定厂商所捆绑。

    开源云计算技术有很多,包括Eucalyptus、OpenNebula和OpenStack等。其中很多开源技术都存在商业版,导致开源的版本功能很少或者不完善。我选择用OpenStack来实现开源云构建,因为OpenStack是完全开源的技术,没有任何收费版本或者商业版本。OpenStack是由Rackspace和NASA共同开发的云计算平台,帮助服务商和企业内部实现类似于AmazonEC2和S3的云基础架构服务(Infrastructure as a Service,IaaS)。OpIenStack包含两个主要模块:Nova和Swift,前者是NASA开发的虚拟服务器部署和业务计算模块;后者是Rackspack开发的分布式云存储模块,两者可以一起用,也可以分开单独用。OpenStack除了有Rackspace和NASA的大力支持外,后面还有包括Dell,Citrix,Cisco,Canonical这些重量级公司的贡献和支持,发展速度非常快,有取代另一个业界领先开源云平台Eucalyptus的态势。

    随着信息建设的发展,每个单位的信息中心都会面临越来越多的服务器和越来越多的部门需要自己的服务器。原来单位里是按照部门给分配服务器,这样虽然看起来很好,每个部门有自己的服务器。但是资源浪费很大,因为并不是每个部门都可以把服务器资源使用到满负荷,而且每个部门还要有人管理服务器的硬件维护。虚拟化可以很好的解决这个问题,但是对于多服务器的资源整合和动态分配,资源的统一管理等方面虚拟化并不能全部解决。

    我们的想法是在企业的信息中心建立企业内部的私有云。将闲置的服务器资源组成企业的私有云平台来为各个部门服务。考虑到初期的建设难度和技术门槛,我们开始完全可以基于开源的OpenStack技术从原来的虚拟化过度到IaaS(基础设施即服务)的云平台上面。

    OpenStack总体上分为三个部分组成Nova、Swift和Glance。Nova负责云计算平台的资源管理。Swift是存储模块,负责映像存储、备份和归档等。Glance是映像服务模块,负责云平台中虚拟化系统的映像管理。OpenStack每个模块之间是无关联的,我们可以将所有模块部署在一台服务器,也可以部署在多台服务器。作为初步体验云平台,我们完全可以用2台服务器加一台客户机来实现云计算平台的部署。具体部署可以参考OpenStack的官方手册,这里就不在列出。随着云的建立,我们可以将单位中各个部门的服务器全部放在云里。每个部门的服务器其实就是云里的一个虚拟化实例,所有数据统一存储在Glance模块创建的卷里。每个实例可以很方便的在云里不同的硬件服务器中迁移和动态分配不同的资源给实例。

    随着信息化发展,云计算平台将会越来越普及。企业早一步实现自己的云平台,就能在将来的发展中具有更大优势。通过云的应用,可以降低信息化建设成本并降低各部门重复投资的硬件与管理成本。而且目前开源云技术已经日趋成熟和稳定,完全可以满足企业的日常需要。

    云基础设施和管理开源方案

    参考:2015年5月开源云计算应用程序排行榜

    CloudStack

    CloudStack得到了Apache软件基金会的鼎力支持,它自称是“旨在部署和管理庞大虚拟机网络的开源软件,成为一款具有高可用性和可扩展性的基础设施即服务(IaaS)云计算平台。”知名用户包括Cloudera、思杰、中国电信、戴尔、迪士尼、华为、诺基亚、SAP、韦里逊及其他许多企业组织。

    支持的操作系统:与操作系统无关。

    相关链接:http://cloudstack.apache.org

    Eucalyptus

    Eucalyptus现在是惠普Helion生态系统的一部分,它是一种私有云平台,与亚马逊网络服务(AWS)兼容,因而能够实现混合云计算。除了免费社区版外,它还有收费的标准版和高级版,惠普还提供许多的相关服务。

    支持的操作系统:Linux。

    相关链接:http://cloudstack.apache.org

    FOSS-Cloud

    FOSS-Cloud是一个全面的项目,旨在让企业组织可以构建自己的私有云。其定位是作为思杰和VMware的替代者,可以为企业组织节省多达40%的成本。

    支持的操作系统:Windows和Linux。

    相关链接:http://www.foss-cloud.org/en/wiki/Main_Page

    ManageIQ

    这款云管理解决方案是红帽CloudForms背后的开源项目。除了能够支持混合云环境外,它还支持众多服务,比如费用分摊、服务编排、生命周期管理和自动化工作流程。

    支持的操作系统:Linux和VMware。

    相关链接:http://manageiq.org

    Mesos

    Apache Mesos是一种分布式系统内核,将计算资源从物理机或虚拟机抽取出来,让用户可以将其数据中心当成单一的资源库。它常常与Hadoop等大数据工具结合使用,还与Docker整合起来。

    支持的操作系统:Linux和OS X。

    相关链接:http://mesos.apache.org

    OpenNebula

    OpenNebula号称“简单而又强大”,这个一切就绪的成套解决方案可用于管理虚拟化环境、构建私有云。提供了付费的支持和服务;OpnNebula.systems还设有该项目的商业部门。

    支持的操作系统:Linux。

    相关链接:http://www.opennebula.org

    openQRM

    openQRM的下载量已超过37万人次,它能够实现最终用户自助服务,用于云配置和计费。除了免费开源版外,它还有付费的中小企业版、大公司版和企业版。

    支持的操作系统:Linux。

    相关链接:http://www.openqrm-enterprise.com

    OpenStack

    OpenStack的支持者包括红帽、SUSE、Rackspace、IBM、英特尔、惠普、Ubuntu和AT&T等企业组织,它支撑着众多公有云和私有云计算环境的运行。官方网站上有一个市场(http://www.openstack.org/marketplace/),便于用户购买相关产品和服务。

    支持的操作系统:与操作系统无关。

    相关链接:http://www.openqrm-enterprise.com

    Scalr

    Scalr旨在简化多云环境的管理、安全和治理,同时为用户们提供更大的业务灵活性。知名用户包括:Expedia、三星、迪士尼、美国宇航局喷气推进实验室、索尼和埃森哲。

    支持的操作系统:Linux。

    相关链接:http://www.openstack.org/marketplace/

    Synnefo

    Synnefo(希腊语意为“云”)得到了希腊和欧盟的资助,它是一种基于谷歌Ganeti、Archipelago和OpenStack API的开源云计算堆栈。版本1.0仍在开发之中。

    支持的操作系统:Linux。

    相关链接:https://www.synnefo.org

    云桌面篇

    eyeOS

    这款云桌面解决方案的较新版本是闭源产品,但是你仍可以通过其官方链接访问早期的开源版本。它基于PHP和MySQL。

    支持的操作系统:Linux。

    相关链接:https://www.synnefo.org

    Oneye

    Oneye基于来自eyeOS的开源代码。它让用户可以在自己的服务器上建立云桌面,并通过浏览器从任何设备来访问云桌面。

    支持的操作系统:Linux。

    相关链接:http://oneye-project.org

    ownCloud

    这个成熟的云桌面项目现在迎来了版本8.0。主要功能特性包括:联合共享、收藏夹、元数据支持、出色的搜索及更多功能。

    支持的操作系统:Windows和Linux

    相关链接:http://oneye-project.org

    平台即服务篇

    Appcelerator Titanium

    开源Titanium软件开发工具包(SDK)让广大开发人员可以使用JavaScript,构建跨平台的原生、混合或移动Web应用程序。可以在Appcelerator.com上找到基于该SDK的基于云的服务。

    支持的操作系统:Windows、Linux、OS X、iOS和安卓。

    相关链接:http://www.appcelerator.org

    AppScale

    AppScale得到了谷歌、Ubuntu、Cloud Sherpas、Datastax、Canonical和Mirantis的支持,让用户可以构建自己的平台即服务系统,以便运行谷歌应用引擎(Google App Engine)应用程序,同时提供了额外的监控和备份工具。许多客户用它来建立混合云环境。提供收费服务。

    支持的操作系统:Linux。

    相关链接:http://www.appscale.com

    Cloud Foundry

    这个开源PaaS解决方案得到了一大批企业的支持,其中包括Pivotal、思科、埃森哲、EMC、惠普、IBM、英特尔、SAP、Rackspace、VMware,甚至耶稣基督后期圣徒教会。它的开发社区非常活跃,经常发布博文,并经常开展培训活动。

    支持的操作系统:Linux。

    相关链接:http://cloudfoundry.org/index.html

    OpenShift

    OpenShift是红帽的开源混合云计算平台。除了“Origin”这个免费社区版外,它还有收费的在线版和企业版。

    支持的操作系统:Linux。

    相关链接:http://cloudfoundry.org/index.html

    云开发工具篇

    Cloud9 IDE

    Cloud9既是基于云的Ubuntu桌面,又是基于浏览器的集成开发环境(IDE)。你可以向其官方链接注册,使用免费版或收费版,也可以使用来自GitHub的源代码(https://github.com/c9/core/),建立自己的基于云的IDE。

    支持的操作系统:与操作系统无关。

    相关链接:https://c9.io

    Desein

    戴尔支持的这个项目提供了“基于Java的云抽象层”,该抽象层让开发人员得以只要编写一次应用程序,就可以在任何云计算服务上运行该应用程序。

    支持的操作系统:Linux。

    相关链接:http://www.dasein.org

    Dirigible

    隶属SAP的Dirigible是一种集成开发环境即服务(IDEaaS),承诺可以帮助开发人员“享受前所未有的编程乐趣”。它仍处于测试版状态,你可以从官方网站注册,免费使用。源代码放在GitHub上(https://github.com/SAP/cloud-dirigible)。

    支持的操作系统:与操作系统无关。

    相关链接:http://www.dirigible.io

    Falcon

    Falcon自诩为“是一种速度非常快、非常简洁的Python框架,可用于构建云API和应用程序后端”。官方网站上有一些非常惊艳的基准测试数字。

    支持的操作系统:Windows、Linux和OS X。

    相关链接:http://falconframework.org

    PredictionIO

    这个开源机器学习服务器系统承诺让开发人员“可以在很短的时间内构建和部署机器智能。”它基于Apache Spark、Hbase和Spray等其他项目。提供了企业级支持。

    支持的操作系统:Linux。

    相关链接:https://prediction.io

    Roboconf

    这个工具让用户更容易将应用程序部署到云或其他分布式计算环境。它支持许多公有云服务,包括AWS、微软和VMware,另外还支持大多数私有云环境。

    支持的操作系统:与操作系统无关。

    相关链接:http://roboconf.net/en/roboconf.html

    云备份篇

    Amanda

    先进的马里兰自动网络磁盘存储服务器(即Amanda)声称是“世界上最受欢迎的开源备份和恢复软件”。现在它隶属大名鼎鼎的云备份服务Carbonite,为Carbonite服务提供了底层技术。

    支持的操作系统:Windows。

    相关链接:http://www.amanda.org

    Bacula

    Bacula也声称是“最受欢迎的开源备份软件”。这个基于网络的解决方案面向大型企业组织。可通过Bacula Systems公司获得受到支持的企业版和“Bacula for the Cloud”。

    支持的操作系统:Windows、Linux和OS X。

    相关链接:http://blog.bacula.org

    Duplicati

    这个备份客户软件可以自动将备份存储在云计算服务上。它可与AWS、微软OneDrive、谷歌云盘(Google Drive)、Rackspace和私有云协同运行。AES-256加密技术已内置,存档文件还可以用Gnu Privacy Guard(GPG)来签名。

    支持的操作系统:Windows和Linux。

    相关链接:http://www.duplicati.com

    云存储篇

    Ceph

    Ceph同时提供了对象存储和块存储,还提供了面向分布式存储的符合POSIX的文件系统。该项目现在由红帽管理,红帽销售基于Ceph的产品。

    支持的操作系统:Linux。

    相关链接:http://ceph.com

    CloudStore

    CloudStore提供了类似Dropbox的同步功能。它让用户可以在自己的服务器上建立个人云存储服务,而且它高度安全。(请注意:该项目与同名的英国政府倡议毫无关系。)

    支持的操作系统:Linux。

    相关链接:http://cloudstore.codewizards.co/latest-stable/index.html

    Gluster

    由红帽管理的Gluster是一种开源分布式文件系统,旨在处理数拍字节(PB)、或者甚至数波字节(BB)的数据。它声称拥有高扩展性、高性能和高可用性。通过第三方合作伙伴提供了收费的支持和咨询服务。

    支持的操作系统:Linux。

    相关链接:http://www.gluster.org

    Riak CS

    Riak是一种分布式数据库,具有低延迟、高可用性、容错和高扩展性等优点。Riak CS是一种云存储解决方案,建立在该数据库上。它既有社区版,也有企业版。

    支持的操作系统:Linux和OS X。

    相关链接:http://basho.com/riak-cloud-storage/

    Seafile

    Seafile为云存储提供了同步和团队合作功能。Seacloud.cc有一个基于云的版本,你也可以将开源版或专业版托管在自己的Linux服务器上。

    支持的操作系统:与操作系统无关。

    相关链接:http://seafile.com/en/home/

    Sheepdog

    Sheepdog在设计时力求简洁,它是分布式对象存储方面的另一种选择。它可以扩展到数百个节点。

    支持的操作系统:与操作系统无关。

    相关链接:http://sheepdog.github.io/sheepdog/

    Syncany

    这个开源云存储和同步工具让用户可以进行备份、与其他用户共享文件。所有文件都先经过加密,然后上传,以确保隐私。

    支持的操作系统:Windows、Linux和OS X。

    相关链接:http://sheepdog.github.io/sheepdog/

    容器化篇

    Docker

    虽然Docker是一项相当新兴的技术,但它的容器化功能已经备受行业分析师和公司企业的关注。它自称是“一种开放平台,以便广大开发人员和系统管理员构建、交付和运行分布式应用程序。”

    支持的操作系统:Windows、Linux和OS X。

    相关链接:https://www.docker.com

    Linux Containers

    这个组织监管三个独立的与容器化有关的项目:LXC,这是一组容器化工具;LXD,LXC的这个后续版本提供了更直观的用户界面;以及CG Manager容器群组管理器守护程序和LXCFS文件系统。它宣称的目标就是“提供与发行版和厂商无关的环境,以便开发Linux容器技术。”

    支持的操作系统:Linux。

    相关链接:https://linuxcontainers.org

    OpenVZ

    虽然知名度完全不如Docker,但OpenVZ同样提供了开源容器化技术。它为一款名为Odin Virtuozzo的商用产品提供了基础。

    支持的操作系统:Linux。

    相关链接:http://openvz.org/Main_Page

    虚拟化/虚拟机管理程序篇

    KVM

    KVM的全称是基于内核的虚拟机,它是一款面向x86硬件的全面的Linux虚拟化解决方案。它是主线Linux内核的一部分。

    支持的操作系统:Linux。

    相关链接:http://www.linux-kvm.org/page/Main_Page

    Xen

    Xen项目官方网站称之为是“为云设计的开源虚拟机管理程序。”它为世界上一些最大的云提供了基础,包括亚马逊弹性计算云(EC2)。

    支持的操作系统:与操作系统无关。

    相关链接:http://www.linux-kvm.org/page/Main_Page

    案例

    拥抱开源!上海交大云存储经验谈

    上海交通大学数据中心在闵行和徐汇校区建设有主备两个机房,距离超过30千米,通过校园万兆网络实现互连。现阶段共部署了100多台服务器,虚拟化程度达到60%。从2004年开始计划简化大型机的功能,再到初步实施服务器虚拟化,至今已经采用了VMware、 KVM和OpenVZ等技术。目前数据库以外的应用基本都运行在虚拟机中。由于考虑到数据库的IO比较密集,并且本身应用相对单一,所以没有将数据库放在虚拟机里面。

    日渐膨胀的数据存储对于上海交大来说也是一个令人头疼的问题。数据库、虚拟化平台、富媒体资源和电子图书,这些资源占用大量存储空间,仅上海交通大学的图书馆每年数据增长量就能达到几十个TB。同时,由于学校个IT部门之间相对比较独立,因此对于多租户也提出了一定的需求,既要给部门、学生和科研提供存储服务,又要做到互不干扰。

    在了解到可能面对的挑战和明确需求之后,接下来就是规划如何建设校园云存储环境了,是采用开源还是商业方案?如何让架构做到横向扩展?黄保青介绍说,最初在存储选型的时候,他们希望支持统一存储系统,除了SAN之外IP存储是简化数据中心架构一个很好的选择。此外,同时支持多个存储协议也是构建云存储平台的完备基础。

    红帽专家谈Ceph与Gluster开源存储路线

    目前在使用OpenStack的用户里,大概有60%的用户倾向于采用Ceph存储工具,使用意愿比例非常高。红帽的Ceph是一个开放、软件定义的云存储平台。它面向云基础架构和大规模对象存储而设计,提供灵活、自动且高性价比地帮助用户管理应用产生的海量数据。我们维护了一个稳定的版本,将给用户提供面向企业级的开源存储服务。

     据了解,目前应用Ceph的行业用户较多落地在金融服务、广电、云服务商、政府等领域。目前一个比较有名的成功案例就发生在澳大利亚的莫纳什大学,他们目前已经利用Ceph实现了对500PB的数据进行存储管理。

    华数云平台:开源OpenStack存储管理、关键应用x86迁移

      姚军向我们大致介绍了华数和英特尔开源云平台项目的进展情况:“我们当初做云平台主要有四方面的原因,我们这两年业务发展很快,我们的技术平台建设还是按照原来运营商的模式建的,这两年感觉到有些不能跟上业务需求发展的速度。另外,以前这种传统平台的建设模式,普遍存在资源利用率低、调配困难。我们在2010年左右已经开始做云了,最早还是用商用软件的方案,就遇到了下面的两个问题,一是商用软件在我们公司设备数量大量增加以后,整体成本比较高;一些定制化的需求,商用软件如果要实现一个客户的需求还是比较慢的,可能要一年左右以后他才会觉得这个需求不符
    合用户的期望,所以不一定会做那些定制化的需求。

      之前我们跟商用软件(提供方)也做过一些沟通。商用软件一般是两种付费模式,一种是根据物理CPU计费,另一种是战略框架,比如说这一年内你支付多少费用,然后就不限你的CPU。前面一种,当时粗略了解了一下,每个CPU大概在几千人民币左右。后面那种就比较大了,一般几百万才会跟你谈。我们评估了一下,像华数这样的设备数量,这个费用还是蛮高的。你是基于开源开发,其实你的License数是没有的,不存在License的费用,投入的只是开发的费用。

      我们今年跟英特尔一起合作做这个项目,主要想达成这三方面的目标,一是我们着眼于开源化的管理软件,开源化就要达到云基础架构平台,这上面希望能做华数的一些个性化的需求,包括流程、资源的申请和审批过程,最后要跟华数上端的APP做一些结合,更好的服务于应用。”

      “这是我们跟英特尔一起做的整体架构,我们最底层还是英特尔的虚拟化硬件,中间是用KVM(主要)、Xen或者VMware ESXi技术做资源池,也利用英特尔提供的一些能耗管理的代码(Node Manager)在这个平台中。上面一层做的是监控软件,这块自己再做的话意义不大,因为现在开源监控软件已经比较成熟了,我们做了一些集成,把Nagios、Ganglia这些监控软件集成到平台上来。最上层是一些整体的管理功能和云平台的高级功能,比如负载均衡、高可用、HA这些,我们也考虑这个平台能支持其它的云管理平台,现在目前主要支持OpenStack的平台,下一步要做对VMware新出来的云管理平台等一些第三方支持。”

      上图显示了华数云平台开发情况汇总。在存储管理方面:“存储架构优先基于OpenStack Swift模块进行设计;可以使用各种存储介质作为虚拟机的可分配存储资源,包括本地存储、NAS、FC SAN、IP SAN等分布式存储。”

      OpenStack是一款公共和私有云服务的开源平台,可自动控制和组织计算、存储和连网资源。OpenStack最初是由Rackspace和国家航空航天局共同完成构思的,现在由OpenStack基金会管理。

      Rackspace的首席技术官John Engates称:“在OpenStack平台基础上,客户们不会被锁死在某一家厂商上面。如果他们决定换用另一款OpenStack云服务,不管是私有云还是竞争对手云服务,如果他们还是坚持使用Cinder API的话,那么不会发生任何转换的成本,因为这些产品都是在同一种云上提供的。”

      记得在月初的新闻中:“IBM研究中心对OpenStack的贡献包括Nova-volume和Cinder drivers,正在开始以它们的方式支持更多的产品。由于OpenStack Nova-volume drivers,XIV Storage System第三代企业级阵列和Storwize V7000统一存储系统获得了云计算友好(cloud-friendly)的更新。”

      针对“基于Intel NM、CPU利用率进行虚拟机策略调度与迁移”,笔者是这样理解的:Node Manager(节点管理器)是Intel主要用于管理服务器能耗的工具,可以通过限制CPU的性能来控制功耗。华数有可能实现了服务器的开关机控制,当部分服务器的CPU利用率饱和的时候,再将处于关机状态备用的开机并迁移虚拟机负载到上面,这样在负载为零时就可以最大程度避免耗电。

      华数:“因为在关键应用里,譬如说交易系统、计费系统可能还是传统的SAN架构的。现在在媒资层面,我们这两年都在逐步转向云存储的方式,就是服务器加一个文件系统这样的云存储架构,会作为我们后续的主要方向。我们今年像这一类(集中式)存储大概有10TB左右,其他都是英特尔(x86)的。
      目前在计费系统上我们还是跑在小型机上。因为主要的取决因素是软件供应商,他整个开发环境就是基于Weblogic,基于IBM,这是一个因素。英特尔也在帮助我们做一件事情,很多关键应用也在慢慢往英特尔架构上迁移,往x86架构上迁移。包括以前的认证系统,都是跑在Sun架构上,现在我们会把它迁移到x86架构上。我们整个BOSS计费系统里,以前主要是小型机,不管是应用服务器、中间件服务器、数据库服务器,还是Web服务器,可能都是跑在Sun和IBM机器上。我们现在除了关键的数据库和中间件服务器,剩下的报表、隐账也都在往英特尔架构上转移。这块转移主要是成本上的差异,
    大家知道英特尔CPU,包括性价比上还是有比较大的差异。我也想说,你看为什么Oracle的一体机现在也是英特尔架构的。它为什么不采用买的Sun而用英特尔的架构,这一定是有原因的。但云化,包括云计算技术成熟之后,对这种的依赖也会降低。”

      ChinaByte比特网:“您刚才提到底层有英特尔VT虚拟化技术,还有Node Manager API,这应该也是英特尔搞的。像咱们这种客户,英特尔是不直接和咱们之间发生生意往来的,但实际上英特尔在您这边也给了一些支持,我想知道,他们给的这些支持给咱们带来了哪些帮助?”

      朱素平:“英特尔本身是价值链顶端的公司,他们关注的不是说你今天会买我多少东西,或者今天我要卖给你多少东西这样一个关注点。我跟Hunter(李志辉)交流,他给我的概念是,他要跟每一个行业顶尖的公司合作,也就是非常领先的公司,通过与这样公司的合作把握整个行业的趋势。

    我理解英特尔对华数的合作,是因为华数在新媒体领域,有可能在广电领域的新媒体业务当中是比较领先的,华数可能在业务创新和技术创新方面在这个行业里走的比较早一点,通过和华数的合作可能会了解到这个行业本身发展的一些趋势和态势。

      从云平台角度来讲,为什么我们跟英特尔合作?云现在很热,拿开源的东西随便搞两下也可以叫做云。当时我们也是想找一个商业的公司合作,我们也立了项,怎么样招投标,后来经过比较长时间的评估。一是觉得这个阶段很多商业化的东西做的还是大同小异,没有太多的特点。另外,我们自己的行业和应用环境有一些特殊的地方,我们可能更需要英特尔更深层次的支持。因为从虚拟化往云计算方向演进,最终更需要的是你跟硬件、CPU,跟底层的一些东西更紧密的结合,反而是那些纯云服务的软件供应商和平台供应商是做不了的。另一方面,英特尔本身在资源的整合方面也能够给我们带
    来很多价值,包括我们可以学习的互联网的前辈或者其它行业领先的案例,能够让我们做更多的分享。这个可能是我们跟英特尔合作的出发点和价值

    云计算下半场,运营商如何拥抱开源?

    有关云资源池如何构建算不上新鲜话题,自2006年谷歌CEO施密特首次提出“cloud computing”概念,距今已有12个年头。在云计算发展初期,业界除了亚马逊、谷歌、阿里等互联网企业可以凭借强大的研发实力构建自己的云平台外,其它云服务提供商(如电信运营商)只能基于封闭的商业软件实现云平台落地。但在最近几年,伴随OpenStack、KVM、Ceph等多个开源项目日趋成熟,以及DevOps理念风靡全球,各大公司都在对自身的云资源池实施开源技术架构演进。很显然,云计算已进入了下半场时段,传统电信运营商能否在此领域找准切入点、把握好节奏,势必对其ICT融合转型之路至关重要。

    本文的主题是对云计算资源池中相关开源技术的研究,重点围绕为什么要选择开源技术、应选择哪些开源项目、开源可能带来哪些问题这三个关键议题展开论述,旨在对运营商云资源池开源演进战略提供一些有价值的思路与建议。

    问题一:为什么要选择开源技术?

    与互联网企业所不同的是电信运营商作为传统的CT企业,更加关注于系统的稳定性、高可用,因此在以往的设备选型、架构设计中大多会采用纯商业、封闭的产品,以确保网络达到电信级标准要求。当前,开源趋势在全球兴起,大批贡献者持续不断地对项目源码进行完善,使得很多优秀的开源项目完全可以满足电信级要求,这是运营商拥抱开源技术的必要条件。另一方面,究竟为什么要选择开源技术则是我们运营商人必须想明白的问题,以下从九个方面对这一问题进行了阐述。

    1、标准:开源基金会扮演着与传统CT领域通信标准化组织(ITU、3GPP等)类似的角色,弥补了运营商在IT领域因缺乏标准化体系造成相关系统在全局性、兼容性、开放性方面的不足。

    2、降本:开源软件应用达到一定规模后,可以大幅节约成本,成本的节约有利于利润的增长。

    3、增效:开源社区有丰富的自动化运维工具,这些工具有利于运营商向DevOps转型,显著提升运维人员的工作效率。

    4、功能:依托开源体系架构,运营商可对定制化、个性化需求进行二次开发,而封闭、商业化的产品通常只会为通用可抽象化的功能进行设计开发,且无法实现二次开发。

    5、安全:源代码开放有利于自主可控,让“黑匣子”变成“白匣子”,使用者了解内在组成,大幅提升系统安全性。

    6、创新:开源项目是创新的土壤,新特性、新功能可以快速实现,不受限于商用产品的发布周期。社区某个贡献者的好想法也有助于激活其他参与者的灵感。

    7、竞争力:有利于运营商掌握核心技术,提升企业的核心竞争力。

    8、话语权:不会被某个厂家的“一揽子”解决方案绑定,使得系统优化演进更加灵活。

    9、生态圈:开源项目有利于企业借势借力,伴随开源社区的不断发展,企业的系统也会持续优化。

    问题二:应选择哪些开源项目?

    由于云计算资源池的基础是IAAS层,因此本文提及的开源项目主要以IAAS层视角展开分析。同时考虑到DevOps的重要性,会辅以部分优秀的PAAS层开源项目进行介绍。下面将分别从计算、网络、存储、云操作系统、自动化运维工具等五大维度探究运营商对云计算相关开源项目的选型问题。

    1、计算:硬件、虚拟化、容器

    (1)、硬件:按照人们通常的理解,开源项目都是软件相关的,然而硬件领域也不乏优秀的开源项目,例如OCP。该项目由FaceBook于2011年发起,旨在通过开源硬件驱动IT基础设施架构不断发展。历经6年多时间,OCP已有近200多家企业会员。由于构筑成本较低,去掉了很多繁琐的无用功能,OCP可以有效地提升企业数据中心的迭代速度,使软件升级更加简单,一改早期数据中心尾大不掉的形象。在国内也有个类似OCP的开源硬件项目,即天蝎计划。天蝎计划于2011年问世,百度是主要发起方之一,阿里、腾讯、联想、中国移动、中国电信等巨头陆续参与。目前已从1.0发展至3.0版本。据了解,天蝎计划已经达到OCP中关于整机柜部分的国际水准,甚至在部分设计上超越OCP相关规范。

    (2)、虚拟化:这里提到的虚拟化特指X86服务器虚拟化技术。在云计算发展初期,该技术主要由VMware、Citrix等IT巨头垄断,相关产品虽然功能全面、性能不俗,但价格也十分昂贵。现如今随着开源KVM技术日趋成熟,越来越多的企业开始构建基于开源KVM技术的云资源池,以期大幅缩减虚拟化软件购置成本。KVM的全称为Kernel Virtual Machine,翻译为中文就是内核虚拟机。KVM是典型的二类虚拟机架构(从VMM所处层次可将虚拟化软件划分为一类虚拟机架构和二类虚拟机架构,一类的VMM处于硬件层之上,自身就是一个操作系统。二类的VMM处于宿主机操作系统层之上,自身可看作一个应用程序),它的宿主机操作系统涵盖CentOS、Ubuntu、Debian等多个Linux发行版。

    (3)、容器:容器是轻量级的操作系统级虚拟化,可以让我们在一个资源隔离的进程中运行应用及其依赖包。在众多容器引擎技术中,Docker无疑是明星级解决方案。Docker是PAAS提供商dotCloud开源的一个基于LXC的高级容器引擎,基于go语言开发并遵从Apache2.0协议开源。

    2、网络:虚拟交换机

    虚拟交换机:大部分商业虚拟化软件中都自带虚拟交换机的组件,例如VMware的vDS、vSS。但对于开源的虚拟化软件而言,其自带的网络功能通常比较简单,这就需要额外的虚拟交换机弥补这一短板问题,OVS(Open vSwitch)则是该领域最热门的开源项目。OVS是由Nicira公司使用C和Python语言开发,并遵循开源Apache2.0许可的多层虚拟交换机,其初衷是让大规模网络通过可编程实现自动化扩展。它既可以作为一个软件交换机运行在虚拟化层,也可以作为交换芯片的控制栈实现,支持多种标准管理接口和协议(NetFlow, sFlow, SPAN, RSPAN, CLI, LACP, 802.1ag)。它也支持多种虚拟化技术,包括KVM、Xen和VirtualBox。

    3、存储:分布式存储

    分布式存储:云计算发展至今,可以说是一部软件定义一切(SDX)的技术发展史。从早期的X86服务器虚拟化(可以理解为软件定义计算),到软件定义网络(SDN)、软件定义存储(SDS),再到大一统的软件定义数据中心(SDDC),每种技术都曾在业界倍受关注。在这些SDX技术中,软件定义存储可以算是继软件定义计算后,最为实用的一类。何为实用技术?笔者认为有两项评判标准最为关键,其一是看这项技术与以往技术相比是否有显著进步(如架构的革新、功能的增加或性能的提升),其二是看这项技术的性价比。软件定义存储技术显然符合以上两点要求。首先,SDS与以往的存储技术相比,是一种全新的分布式架构,因此也有“分布式存储”的提法。这种“去集中化”的思想源自于谷歌等大型互联网企业,它不仅降低了IT系统的存储故障风险,同时可以大幅提升存储IOPS性能,甚至让存储容量在线扩展成为现实,以上三点都是长久以来困扰IT系统存储管理员的难题。其次,SDS完美地实现了软、硬件解耦,这点与X86服务器虚拟化类似。二者不同之处在于X86服务器虚拟化的松耦合架构带来了在线热迁移、计划内零宕机等特性,SDS的松耦合架构则使专用存储硬件演变为通用X86服务器,这大幅降低了IT系统存储设备的投资开销。目前业界最热门的开源分布式存储项目非Ceph莫属,作为一款同时支持对象、块、文件的统一存储系统,Ceph也是当前OpenStack生态系统中呼声最高的开源存储解决方案。

    4、云操作系统

    在云计算发展初期,有关云操作系统的市场争夺从未停歇过。除了VMware、Citrix、微软推出的商业云管理平台软件外,开源项目也是遍地开花,包括CloudStack、OpenStack、Eucalyptus、OpenNebula等多个平台。从现阶段的发展形势来看,OpenStack基本已成为云操作系统的不二选择。师承亚马逊AWS的OpenStack自2010年10月第一版(Austin)到最新版(Pike),已历经16个版本,从最初的Nova、Swift两大模块到如今大大小小上百个模块,被认为是仅次于Linux的第二大开源社区项目。近两年,各行各业基于OpenStack的云平台方案如雨后春笋般出现,而真正能给OpenStack一个准确定义的人却很少。有人认为它是云管理平台,有人认为它是云计算平台,还有人把它与VMware虚拟化相对应,正所谓“一千个人眼里有一千个哈姆雷特”,你把它看作什么只能表示你关注它哪方面,并不表示它就是什么。笔者倾向于将其看作是“现行最通用的云计算标准体系架构”,它的日益成熟规范了以往云计算领域各类错综复杂的技术概念,实现了各厂家云解决方案的和谐统一。可别小看这一点,毕竟能让全世界不同语言(各类IT产品接口)的国家(各IT厂家)搁置争议、沟通合作(统一适配)的组织也就联合国了。从这点来看,OpenStack就是云计算世界的“联合国”角色。

    5、自动化运维工具

    严格意义上说,自动化运维工具不能算是云计算特有的,在传统IT架构下也有自动化运维的需求与实现。只不过近些年业界兴起的DevOps与云计算相结合,重新赋予了自动化运维新的理念,在此背景下,也出现了不少优秀的开源自动化运维工具,Ansible就是目前业界最为热门的一个。Ansible是一种模型驱动型配置管理工具,充分利用SSH技术,改善安全、简化管理。除了配置管理外,它还能够实现应用程序部署(甚至多层部署)、工作流程编排和云配置自动化等功能。Ansible基于五大设计原则,包括易于使用(不需要编写脚本或自定义代码)、易于掌握(对管理员和开发者来说都是如此)、全面的自动化(让你可以做到你环境中的几乎一切都实现自动化)、高效率(因为它在OpenSSH上运行,因而不依赖内存或处理器资源),以及安全性(它天生来得更安全,因为不需要代理、额外端口或根级守护程序)。与其他许多开源项目一样,Ansible也有一款收费产品,使用一种名为Ansible Tower的Web用户界面。

    问题三:开源可能带来哪些问题?这是开源领域一个永恒的话题,也是任何机构、组织或公司想要用好开源软件需要接受的一个观点。开源软件是对传统商业软件开发及应用模式的一种变革。传统商业软件按照许可售卖,用户在部署、使用及后期维护方面遇到的问题,均可由软件商提供明码标价的服务。开源软件为用户提供了一个免费的社区版软件,但通常情况下,它只能算是一个“半成品”,仅能满足用户最基本、最通用的功能需求,一些定制化的功能需要用户在社区版基础上二次开发。另一方面,对于软件前期的部署、中后期的运维也缺乏专业的团队支持。如果将软件比作一辆车,国内外大部分电信运营商都习惯于做一名合格不出事故的司机,即从设备制造商手中买一辆“成品车”,然后努力学好驾驭这辆车的技能。然而,开源软件则是一辆“半成品车”,在它可以平稳驾驶前,首先要对其进行优化改造,而这需要机械师的技能。因此,多年来习惯于做“司机”的运营商或许需要考虑如何补充“机械师”技能了。想要成为一名合格的机械师,学费是不可避免的。

    1、开源不等于免费

    2、开源阻碍技术发展

    这个观点似乎与大众的认知相去甚远,但现如今这个问题在开源领域确实存在。开源项目的初衷是希望集合全世界广大开发者的力量打造一款优秀、强大、快速迭代的软件,替代传统IT巨头开发的闭源商业软件,从而消除技术壁垒,避免厂商控制技术演进路线的现象发生。例如Linux项目的发展促成了服务器X86化趋势,让系统封闭且价格高昂的小型机逐渐退出历史舞台。又如安卓项目的诞生加速了移动互联网的繁荣发展,让非智能手机消失在人们的视野中,这些成功的开源项目确实促进了技术的发展。但近年来,伴随众多IT巨头相继关注开源事业,投入资金支持社区发展后,曾经相对纯粹的开源项目产生了微妙的变化。一些由少数厂商主导的开源项目变得不再开放、友好,相关厂商为了自身利益的最大化做起了与开源项目初衷背离的事情,导致一些优秀的开源项目走向衰败。这种现象发生在开源项目上,通常比商业软件危害更大。因为同类型的商业软件一般可由多个竞争厂商分别提供,并长期共存。而同类型的开源软件在发展初期会充分竞争,但随着时间推移,基于“丛林法则”最终形成一家独大的格局。如果胜出的项目被少数商业公司掌控,这些企业就可以控制某一行业、某一领域的技术趋势,这与完全垄断某个市场的商业软件几乎毫无差别。

    3、开源并不安全

    在前文中笔者曾将“安全”作为开源软件的优点加以论述,现在又将其视为开源软件的潜在问题来讨论,这看似有些悖论的意味,却又真实存在。提出开源软件更加安全论点的人们普遍认为社区有成百上千的人在审核代码以便发现漏洞或缺陷,从而快速修复漏洞,不被攻击者利用。但持有这种观点的人往往忽视了一个问题,即代码中的漏洞是开放给所有人查看的,攻击者也在其中,而大部分漏洞从发现到完全修复的耗时明显要大于恶意代码产生耗时,这就给了攻击者可乘之机。这从早几年OpenSSL爆出的“Heartbleed”漏洞到MongoDB的“赎金事件”,再到最近由Memcached漏洞引起的“DRDOS攻击”,均反映了开源软件并不安全这一事实。

    结束语

    综上所述,本文重点讨论了在构建云资源池时为什么要选择开源技术、应选择哪些开源项目、开源可能带来哪些问题等三大类议题。文中提及的开源项目仅仅涉及云计算相关开源项目中的一小部分,云计算目前仍是一种新兴的技术领域,而与此相关的开源项目也在不断成熟发展中,因此对于云计算资源池中相关开源技术的研究是一个长期持续的议题,希望本文所述的观点能给各位读者有所帮助与启发。

    OpenStack 如何笑傲开源云计算战场—— OpenStack 与 CloudStack 的对比

    “2014开源云计算解析”的市场调查显示,69%已经不同程度地应用云计算技术,43%的用户花费大量资源在开源技术上。在这些选择了开源云的企业中,超过86%的企业关注OpenStack,并且这些数值在过去几年都在不断增长。 排在第二位的CloudStack则被远远甩在后面,只有44%。

    对于用户倾向于开源云计算的理由,在这份Zenoss的报告中的数据也有显示,诸多原因中以下四种最为重要:

    灵活性(71%)
    避免被厂商锁定(66%)
    更低的成本(66%)
    开放的标准和API(60%)

    私有云市场:激荡风云几载,谁是中国市场未来主导?

    中国的OpenStack阵营由四大层面组成。

    第一个层面是OpenStack厂商,一般称为一大八小:一大是华为,八小是AWCloud、99Cloud、EasyStack、UnitedStack、T2Cloud、UMCloud、KeyTone Cloud、Kylin Cloud。

    第二个层面是硬件厂商,华为,联想,浪潮,中兴,宝德,华三等,均下注OpenStack。

    第三个层面是大规模部署的互联网公司,百度,金山云,乐视云,京东云,爱奇艺等。

    第四个层面是企业用户,移动,联通,电信,银联,人民日报等。

    2016中国开源存储峰会将开幕,开源引领未来存储

    随着以OpenStack为代表的云计算框架的兴起,作为其首选的软件定义存储系统,Ceph在企业级存储领域更加炙手可热。Ceph已经广泛被公有云和私有云供应商所采用。Ceph提供的存储方案,能够打造针对混合云的软件定义存储解决方案,帮助客户加速从传统的昂贵的孤立的外部存储系统转移到开放源代码平台。

    金融企业生产云,为什么选择OpenStack?选择开源还是商业版?

    OpenStack已经成为了大家选择云计算技术落地框架的事实标准,银联从2013年基于OpenStack E版本的定制版在生产与测试运行,到现在的基于L版本的定制版在生产与测试的运行。已经管理了近2000的物理节点,近万的虚拟节点,技术关键点也从最初的xen、vm、大二层网络到现在的kvm、ceph、sdn、ovs并存与共同发展。在这近四年的时间,形成了银联自己的开发运维团队,不断进行云计算技术的认识、学习和思考,通过处理平台运行过程中遇到的问题以及对平台自身的不停的迭代优化,整个团队的能力也经历了长足的进步。下面就围绕OpenStack的选择、落地、运用发展过程中的一些关键点进行介绍。

    商业方案

    从市场策略和产品技术两个方面,把主要的一些公有云服务厂商做一下简单的概括,重点展现他们在2015年的表现。本文并没有排名的意思,只是从市场影响力方面,把值得关注的企业花些笔墨,提炼一下关键点,让大家能够从总体上了解一下这个市场上不同玩家的状况,所以顺序是完全乱排的。

    华为云
    华为是笔者的老东家,因此先说它。华为云成立也有几年时间了,在市场上宣传的投入不是很多,营收的数据也一直没有公开,笔者知道一些情况,不过也不方便说太多。华为云真正大张旗鼓的干,还是从今年开始,特别是9月份的发布会之后。总的来说,笔者认为华为云积累还是比较深厚的,特别是在传统企业市场领域未来潜力不小。

    市场策略

    华为云在今年9月份,搞了一个很大的发布会,有点正式宣布华为云要大张旗鼓干的意思。将在五年内投入10亿美金,实施“沃土”计划扶持应用开发者和合作伙伴等。华为云的目标客户是企业市场,传统的中大型企业是华为云最期望占领的,也是华为最擅长的地方,所以华为云也经常被称作华为企业云。

    个人开发者、中小企业用户、互联网应用开发者这些用户群体,从市场策略上来说不是华为云的重点。华为云非常注重合作伙伴的生态建设,笔者现在所在的公司也有些应用已经在华为云市场上线了,所以对于这块还是有切身体会的。

    华为云相比于其他的公有云服务商最大的优势是线下服务和销售能力。华为有庞大的销售团队和技术服务团队,相比于其他的公有云厂商需要重新构建这些团队,华为就占了一些先手。华为云线上和线下结合,在IT领域进行市场拓展,应是华为未来3-5年重要发展战略之一。

    产品和技术

    目前,华为云提供的云服务产品大约20个。今年10月份的时候,华为云进行了一个大的升级,新的6.0版本云平台是基于Openstack框架的。华为云上的服务产品数量算不上很多,但是,整个华为云产品的服务质量还是不错的,和华为务实低调的风格有些类似。

    华为云提供的这些服务产品里面,云桌面和通信云平台比较有亮点,另外华为的专有云也比较有意思。其他的服务产品就特点不是很鲜明了,有点大路货的意思。

    华为云的电话客服是非常好的,笔者所在的企业和华为云有些合作,所以对于热情的客服是深有体会。当然,华为云客服的电话接的太多了也挺麻烦的,期望在2016年里华为云能够多利用一些自动化的工具,或者是其他渠道来提醒用户和合作伙伴。

    2016年,期望华为云在云服务品类上能做出一些亮点来,现在的云服务产品质量不错,数量还是不太多。

    电信云
    电信云在2015年继续保持收入的增长,营收差不多4-5个亿,在国内公有云这个市场来说也是排名前列了。当然,电信云的营收很大一部分来源于其IDC领域的用户转化,以及专有云、托管云等方面。

    市场策略

    电信云主要面向企业市场,依靠电信在IDC、数据中心服务等领域的客户为基础,进行追加销售和捆绑销售。中国电信在政府、国企等领域还是有很多的客户资源可用,对于其云计算的销售有不小的促进作用。

    电信云在2015年并没有在应用软件开发等合作伙伴领域进行大的合作和推广,它的动作比市场似乎总是慢一点点,或许是受限于体制等原因吧,你懂的。

    产品和技术

    目前,电信云提供的云服务品种数量是14个,服务产品也都是普通的IaaS、PaaS等服务,可以说的亮点不多。电信云的很多项目仍然是以集成为主,中国电信服务公司本身就是一个比较大的集成公司。

    阿里云
    阿里云在2015年的营收还没有正式公布,笔者从某渠道得到的消息是18-19亿这个范围。这其中包括阿里巴巴内部对阿里云的采购结算,而且这部分占了很大一块。整体来说阿里云在中国还是做的很有声色的,阿里云面向个人开发者、互联网用户及中小企业用户的营收占整体阿里云营收的90%左右,剩下的10%是金融、政府、证券等等其他行业。

    市场策略

    2015年,阿里云的市场策略主要集中在三个方面,一个是国际化,阿里云在香港、美国、新加坡等各地建立数据中心,向全球提供服务。

    另外一个就是通过百川计划、云合计划等扶持合作伙伴和应用开发者,发展公有云相关生态,阿里云的市场推广可以说是很舍得投入的,无论是大量代金券的发放、免费网站资源的提供等,都彰显了阿里云在扩充用户、合作伙伴领域投入的大手笔。

    还有一个大的方向就是阿里云在面向政府、中大型企业市场的云计算推广。阿里云在2015年的宣传上声势浩大,和大量省政府高调建立云计算战略合作等、和东软、中软等传统软件厂商达成战略合作伙伴关系等等,都为阿里云赢得了大量眼球。

    可惜阿里云在实际项目落地方面并没有宣传上那么惊艳,很多地方政府战略协议成立一纸空文,实际落地很少或几乎没有,数梦公司曾经被阿里云寄予厚望,期望他协助阿里云的项目实施和落地,不过到目前为止进展并不是很好。阿里云被圈内很多人所诟病的就是这一点。

    另外一个制约阿里云落地的地方在于阿里云的飞天平台太重量级,百台服务器以下的规模很难支撑起阿里云飞天平台的高效运转,所以在一些项目落地过程中,会由于投资等原因被搁浅。这一点阿里云也在加紧进行改进,相信2016年会拿出更适合专有云、托管云的解决方案来。

    产品和技术

    目前,阿里云有大概40多个阿里自身提供的云服务产品。阿里云的服务产品品种在2015年里丰富了很多,无论在IaaS、PaaS方面都有很多新产品上线,大数据相关的服务,例如ODPS、数据分析、分布式DRDS等也成功上线,云安全领域的云盾产品系列等也上线了很多服务产品。在云应用市场方面整合了上百家的应用产品,极大地丰富了阿里云的整个SaaS服务产品体系。

    阿里云在云应用市场目前上线的应用数量大概是1万个,不过实际被使用的应用数量还不是很多,实际用户数也比较有限,最多的用户集中在网站服务领域。

    所以,总体来说阿里云的服务品种丰富,但是大部分体验一般,几次数据丢失、光缆断裂停止服务、IDC机房掉电停止服务的事情,使得阿里云受用户批评。

    笔者期望2016年,阿里云的产品和服务品质能够更多的提升,作为国内云计算领域的旗帜之一,阿里云应该对自己有更高的要求。

    腾讯云
    腾讯云在2015年里进步很快,收入上也差不多3个亿,通过和一些国际知名软件厂商,例如IBM、Oracle等合作,使得腾讯云在企业市场领域也有了不错的进展,相信2016年腾讯云会更加注重企业云领域的投入,并获得不错的效果。

    2014年底的时候,笔者说腾讯云起步有点晚,但是,整个2015年腾讯云大刀阔斧的进行改变,以现在的势头来看,腾讯云将会在未来成为牵制阿里云的重要力量。

    市场策略

    腾讯云原来在游戏领域是很有影响力的,大量的网络、手机在线游戏运行在腾讯的平台上,腾讯云的独立可以很方便的吸引这些游戏开发商。对于腾讯云的起步是非常有意义的,这也是笔者在2014年总结时特意提到过的。

    在2015年腾讯依靠游戏以及微商(微信开放平台)等吸引了大量个人用户和中小企业开发者,为腾讯云的营收贡献不小。笔者了解到腾讯在游戏领域的收入和腾讯云在底层资源支撑方面的分成还有些不清不楚,所以在计算腾讯云营收时整个数据有些混乱。

    腾讯云现在势头很猛,源于腾讯云的开放合作策略,下半年腾讯云推出的100亿元扶持计划,并声称80%-90%收入会分给合作伙伴,是很大的手笔。它联合了许多国外的大型软件厂商例如:IBM、Oracle等,把他们的软件架构在腾讯云之上进行服务,腾讯云也是Oracle云服务在中国落地的战略合作伙伴。这样的合作使得腾讯云在面相中大型企业销售云服务时,相比其他国内云服务商有一定优势。

    产品和技术

    目前,腾讯云提供的服务产品大约35种服务,除了基础的IaaS、PaaS层服务之外,还涵盖了移动、视频、安全、监控等多种服务。合作伙伴提供的云服务大约是近千种的规模。

    腾讯云的技术底蕴主要来源于游戏、社交、视频等互联网领域,在传统企业市场的征伐不是腾讯的长项,笔者在多个项目上也直接和间接的碰到过腾讯云的参与。所以也对它们在企业市场的情况有些了解,例如:工商总局等。

    2015年下半年的时候腾讯通过对IBM、Oracle等软件产品的打包,以及大量软件ISV应用产品的上线,使得腾讯云在企业市场领域也算有了不错的基础,在2016年,腾讯云能否在该领域腾飞起来让我们拭目以待吧。

    金山云
    原本金山云在市场上一直不温不火,只是在游戏领域有不小的影响力。经过小米的投资和战略合作,使得金山云有了更多的底蕴。2015年的营收,笔者也没得到准确的数字,估计在近亿元的规模吧。

    市场策略

    2015年金山云在合作伙伴神态建设方面也是卓有成效,1000多家游戏厂商加入合作伙伴计划,推出了800多款游戏产品。金山云确实把游戏云领域运营的相当不错。另外在视频云服务方面也有一些突破,可惜亮点不是很多。

    从金山的发展规划上来看,金山要做的医疗云、政务云、大数据服务云等成效还不是很明显,这些领域要想突破金山云还有很多的工作要做。

    产品和技术

    目前,金山云总共提供了17种左右的云服务产品,其中金山的云存储、游戏云还是值得称道的,用户量和市场影响力比较大。其他的云主机、云数据库等服务比较普通,就不值花笔墨去说了。金山云也提供了视频云和企业云等服务,例如:金山融合存储、云盘、私有云等。这些服务在整个公有云服务业界算不上太多亮点,用户量和市场影响力都有待加强。

    UCloud
    Ucloud是一个白手起家的公有云服务创业公司,但是他的市场运作相当不错,在游戏领域有不少建树,曾号称”最懂游戏的云”。

    市场策略

    Ucloud2015年除了继续在游戏领域的拓展之外,在行业解决方案方面也有所加强,例如:O2O、电商、互联网金融、视频、移动社交等领域。

    Ucloud另外一个比较大的动作就是在合作伙伴生态建设方面,也建立了类似云应用市场的“U市场”,到年底大概上线了几十家合作伙伴,近百个优秀应用。未来Ucloud将继续加强+U计划”,U市场侧重于互联网行业产品层面的合作,而“+U计划”将会与行业的ISV合作,积累更多传统行业、互联网+领域的经验、资源,提升对行业应用场景的理解和研发能力。

    如果放到一起来对比,相比其他的大型公有云服务商而言是比较少,市场的影响力也有待加强。

    产品和技术

    目前Ucloud提供的云服务产品大概是15种,重点都集中在IaaS领域,以及存储相关服务领域。从笔者的角度看,Ucloud提供的产品和技术实力方面值得称道的地方不多,但是在IaaS层面提供的产品种类比较全大概有10种左右,按照Ucloud自己的话说就是把“云OS”层做厚。

    总体来说,UCloud在产品和技术传达给市场上的印象并不鲜明,不知道2016年是否会有些让人眼前一亮的服务产品出来。

    网宿科技、蓝讯科技
    网宿科技和蓝讯科技是比较类似的,都是在2000年前后成立的,专注IDC相关服务,在CDN服务领域是国内最大的两家服务商。在公有云领域他们确实算不上很值得说道的企业。

    市场策略

    这两家企业因为主营业务一致,都是CDN业务+IDC业务,所以放在一起说几句。国内很多公有云服务的CDN都和这两家企业合作,大型的公有云企业也开始自建CDN服务,所以对他们造成了冲击。

    网宿科技也在考虑进入公有云服务领域,从而拓展云计算相关的营收。但是,笔者感觉他们的魄力不足,动作也比较慢。云计算业务部一年前就要成立,到现在应该也没有完全建立起来,总经理的位置应该还是空缺的。

    在这个发展快速、激烈竞争的云计算市场,网宿科技、蓝汛科技这样拖拉做法将使得他们在云计算领域取得大的进展难度越来越大了。

    产品和技术

    目前,这两家公司的公有云服务产品基本就是CDN,其他通用的IaaS、PaaS等服务非常少或者几乎没有。网宿科技只有了简单的云主机、云备份和云监控的服务。蓝汛科技的云服务基本没有。

    微软Azure、亚马逊AWS
    亚马逊AWS、微软Azure是国际上的两个云计算巨头,以笔者观点来看,这两家企业绝对是未来公有云服务领域的两个领导者。他们在国内也有一些落地的项目,所以在这里简单说两句,在中国具体营收的数据笔者暂时也没有。

    微软和世纪互联合作在国内落地,世纪互联提供数据中心,微软提供技术和服务,在2015年里面微软的Azure在国内的市场拓展还不错。销售和服务团队也很尽职,笔者在2013年曾经试用过微软的Azure,所以定期总是收到来自世纪互联或者微软的销售电话,询问为什么后来不再用他们的服务,以及提供一些促销活动介绍。以微软在企业市场的底蕴,未来在中国的发展潜力是很大的,将来肯定能占领很大一块市场。

    亚马逊AWS在2013年的时候还是非常急切的在国内落地,但是到现在为止,亚马逊的AWS迟迟没有商用,只是在全国建立了三个孵化器,实在是很可惜。以亚马逊AWS的实力如果能够早早的进入中国,绝对能够占领中国公有云服务市场的重要一席之地,不会造成现在阿里云一家独大的局面,或许这正是中国政府想看到的局面吧,国家在下一盘大棋,不是我能懂的:)。

    青云
    2015年,青云作为一家初创企业发展得不错,在国内也有一定影响力了。收入方面青云一直也没有公布,不过号称是国内唯一盈利的公有云服务企业。对于这一点笔者是不太相信的,以青云的1-2万的用户规模来看,营收不会很多,从行业的投入平均水平来看,很难达到盈亏平衡的。当然一切皆有可能,也许Richard真的能够把运营效率做的很好呢。

    市场策略

    在2015年,青云花了不少精力做了国际化拓展、分公司筹建、合作伙伴的拓展以及面向金融领域的云计算项目推广、落地等。

    青云在面相中大型企业的云计算项目销售做得还是有些成效,招商银行、中国银行以及泰康人寿这三个金融领域的客户在Devops领域采用了一些青云的产品和解决方案,也算是初有成效。

    但是,这几个客户采用的青云产品和解决方案主要都是以IaaS层的,还无法对这些企业信息化的核心层面产生大的影响,青云在金融云项目落地开花方面的路还很长。笔者也曾经在IBM这个蓝色巨人里面工作多年后离开,Richard创建青云时期望青出于蓝而胜于蓝,让我倍感亲切。在此,衷心祝愿青云能在2016年里做得更好。

    产品和技术

    目前,青云提供的云服务产品接近20个。2015年里,青云的产品品类也丰富了很多,每个月都会有新的服务产品上线。IaaS层面的服务是比较全了、PaaS服务层面的也有了不少内容,也算卓有成效,另外,通过软件合作伙伴也在SaaS领域上线了不少应用产品,整体上看,云服务产品的生态相对比较全面了,上线的合作伙伴应用数量还有待加强,目前只是几百个。

    青云问题也还是存在的,因为青云的强项是IaaS领域的产品,其他的产品积累黑不是很够,虽然上线了不少大数据、云安全等各种产品,但是产品的成熟度不是很高,很多都是基于开源的解决方案修改后的标准化部署的,对于很多线上用户来说,吸引力不高、用户量也不大,这些都需要时间去改善。

    像Docker容器类的技术服务青云也有应用并上线服务,甚至Unikernal这种更新的技术也在研发中,说明青云对新技术跟进的还是很紧密的,只不过受限于资源投入和用户量,这些新的服务吸引力不够,用户暂时不是很买账。

    因此,青云在产品和服务上还需要精雕细琢,目前可能把精力更多的放在产品和服务品类的数量方面。希望2016年能够在质量、用户体验以及实际带给用户的价值方面多做一些工作,这样才能真正留住用户。

    百度云
    百度云曾经被笔者寄予厚望,以为会成为牵制阿里云的重要一枚棋子,结果却大失所望,整个2015年也没有太多值得书写的地方,就一个以云盘为核心的百度云和百度开放平台提供服务,影响力不大。

    市场策略

    百度其实有很好的基础,可惜在公有云领域战略不清晰,进展缓慢。2015年百度宣传的最多的就是他们的百度大脑、人工智能等,百度云更像一个支撑内部的平台。

    百度开放平台有一些LBS、数据平台为主的服务,在中小企业用户和个人开发者中有些影响力,有些导航、移动应用等产品整合了百度地图和定位的服务。

    目前,笔者得到的消息是,百度也开始加强面相企业市场云计算服务的布局,正在规划和招聘人手,不知道2016年百度云是否会下决心在云服务领域做一番事业。

    产品和技术

    百度云提供了一些面向个人用户的云存储、通讯录同步、信息同步等功能。百度开放平台提供的服务也很有限,感觉只是给一些开发者做课题、做实验的地方,距离产品化的大规模推广还有很大的距离,除了百度地图相关的服务是个亮点。

    其他
    除了以上提到的几个影响力较大的公有云服务商之外,还有几个可以简单提一下。

    七牛云存储

    七牛在2015年里做的相当不错,七牛云存储从名字看就知道他很专注,到现在为止它提供的云服务产品只有三种:安全云存储、分发加速和数据处理,都是围绕数据存储、访问、处理为核心的。

    就因为专注,七牛在2015年发展非常快,技术的积累带来了市场的突破,值得称赞。作为一家专注的创业公司,笔者要对七牛云存储要点赞。

    盛大云

    去年笔者就为盛大云的没落惋惜过,2015年也没什么起色,更显颓势,所以只能把它放到其他这里个类别里面了。估计明年就要从这个综述的文章中拿掉了。盛大云基本都用于支持内部了,值得说的实在不多。

    新浪云

    新浪云目前提供的服务大概是6款,云主机、云应用引擎等是最主要的。新浪云在2015年的发展不是很好,推出的面向企业的SME平台也没有太大成效。新浪云也是很可惜的,错过了2014、2015这快速发展的两年宝贵时光,没有取得好的成果。

    京东云

    京东云也在2015年调整了它们的战略,现在的京东云更多的支持京东内部及京东电商上面的合作伙伴。京东云转型想做中大型企业云市场,不过目前看成效也不是很明显。曾经在一个政府客户那里听到这样一个故事,京东云原本做了一个大数据相关的应用产品,客户的需求及设计方案都是京东的团队帮助写的。结果半年后要招标的时候,发现京东做这个产品的团队解散了。。。解散了。。。

    估计这种事情在很多互联网公司中并不少见,中大型企业市场并不是那么容易进入的,毕竟互联网公司的主营业务并不是输出这些技术界方案,即使是腾讯云估计在进入企业市场的过程中也会遇到很多困难。

    Mopaas魔泊云

    这是国内一个做PaaS服务的厂商,以Cloud Foundry为核心构建的PaaS服务,在PaaS领域也算有点名气,不过这个市场领域却是比较狭窄,发展空间和市场容量有限,对于魔泊云笔者期待2016能开发些有亮点的商业模式出来。

    Unitedstack有云

    有云的创始人是来自于新浪云团队,建立有云之后在Openstack开源领域有不小的贡献,目前也有少量的公有云服务产品,但是主要的产品和服务内容,还是偏向于传统企业的私有云、混合云产品,也算国内稍微有点名气的云计算服务商吧。

    中国联通云、中国移动云

    这两家的情况和中国电信云类似,但是在营收和市场方面做得要比中国电信差不少,所以这里也就不多谈了。

    鹏博士、世纪互联等

    都是IDC向云计算的转型者,其核心还是IDC资源以及传统的IDC用户群体,世纪互联强在和IBM、微软的合作。要说真正在公有云领域的建树的话,IDC转型云服务做得最好的还是中国电信云。

    本文由张小凡整理,转载请注明出处: http://my.525.life/article?id=1510739742055

    优缺点

    参考链接

    开源软件的好处
    成本
    开源最重要的优势是成本。在软件上节省下的开支可以让企业在其他地方进行投资,比如建设更快的网络或更快的存储阵列,又或者向员工支付更高的工资。
    灵活性
    开源软件灵活性体现在能够定制和修改源代码,。
    无要求
    避免繁琐头疼的许可或激活要求是开源软件另一项值得注意的好处,它可以让公司从一些潜在的风险中解放出来,比如违反了专有软件使用的授权。
    自由
    最后,自由是开源的优势。商业软件可能会纠缠不清,也会使企业依赖供应商,被动接受不需要的功能。此外,一个供应商的退出可能会对使用该专有软件的企业产生负面影响,但是开源软件通常会持续很长时间,因为有一个开发者社区。
    开源软件的缺点
    支持差
    开源软件最大的一个缺点是支持服务不到位 (除了付费支持订阅),你懂得!
    文档弱
    很多开源产品缺乏良好的文档记录,或者说就根本就没有文档记录。在许多情况下,你会发现文档已经过时了无用了。
    复杂性
    开源软件或许很强大,但也很难学习和管理。当出现问题时,试图解决问题是一个挑战,特别是在缺乏支持的情况下。
    广告烦
    令人讨厌的广告组件可能是另一个因素,不少开源软件的盈利模式可能就是广告,你不得不被迫接受。
    更容易发现漏洞
    最后,因为开源,任何人都可以看到源代码,这可能会变成一个缺点。如果代码包含了可以被利用的漏洞,恶意者可能会利用这些漏洞。如果没有专门的供应商来发布更新,修补程序可能会比较慢。
    商业软件的优点
    单一供应商
    通常商业软件包括“一站式购物”体验,即单个供应商可以提供你所需的所有应用程序和工具。微软就是一个很好的例子,它销售操作系统、数据库、办公软件等各种应用软件、还有开发工具等等。相比之下,开源软件却比较零碎。
    企业级产品
    商业软件通常是为具有大量特性的大型企业量身定做的。供应商很清楚行业标准和标准公司的需求,并将这些概念包含在他们的编程中,这可以帮助公司保持竞争力。
    专业的接口
    商业软件提供了一个更好的、更标准的接口,它通常适合大多数用户的需求。
    日常更新
    商业软件经常更新,不仅是修补漏洞,也是为了从客户那里获得更多的钱来进行付费升级。
    不需要编程
    你的企业可能不需要自定义或向软件添加代码,因此开放源码的特殊诱惑对你的业务来说是微不足道的,而商业软件是开箱即用。
    集成
    许多商业软件与其他应用程序集成,以便更好地使用和方便。例如,微软的Lync即时消息客户端与Microsoft Outlook集成,因此在查看电子邮件时,可以看到人们的可用性状态,以及即时消息会话被保存到Outlook中。
    商业软件的缺点
    产品臃肿
    商业软件可能包含大量臃肿和不必要的组件或功能。虽然你可以只安装需要的组件,但是对于选项,大部分人其实并不清楚这些组件的作用,只能选择盲目地选择全部安装。
    额外的费用
    除了成本问题,有时候还会包含一些让你意外的额外费用。如月度或年度费用,更新费用的上涨,或其他隐藏的因素。
    供应商锁定
    “一站式购物”导致,你的企业最终可能会过度依赖于供应商,被锁定在一个封闭的系统中。
    替换很难
    害怕浪费钱迫使企业会继续使用那些可能无法完全满足他们利益的产品。切换到竞争或替代软件的困难包括担心必须从头再来,更换一个软件,再培训人员等其他原因。

    哪些公司在使用开源云方案

    CloudStack

    知名用户包括Cloudera、思杰、中国电信、戴尔、迪士尼、华为、诺基亚、SAP、韦里逊及其他许多企业组织。

    Eucalyptus

    惠普

    OpenStack

    红帽、SUSE、Rackspace、IBM、英特尔、惠普、Ubuntu、戴尔

    华数云,华为云

    AWCloud、九州云99Cloud、EasyStack、UnitedStack、T2Cloud、UMCloud、KeyTone Cloud、Kylin Cloud

    华为,联想,浪潮,中兴,宝德,华三

    百度,金山云,乐视云,京东云,爱奇艺,网易云

    移动,联通,电信,人民日报,国家电网

    中国铁路,中国工商银行

    银联 2000的物理节点,近万的虚拟节点

    纵观公有云技术架构,完全自底向上的自主研发已经逐渐被基于开源框架的定制开发所替代。目前完全基于自主架构的公有云恐怕只剩下阿里云和青云了,很多公有云运营商的技术架构已经先后切换到基于OpenStack的架构体系,主流的运营商包括京东云、金山云、华为云、移动大云、Ucloud等。最近的案例是腾讯云也切换到OpenStack架构并且获得了今年的OpenStack超级用户大奖。

    Scalr

    知名用户包括:Expedia、三星、迪士尼、美国宇航局喷气推进实验室、索尼和埃森哲。

    Ceph

    红帽
    美国预测分析公司FICO
    澳大利亚的莫纳什大学 500PB
    乐视,一点资讯,今日头条,滴滴,青云等

    Ceph仅仅是OpenStack后端存储标配,目前很多存储厂商、大企业都基于Ceph技术开发或搭建存储系统,我们首先看看几家存储厂商的产品,如HopeBay和SanDisk。

    Hope Bay科技是一家专注于云平台的科技公司,拥有ArkEase Pro存储服务平台、ArkFlex数据存储平台、Ark Express存储网关和ArkVoice企业云端语音录制平台。在ArkFlex数据存储平台中,Hope Bay对Ceph文件系统进行改良,将CIFS、NFS、iSCSI建构在Ceph RBD之上。

    SanDisk收购Fusion-io之后相继推出ioControl混合式存储阵列和InfiniFlash系列闪存。剥离相关业务到新成立新NextGen公司,SanDisk通过InfiniFlash系列闪存主攻闪存市场,其中就有一款机型InfiniFlash System IF500采用Ceph技术(IF100硬件和InfiniFlash OS Ceph横向扩展软件),同时提供对象存储与块存储服务。SanDisk的存储策略是比较开放,低端存储IF100(纯硬件形态)整合了Nexenta的基于ZFS文件系统开源NexentaStor软件(支持NAS和iSCSI),而高端的IF700则使用了Fusion-io时期的 ION Accelerator数据库加速软件。

    此外,很多大型企业也采用Ceph构建构建云平台和分布式存储解决方案,也正是因为Ceph和OpenStack的深度集成,使得Ceph和OpenStack配合被互联网公司用来搭建云平台。

    乐视基于OpenStack 和Ceph(RBD块存储和RADOSGW对象)搭建乐视云平台;宝德云也基于OpenStack、Ceph(RBD块存储和CephFS) 和Docker构建。电商eBay也采用Ceph和 OpenStack 建设私有云,每个Ceph集群容量都高达数 PB 级别,这些集群主要为 OpenStack 服务。同时,eBay 团队在NAS云化投入逐渐加大,CephFS有可能作为NAS 云化的不二之选。

    携程基于Ceph搭建PB级云对象存储,浪潮AS13000系列存储也是基于Ceph开发,思科UCS流媒体服务存储也是基于Ceph对象存储,雅虎基于Ceph搭建云对象存储。联通研究院、CERN实验室、United Stack等也基于Ceph搭建了开发环境。

    本文由张小凡整理,转载请注明出处: http://my.525.life/article?id=1510739742055

    展开全文
  • Java内存区域怎么划分的?

    万次阅读 2020-09-18 15:12:57
    Java内存区域怎么划分的? 运行时数据区域包含以下五个区域:程序计数器,Java虚拟机栈,本地方法栈,堆,方法区(其中前三个区域各线程私有,相互独立,后面两个区域所有线程共享) 线程私用的部分(Java虚拟机栈,...

    Java内存区域怎么划分的?

    运行时数据区域包含以下五个区域:程序计数器,Java虚拟机栈,本地方法栈,堆,方法区(其中前三个区域各线程私有,相互独立,后面两个区域所有线程共享) 

    线程私用的部分(Java虚拟机栈,本地方法栈,程序计数器)

    Java虚拟机栈

    执行一个Java方法时,虚拟机都会创建一个栈帧,来存储局部变量表,操作数栈等,方法调用完毕后会对栈帧从虚拟机栈中移除。

    局部变量表中存储了Java基本类型,对象引用(可以是对象的存储地址,也可以是代表对象的句柄等)和returnAddress类型(存储了一条字节码指令的地址)。

    本地方法栈

    本地方法栈与Java虚拟机栈类似,只不过是执行Native方法(C++方法等)。

    程序计数器

    计数器存储了当前线程正在执行的字节码指令的地址(如果是当前执行的是Native方法,那么计数器为空),字节码解释器就是通过改变计数器的值来选取下一条需要执行的字节码指令。程序计数器是线程私有的,便于各个线程切换后,可以恢复到正确的执行位置。

    线程共享的部分(堆,方法区)

    Java 堆

    堆存储了几乎所有对象实例和数组,是被所有线程进行共享的区域。在逻辑上是连续的,在物理上可以是不连续的内存空间(在存储一些类似于数组的这种大对象时,基于简单和性能考虑会使用连续的内存空间)。

    方法区

    存储了被虚拟机加载的类型信息,常量,静态变量等数据,在JDK8以后,存储在元空间中(以前是存储在堆中的永久代中,JDK8以后已经没有永久代了)。

    运行时常量池是方法区的一部分,会存储各种字面量和符号引用。具备动态性,运行时也可以添加新的常量入池(例如调用String的intern()方法时,如果常量池没有相应的字符串,会将它添加到常量池)。

    直接内存区(不属于虚拟机运行时数据区)

    直接内存区不属于虚拟机运行时数据区的一部分。它指的是使用Native方法直接分配堆外内存,然后通过Java堆中的DirectByteBuffer来对内存的引用进行操作(可以避免Java堆与Native堆之间的数据复制,提升性能)。

    Java中对象的创建过程是怎么样的?

    这是网上看到的一张流程图:

    java对象创建流程

    1.类加载检查

    首先代码中new关键字在编译后,会生成一条字节码new指令,当虚拟机遇到一条字节码new指令时,会根据类名去方法区运行时常量池找类的符号引用,检查符号引用代表的类是否已加载,解析和初始化过。如果没有就执行相应的类加载过程。

    2.分配内存

    虚拟机从Java堆中分配一块大小确定的内存(因为类加载时,创建一个此类的实例对象的所需的内存大小就确定了),并且初始化为零值。内存分配的方式有指针碰撞空闲列表两种,取决于虚拟机采用的垃圾回收期是否带有空间压缩整理的功能。

    指针碰撞

    如果垃圾收集器是Serial,ParNew等带有空间压缩整理的功能时,Java堆是规整的,此时通过移动内存分界点的指针,就可以分配空闲内存。

    空闲列表

    如果垃圾收集器是CMS这种基于清除算法的收集器时,Java堆中的空闲内存和已使用内存是相互交错的,虚拟机会维护一个列表,记录哪些可用,哪些不可用,分配时从表中找到一块足够大的空闲内存分配给实例对象,并且更新表。

    3.对象初始化(虚拟机层面)

    虚拟机会对对象进行必要的设置,将对象的一些信息存储在Obeject header 中。

    4.对象初始化(Java程序层面)

    在构造一个类的实例对象时,遵循的原则是先静后动,先父后子,先变量,后代码块,构造器。在Java程序层面会依次进行以下操作:

    • 初始化父类的静态变量(如果是首次使用此类)

    • 初始化子类的静态变量(如果是首次使用此类)

    • 执行父类的静态代码块(如果是首次使用此类)

    • 执行子类的静态代码块(如果是首次使用此类)

    • 初始化父类的实例变量

    • 初始化子类的实例变量

    • 执行父类的普通代码块

    • 执行子类的普通代码块

    • 执行父类的构造器

    • 执行子类的构造器

    PS:如何解决内存分配时的多线程并发竞争问题?

    内存分配不是一个线程安全的操作,在多个线程进行内存分配是,可能会存在数据不同步的问题。所以有两种方法解决:

    添加CAS锁

    对内存分配的操作进行同步处理,添加CAS锁,配上失败重试的方式来保证原子性。(默认使用这种方式)。

    预先给各线程分配TLAB

    预先在Java堆中给各个线程分配一块TLAB(本地线程缓冲区)内存,每个线程先在各自的缓冲区中分配内存,使用完了再通过第一种添加CAS锁的方式来分配内存。(是否启动取决于-XX:+/-UseTLAB参数)。

    Java对象的内存布局是怎么样的?

    对象在内存中存储布局主要分为对象头,实例数据和对齐填充三部分。

    Serial收集器中,新生代与老年代的内存分配是1:2,然后新生代分为Eden区,From区,To区,比例是8:1:1。

    新生代

    分为Eden,From Survivor,To Survivor,8:1:1

    Eden用来分配新对象,满了时会触发Minor GC。

    From Survivor是上次Minor GC后存活的对象。

    To Survivor是用于下次Minor GC时存放存活的对象。

    老年代

    用于存放存活时间比较长的对象,大的对象,当容量满时会触发Major GC(Full GC)

    内存分配策略:

    1. 对象优先在Eden分配

    当Eden区没有足够空间进行分配时,虚拟机将发起一次MinorGC。现在的商业虚拟机一般都采用复制算法来回收新生代,将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor。 当进行垃圾回收时,将Eden和Survivor中还存活的对象一次性地复制到另外一块Survivor空间上,最后处理掉Eden和刚才的Survivor空间。(HotSpot虚拟机默认Eden和Survivor的大小比例是8:1)当Survivor空间不够用时,需要依赖老年代进行分配担保。

    1. 大对象直接进入老年代

    所谓的大对象是指,需要大量连续内存空间的Java对象,最典型的大对象就是那种很长的字符串以及数组,为了避免大对象在Eden和两个Survivor区之间进行来回复制,所以当对象超过-XX:+PrintTenuringDistribution参数设置的大小时,直接从老年代分配

    1. 长期存活的对象将进入老年代。

    当对象在新生代中经历过一定次数(XX:MaxTenuringThreshold参数设置的次数,默认为15)的Minor GC后,就会被晋升到老年代中。

    1. 动态对象年龄判定。

    为了更好地适应不同程序的内存状况,虚拟机并不是永远地要求对象年龄必须达到了MaxTenuringThreshold才能晋升老年代,如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄。

    MinorGC和FullGC是什么?

    Minor GC:对新生代进行回收,不会影响到年老代。因为新生代的 Java 对象大多死亡频繁,所以 Minor GC 非常频繁,一般在这里使用速度快、效率高的算法,使垃圾回收能尽快完成。

    Full GC:也叫 Major GC,对整个堆进行回收,包括新生代和老年代。由于Full GC需要对整个堆进行回收,所以比Minor GC要慢,因此应该尽可能减少Full GC的次数,导致Full GC的原因包括:老年代被写满和System.gc()被显式调用等。

    触发Minor GC的条件有哪些?

    1.为新对象分配内存时,新生代的Eden区空间不足。 新生代回收日志:

    2020-05-12T16:15:10.736+0800: 7.803: [GC (Allocation Failure) 2020-05-12T16:15:10.736+0800: 7.803: [ParNew: 838912K->22016K(943744K), 0.0982676 secs] 838912K->22016K(1992320K), 0.0983280 secs] [Times: user=0.19 sys=0.01, real=0.10 secs]
    

    触发Full GC的条件有哪些?

    主要分为三种:

    1.system.gc()

    代码中调用system.gc()方法,建议JVM进行垃圾回收。

    2.方法区空间不足

    方法区中存放的是一些类的信息,当系统中要加载的类、反射的类和调用的方法较多时,方法区可能会被占满,触发 Full GC

    3.老年代空间不足

    而老年代空间不足又有很多种情况: 3.1 Promotion Failed 老年代存放不下晋升对象 在进行 MinorGC 时, Survivor Space 放不下存活的对象,此时会让这些对象晋升,只能将它们放入老年代,而此时老年代也放不下时造成的。 还有一些情况也会导致新生代对象晋升,例如存活对象经历的垃圾回收次数超过一定次数(XX:MaxTenuringThreshold参数设置的次数,默认为15),那么会导致晋升, 或者在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄。 3.2 Concurrent Mode Failure 在执行 CMS GC 的过程中,同时有对象要放入老年代,而此时老年代空间不足造成的。 3.3 历次晋升的对象平均大小>老年代的剩余空间 这是一个较为复杂的触发情况, HotSpot为了避免由于新生代对象晋升到老年代导致老年代空间不足的现象, 在进行 Minor GC时,做了一个判断,如果之前统计所得到的 MinorGC 晋升到老年代的平均大小大于老年代的剩余空间,那么就直接触发 Full GC。 3.4 老年代空间不足以为大对象分配内存 因为超过阀值(-XX:+PrintTenuringDistribution参数设置的大小时)的大对象,会直接分配到老年代,如果老年代空间不足,会触发Full GC。

    垃圾收集器有哪些?

    一般老年代使用的就是标记-整理,或者标记-清除+标记-整理结合(例如CMS)

    新生代就是标记-复制算法

    垃圾收集器特点算法适用内存区域
    Serial单个GC线程进行垃圾回收,简单高效标记-复制新生代
    Serial Old单个GC线程进行垃圾回收标记-整理老年代
    ParNew是Serial的改进版,就是可以多个GC线程一起进行垃圾回收标记-复制新生代
    Parallel Scanvenge收集器(吞吐量优先收集器)高吞吐量,吞吐量=执行用户线程的时间/CPU执行总时间标记-复制新生代
    Parallel Old收集器支持多线程收集标记-整理老年代
    CMS收集器(并发低停顿收集器)低停顿标记-清除+标记-整理老年代
    G1收集器低停顿,高吞吐量标记-复制算法老年代,新生代

    Serial收集器(标记-复制算法)

    就是最简单的垃圾收集器,也是目前 JVM 在 Client 模式默认的垃圾收集器,在进行垃圾收集时会停止用户线程,然后使用一个收集线程进行垃圾收集。主要用于新生代,使用标记-复制算法。

    优点是简单高效(与其他收集器的单线程比),内存占用小,因为垃圾回收时就暂停所有用户线程,然后使用一个单线程进行垃圾回收,不用进行线程切换。

    缺点是收集时必须停止其他用户线程。

    Serial Old收集器(标记-整理算法)

    跟Serial收集器一样,不过是应用于老年代,使用标记-整理算法。

    ParNew收集器(标记-复制算法)

    ParNew收集器是Serial收集器的多线程并行版本,在进行垃圾收集时可以使用多个线程进行垃圾收集。

    与Serial收集器主要区别就是支持多线程收集,ParNew收集器应用广泛(JDK9以前,服务端模式垃圾收集组合官方推荐的是ParNew+CMS),因为只有Serial和ParNew才能配合CMS收集器(应用于老年代的并发收集器)一起工作。

    image-20200228185412716.pngimage-20200228185412716

    Parallel Scanvenge收集器(吞吐量优先收集器)

    也支持多线程收集,它的目标是达到一个可控制的吞吐量,就是运行用户代码的时间/CPU消耗的总时间的比值。高吞吐量可以最高效率地利用处理器资源,尽快完成程序运算任务,适合不需要太多的交互分析任务。不支持并发收集,进行垃圾回收时会暂停用户线程,使用多个垃圾回收线程进行垃圾回收。

    Parallel Old收集器

    是Parallel Scanvenge老年代版本,支持多线程收集,使用标记整理法实现的,

      

    G1对象分配策略

    说起对象的分配,我们不得不谈谈对象的分配策略。它分为4个阶段:

    1. 栈上分配
    2. TLAB(Thread Local Allocation Buffer)线程本地分配缓冲区
    3. 共享Eden区中分配
    4. Humongous区分配(超过Region大小50%的对象)

    对象在分配之前会做逃逸分析,如果该对象只会被本线程使用,那么就将该对象在栈上分配。这样对象可以在函数调用后销毁,减轻堆的压力,避免不必要的gc。 如果对象在栈是上分配不成功,就会使用TLAB来分配。TLAB为线程本地分配缓冲区,它的目的为了使对象尽可能快的分配出来。如果对象在一个共享的空间中分配,我们需要采用一些同步机制来管理这些空间内的空闲空间指针。在Eden空间中,每一个线程都有一个固定的分区用于分配对象,即一个TLAB。分配对象时,线程之间不再需要进行任何的同步。

    对TLAB空间中无法分配的对象,JVM会尝试在共享Eden空间中进行分配。如果是大对象,则直接在Humongous区分配。

    最后,G1提供了两种GC模式,Young GC和Mixed GC,两种都是Stop The World(STW)的。下面我们将分别介绍一下这2种模式。

    G1 Young GC

    Young GC主要是对Eden区进行GC,它在Eden空间耗尽时会被触发。在这种情况下,Eden空间的数据移动到Survivor空间中,如果Survivor空间不够,Eden空间的部分数据会直接晋升到年老代空间。Survivor区的数据移动到新的Survivor区中,也有部分数据晋升到老年代空间中。最终Eden空间的数据为空,GC停止工作,应用线程继续执行。

    Region如何解决跨代指针?

    因为老年代old区也会存在对新生代Eden区的引用,如果只是为了收集Eden区而对整个老年代进行扫描,那样开销太大了,所以G1其实会将每个Region分为很多个区,每个区有一个下标,当这个区有对象被其他Region引用时,那么CardTable对应下标下值为0,然后使用一个Rset来存储其他Region对当前Region的引用,Key是别的Region的起始地址,Value是一个集合,里面的元素是Card Table的Index。对跨代引用的扫描,只需要扫描RSet就行了。

    在CMS中,也有RSet的概念,在老年代中有一块区域用来记录指向新生代的引用。这是一种point-out,在进行Young GC时,扫描根时,仅仅需要扫描这一块区域,而不需要扫描整个老年代。

    但在G1中,并没有使用point-out(就是记录当前Region对其他Region中对象的引用),这是由于一个Region太小,Region数量太多,如果是用point-out的话,如果需要计算一个Region的可回收的对象数量,需要把所有Region都是扫描一遍会造成大量的扫描浪费,有些根本不需要GC的分区引用也扫描了。于是G1中使用point-in来解决。point-in的意思是哪些Region引用了当前Region中的对象。这样只需要将当前Region中这些对象当做初始标记时的根对象来扫描就可以扫描出因为有跨代引用需要存活的对象,避免了无效的扫描。

    由于新生代有多个,那么我们需要在新生代之间记录引用吗?这是不必要的,原因在于每次GC时,所有新生代都会被扫描,所以只需要记录老年代的Region对新生代的这个Region之间的引用即可。

    需要注意的是,如果引用的对象很多,赋值器需要对每个引用做处理,赋值器开销会很大,为了解决赋值器开销这个问题,在G1 中又引入了另外一个概念,卡表(Card Table)。一个Card Table将一个分区在逻辑上划分为固定大小的连续区域,每个区域称之为卡。卡通常较小,介于128到512字节之间。CardTable通常为字节数组,由Card的索引(即数组下标)来标识每个分区的空间地址。默认情况下,每个卡都未引用。当一个地址空间有引用时,这个地址空间对应的数组索引的值被标记为"0",即标记为脏引用,此外RSet也将这个数组下标记录下来。一般情况下,这个RSet其实是一个Hash Table集合(每个线程对应一个Hash Table,主要是为了减少多线程并发更新RSet的竞争),每个哈希表的Key是别的Region的起始地址,Value是一个集合,里面的元素是Card Table的Index。

    如果Rset是记录每个外来Region对当前Region中对象的引用,这样数量就太多了,所以Card Table只是有很多Byte字节,每个字节记录了Region对应的一个内存区域(卡页)是否是dirty的,为1代表dirty,也就是有其他Region对这个卡页中的对象进行引用。

     

    • 阶段1:根扫描 表态和本地对象被扫描
    • 阶段2:更新RS 处理dirty card队列更新RS
    • 阶段3:处理RS 检测从新生代指向老年代的对象
    • 阶段4:对象拷贝 拷贝存活的对象到survivor/old区域
    • 阶段5:处理引用队列 软引用、弱引用、虚引用处理

    G1 MixGC

    MixGC不仅进行正常的新生代垃圾收集,同时也回收部分后台扫描线程标记的老年代分区。Young GC回收是把新生代活着的对象都拷贝到Survivor的特定区域(Survivor to),剩下的Eden和Survivor from就可以全部回收清理了。那么,mixed GC就是把一部分老年区的region加到Eden和Survivor from的后面,合起来称为collection set, 就是将被回收的集合,下次mixed GC evacuation把他们所有都一并清理。选old region的顺序是垃圾多的(存活对象少)优先。

    它的GC步骤分2步:

    1. 全局并发标记(global concurrent marking)
    2. 拷贝存活对象(evacuation)

    在进行Mix GC之前,会先进行global concurrent marking(全局并发标记)。 global concurrent marking的执行过程是怎样的呢?

    在G1 GC中,它主要是为Mixed GC提供标记服务的,并不是一次GC过程的一个必须环节。global concurrent marking的执行过程分为五个步骤:

    • 初始标记(initial mark,STW) 在此阶段,G1 GC 对根进行标记。该阶段与常规的(STW) 新生代垃圾回收密切相关。
    • 根区域扫描(root region scan) G1 GC 在初始标记的存活区扫描对老年代的引用,并标记被引用的对象。该阶段与应用程序(非 STW)同时运行,并且只有完成该阶段后,才能开始下一次 STW 新生代垃圾回收。
    • 并发标记(Concurrent Marking) G1 GC 在整个堆中查找可访问的(存活的)对象。该阶段与应用程序同时运行,可以被 STW 新生代垃圾回收中断
    • 最终标记(Remark,STW) 该阶段是 STW 回收,帮助完成标记周期。G1 GC清空 SATB 缓冲区,跟踪未被访问的存活对象,并执行引用处理。
    • 清除垃圾(Cleanup,STW) 在这个最后阶段,G1 GC 执行统计和 RSet 净化的 STW 操作。在统计期间,G1 GC 会识别完全空闲的区域和可供进行混合垃圾回收的区域。清理阶段在将空白区域重置并返回到空闲列表时为部分并发。

    收集步骤:

    image-20200302181639409.pngimage-20200302181639409

    初始标记 只标记GC Roots直接引用的对象

    并发标记 从GC Roots开始对堆中对象进行可达性分析,扫描整个对象图,找出要回收的对象。(可以与用户线程并发执行)

    最终标记 对并发标记阶段,由于用户线程执行造成的改动进行修正,使用原始快照方法。

    筛选回收 对Region进行排序,根据回收价值,选择任意多个Region构成回收集,将存活对象复制到空的Region中去,因为涉及到存活对象的移动,所以是暂停用户线程的。

    垃圾收集器相关的参数

    -XX:+UseSerialGC, 虚拟机运行在Client 模式下的默认值,打开此开关后,使用Serial + Serial Old 的收集器组合进行内存回收

    -XX:+UseConcMarkSweepGC,打开此开关后,使用ParNew + CMS + Serial Old 的收集器组合进行内存回收。Serial Old 收集器将作为CMS 收集器出现Concurrent Mode Failure失败后的后备收集器使用。(我们的线上服务用的都是这个)

    -XX:+UseParallelGC,虚拟机运行在Server 模式下的默认值,打开此开关后,使用Parallel Scavenge + Serial Old(PS MarkSweep)的收集器组合进行内存回收。

    -XX:+UseParallelOldGC,打开此开关后,使用Parallel Scavenge + Parallel Old 的收集器组合进行内存回收。

    -XX:+UseG1GC,打开此开关后,采用 Garbage First (G1) 收集器

    -XX:+UseParNewGC,在JDK1.8被废弃,在JDK1.7还可以使用。打开此开关后,使用ParNew + Serial Old 的收集器组合进行内存回收

    目前通常使用的是什么垃圾收集器?

    怎么查询当前JVM使用的垃圾收集器?

    使用这个命令可以查询当前使用的垃圾收集器 java -XX:+PrintCommandLineFlags -version,

    另外这个命令可以查询到更加详细的信息

    java -XX:+PrintFlagsFinal -version | grep GC

    我们在IDEA中启动的一个Springboot的项目,默认使用的垃圾收集器参数是 -XX:+UseParallelGC

    -XX:InitialHeapSize=134217728 -XX:MaxHeapSize=2147483648 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC 
    java version "1.8.0_73"
    Java(TM) SE Runtime Environment (build 1.8.0_73-b02)
    Java HotSpot(TM) 64-Bit Server VM (build 25.73-b02, mixed mode)
    

    Parallel Scavenge+Serial Old

    JDK8默认情况下服务端模式下JVM垃圾回收参数是-XX:+UseParallelGC参数,也就是会使用Parallel Scavenge+Serial Old的收集器组合,进行内存回收。

    ParNew+CMS

    但是一般如果我们的后端应用不是那种需要进行大量计算的应用,基于低延迟的考虑,可以考虑使用-XX:+UseConcMarkSweepGC进行垃圾收集,这种配置下会使用ParNew来收集新生代内存,CMS垃圾回收器收集老年代内存。

    G1

    在JDK9时,默认的垃圾收集器是G1收集器,也可以使用-XX:+UseG1GC参数来启动G1垃圾收集器。

     

    容器的内存和 jvm 的内存有什么关系?参数怎么配置?

    在JDK8以后,JVM增加了容器感知功能,就是如果不显示指定-Xmx2048m 最大堆内存大小, -Xms2048m最小堆内存大小,会取容器所在的物理机的内存的25%作为最大堆内存大小, 也可以通过这几个参数来设置堆内存占容器内存的比例 -XX:MinRAMPercentage -XX:MaxRAMPercentage -XX:InitialRAMPercentage

    如何大体估算java进程使用的内存呢?

    Max memory = [-Xmx] + [-XX:MaxPermSize] + number_of_threads * [-Xss]

    -Xss128k:设置每个线程的堆栈大小.JDK5.0以后每个线程的栈大小为1M。

    -Xms 堆内存的初始大小,默认为物理内存的1/64 -Xmx 堆内存的最大大小,默认为物理内存的1/4 -Xmn 堆内新生代的大小。通过这个值也可以得到老生代的大小:-Xmx减去-Xmn

    -Xss 设置每个线程可使用的内存大小,即栈的大小。在相同物理内存下,减小这个值能生成更多的线程,当然操作系统对一个进程内的线程数还是有限制的,不能无限生成。线程栈的大小是个双刃剑,如果设置过小,可能会出现栈溢出,特别是在该线程内有递归、大的循环时出现溢出的可能性更大,如果该值设置过大,就有影响到创建栈的数量,如果是多线程的应用,就会出现内存溢出的错误。

    怎么获取 dump 文件?怎么分析?

    1. 启动时配置,出现OOM问题时自动生成 JVM启动时增加两个参数:
    //出现 OOME 时生成堆 dump: 
    -XX:+HeapDumpOnOutOfMemoryError
    //生成堆文件地址:
    -XX:HeapDumpPath=/home/liuke/jvmlogs/
    

    2.执行jmap命令立即生成 发现程序异常前通过执行指令,直接生成当前JVM的dmp文件,6214是指JVM的进程号

    jmap -dump:format=b,file=/home/admin/logs/heap.hprof 6214
    

    获得heap.hprof以后,执行jvisualvm命令打开使用Java自带的工具Java VisualVM来打开heap.hprof文件,就可以分析你的Java线程里面对象占用堆内存的情况了

    由于第一种方式是一种事后方式,需要等待当前JVM出现问题后才能生成dmp文件,实时性不高,第二种方式在执行时,JVM是暂停服务的,所以对线上的运行会产生影响。所以建议第一种方式。

    gc日志怎么看?

    这是一条Minor GC的回收日志

    2020-05-07T16:28:02.845+0800: 78210.469: [GC (Allocation Failure) 2020-05-07T16:28:02.845+0800: 78210.469: [ParNew: 68553K->466K(76672K), 0.0221963 secs] 131148K->63062K(2088640K), 0.0223082 secs] [Times: user=0.02 sys=0.00, real=0.02 secs] 
    

    GC (Allocation Failure)

    代表Eden区分配内存失败触发Minor GC。 2020-05-07T16:28:02.845+0800: 78210.469

    是发生的时间。 68553K->466K(76672K)

    代表垃圾回收前新生代使用内存是68MB,剩余0.4MB,总内存是76MB。 0.0221963 secs

    是垃圾回收耗时。 131148K->63062K(2088640K)

    代表堆区回收前使用131MB,63MB,总内存是2088MB。

    [Times: user=0.02 sys=0.00, real=0.02 secs]

    用户态耗时0.02s,内核态耗时0s,总耗时0.02s

    cpu 使用率特别高,怎么排查?通用方法?定位代码?cpu高的原因?

    CPU飙高,频繁GC,怎么排查?

    jstack命令:教你如何排查多线程问题

     jstat -gcutil 29530 1000 10
     垃圾回收信息统计,29530是pid,1000是每1秒打印一次最新信息,10是最多打印10次
    

    怎么排查CPU占用率过高的问题?

    1.首先使用top命令查看CPU占用率高的进程的pid。

    top - 15:10:32 up 523 days,  3:47,  1 user,  load average: 0.00, 0.01, 0.05
    Tasks:  95 total,   1 running,  94 sleeping,   0 stopped,   0 zombie
    %Cpu(s):  1.7 us,  0.5 sy,  0.0 ni, 95.7 id,  2.2 wa,  0.0 hi,  0.0 si,  0.0 st
    KiB Mem : 16267904 total,  6940648 free,  2025316 used,  7301940 buff/cache
    KiB Swap: 16777212 total, 16776604 free,      608 used. 13312484 avail Mem
    
      PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
    14103 hadoop    20   0 2832812 203724  18392 S   3.7  1.3 977:08.04 java
    14010 hadoop    20   0 2897344 285392  18660 S   0.3  1.8 513:30.49 java
    14284 hadoop    20   0 3052556 340436  18636 S   0.3  2.1   1584:47 java
    14393 hadoop    20   0 2912460 504112  18632 S   0.3  3.1 506:43.68 java
        1 root      20   0  190676   3404   2084 S   0.0  0.0   4:31.47 systemd
        2 root      20   0       0      0      0 S   0.0  0.0   0:04.77 kthreadd
        3 root      20   0       0      0      0 S   0.0  0.0   0:10.16 ksoftirqd/0
    

    2.使用top -Hp 进程id获得该进程下各个线程的CPU占用情况,找到占用率最高的线程的pid2, 使用printf "%x\n" pid2命令将pid2转换为16进制的数number。

    top - 15:11:01 up 523 days,  3:48,  1 user,  load average: 0.00, 0.01, 0.05
    Threads:  69 total,   0 running,  69 sleeping,   0 stopped,   0 zombie
    %Cpu(s): 12.8 us,  0.1 sy,  0.0 ni, 87.0 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
    KiB Mem : 16267904 total,  6941352 free,  2024612 used,  7301940 buff/cache
    KiB Swap: 16777212 total, 16776604 free,      608 used. 13313188 avail Mem
    
      PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
    14393 hadoop    20   0 2912460 504112  18632 S  0.0  3.1   0:00.01 java
    14411 hadoop    20   0 2912460 504112  18632 S  0.0  3.1   0:01.95 java
    14412 hadoop    20   0 2912460 504112  18632 S  0.0  3.1   0:16.18 java
    14413 hadoop    20   0 2912460 504112  18632 S  0.0  3.1   0:12.79 java
    14414 hadoop    20   0 2912460 504112  18632 S  0.0  3.1   8:09.10 java
    

    3.使用jstack pid获得进程下各线程的堆栈信息,nid=0xnumber的线程即为占用率高的线程,查看它是在执行什么操作。(jstack 5521 | grep -20 0x1596可以获得堆栈信息中,会打印匹配到0x1596的上下20行的信息。)

    例如这个线程是在执行垃圾回收:

    "GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007f338c01f000 nid=0x1593 runnable
    

    JVM相关的异常

    1.stackoverflow

    这种就是栈的空间不足,就会抛出这个异常,一般是递归执行一个方法时,执行方法深度太深时出现。Java执行一个方法时,会创建一个栈帧来存放局部变量表,操作数栈,如果分配栈帧时,栈空间不足,那么就会抛出这个异常。

    (栈空间可以设置-Xss参数实现,默认为1M,如果参数)

    双亲委派机制是什么?

     

    就是类加载器一共有三种:

    启动类加载器:主要是在加载JAVA_HOME/lib目录下的特定名称jar包,例如rt.jar包,像java.lang就在这个jar包中。

    扩展加载器:主要是加载JAVA_HOME/lib/ext目录下的具备通用性的类库。

    应用程序加载器:加载用户类路径下所有的类库,也就是程序中默认的类加载器。

    工作流程:

    除启动类加载器以外,所有类加载器都有自己的父类加载器,类加载器收到一个类加载请求时,首先会判断类是否已经加载过了,没有的话会调用父类加载器的的loadClass方法,将请求委派为父加载器,当父类加载器无法完成类加载请求时,子加载器才尝试去加载这个类。 目的是为了保证每个类只加载一次,并且是由特定的类加载器进行加载(都是首先让启动类来进行加载)。

    public abstract class ClassLoader {
        ...
        public Class<?> loadClass(String name) throws ClassNotFoundException {
            return loadClass(name, false);
        }
        protected Class<?> loadClass(String name, boolean resolve)
            throws ClassNotFoundException {
            synchronized (getClassLoadingLock(name)) {
                Class<?> c = findLoadedClass(name);
                if (c == null) {
                    ...
                    try {
                        if (parent != null) {
                            c = parent.loadClass(name, false);
                        } else {
                            c = findBootstrapClassOrNull(name);
                        }
                    } catch (ClassNotFoundException e) {
                    }
    
                    if (c == null) {
                        ...
                        c = findClass(name);
                        // do some stats
                        ...
                    }
                }
                if (resolve) {
                    resolveClass(c);
                }
                return c;
            }
        }
        protected Class<?> findClass(String name) throws ClassNotFoundException {
            throw new ClassNotFoundException(name);
        }
        ...
    }

    怎么自定义一个类加载器?

    加载一个类时,一般是调用类加载器的loadClass()方法来加载一个类,loadClass()方法的工作流程如下:

    1.先调用findLoadedClass(className)来获取这个类,判断类是否已加载。

    2.如果未加载,如果父类加载器不为空,调用父类加载器的loadClass()来加载这个类,父类加载器为空,就调用父类加载器加载这个类。

    3.父类加载器加载失败,那么调用该类加载器findClass(className)方法来加载这个类。

    所以我们我们一般自定义类加载器都是继承ClassLoader,来重新findClass()方法,来实现类加载。

    public class DelegationClassLoader extends ClassLoader {
      private String classpath;
    
      public DelegationClassLoader(String classpath, ClassLoader parent) {
        super(parent);
        this.classpath = classpath;
      }
    
      @Override
      protected Class<?> findClass(String name) throws ClassNotFoundException {
        InputStream is = null;
        try {
          String classFilePath = this.classpath + name.replace(".", "/") + ".class";
          is = new FileInputStream(classFilePath);
          byte[] buf = new byte[is.available()];
          is.read(buf);
          return defineClass(name, buf, 0, buf.length);
        } catch (IOException e) {
          throw new ClassNotFoundException(name);
        } finally {
          if (is != null) {
            try {
              is.close();
            } catch (IOException e) {
              throw new IOError(e);
            }
          }
        }
      }
    
      public static void main(String[] args)
          throws ClassNotFoundException, IllegalAccessException, InstantiationException,
          MalformedURLException {
        sun.applet.Main main1 = new sun.applet.Main();
    
        DelegationClassLoader cl = new DelegationClassLoader("java-study/target/classes/",
            getSystemClassLoader());
        String name = "sun.applet.Main";
        Class<?> clz = cl.loadClass(name);
        Object main2 = clz.newInstance();
    
        System.out.println("main1 class: " + main1.getClass());
        System.out.println("main2 class: " + main2.getClass());
        System.out.println("main1 classloader: " + main1.getClass().getClassLoader());
        System.out.println("main2 classloader: " + main2.getClass().getClassLoader());
        ClassLoader itrCl = cl;
        while (itrCl != null) {
          System.out.println(itrCl);
          itrCl = itrCl.getParent();
        }
      }
    }

    类加载的过程是什么样的?

    类加载器

    类加载器是 Java 运行时环境(Java Runtime Environment)的一部分,负责动态加载 Java 类到 Java 虚拟机的内存空间中。类通常是按需加载,即第一次使用该类时才加载。 由于有了类加载器,Java 运行时系统不需要知道文件与文件系统。每个 Java 类必须由某个类加载器装入到内存。

     

    类装载器除了要定位和导入二进制 class 文件外,还必须负责验证被导入类的正确性,为变量分配初始化内存,以及帮助解析符号引用。这些动作必须严格按一下顺序完成:

    1. 装载:查找并装载类型的二进制数据。
    2. 链接:执行验证、准备以及解析(可选) - -验证:确保被导入类型的正确性 -准备:为类变量分配内存,并将其初始化为默认值。
    • 解析:把类型中的符号引用转换为直接引用。
    1. 初始化:把类变量初始化为正确的初始值。

    装载

    类加载器分类

    在Java虚拟机中存在多个类装载器,Java应用程序可以使用两种类装载器:

    • Bootstrap ClassLoader:此装载器是 Java 虚拟机实现的一部分。由原生代码(如C语言)编写,不继承自 java.lang.ClassLoader 。负责加载核心 Java 库,启动类装载器通常使用某种默认的方式从本地磁盘中加载类,包括 Java API。
    • Extention Classloader:用来在<JAVA_HOME>/jre/lib/ext ,或 java.ext.dirs 中指明的目录中加载 Java 的扩展库。 Java 虚拟机的实现会提供一个扩展库目录。
    • Application Classloader:根据 Java应用程序的类路径( java.class.path 或 CLASSPATH 环境变量)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader() 来获取它。
    • 自定义类加载器:可以通过继承 java.lang.ClassLoader 类的方式实现自己的类加载器,以满足一些特殊的需求而不需要完全了解 Java 虚拟机的类加载的细节。

    全盘负责双亲委托机制

    在一个 JVM 系统中,至少有 3 种类加载器,那么这些类加载器如何配合工作?在 JVM 种类加载器通过 全盘负责双亲委托机制 来协调类加载器。

    • 全盘负责:指当一个 ClassLoader 装载一个类的时,除非显式地使用另一个 ClassLoader ,该类所依赖及引用的类也由这个 ClassLoader 载入。
    • 双亲委托机制:指先委托父装载器寻找目标类,只有在找不到的情况下才从自己的类路径中查找并装载目标类。

    全盘负责双亲委托机制只是 Java 推荐的机制,并不是强制的机制。实现自己的类加载器时,如果想保持双亲委派模型,就应该重写 findClass(name) 方法;如果想破坏双亲委派模型,可以重写 loadClass(name) 方法。

    装载入口

    所有Java虚拟机实现必须在每个类或接口首次主动使用时初始化。以下六种情况符合主动使用的要求:

    • 当创建某个类的新实例时(new、反射、克隆、序列化)
    • 调用某个类的静态方法
    • 使用某个类或接口的静态字段,或对该字段赋值(用final修饰的静态字段除外,它被初始化为一个编译时常量表达式)
    • 当调用Java API的某些反射方法时。
    • 初始化某个类的子类时。
    • 当虚拟机启动时被标明为启动类的类。

    除以上六种情况,所有其他使用Java类型的方式都是被动的,它们不会导致Java类型的初始化。 当类是被动引用时,不会触发初始化:

    1.通过子类去调用父类的静态变量,不会触发子类的初始化,只会触发包含这个静态变量的类初始化,例如执行这样的代码SubClass.fatherStaticValue只会触发FatherClass的初始化,不会触发SubClass的初始化,因为fatherStaticValue是FatherClass的变量

    2.通过数组定义类引用类,SuperClass[] array = new SuperClass[10];

    不会触发SuperClass类的初始化,但是执行字节码指令newarray会触发另外一个类[Lorg.fenixsoft.classloading.SuperClass的初始化,这个类继承于Object类,是一个包装类,里面包含了访问数组的所有方法,

    3.只引用类的常量不会触发初始化,因为常量在编译阶段进入常量池

    class SuperClass {
    		public static final String str = "hello";
    }
    
    //引用常量编译时会直接存入常量池
    System.out.println(SuperClass.str);
    

    对于接口来说,只有在某个接口声明的非常量字段被使用时,该接口才会初始化,而不会因为事先这个接口的子接口或类要初始化而被初始化。

    父类需要在子类初始化之前被初始化。当实现了接口的类被初始化的时候,不需要初始化父接口。然而,当实现了父接口的子类(或者是扩展了父接口的子接口)被装载时,父接口也要被装载。(只是被装载,没有初始化)

    验证

    确认装载后的类型符合Java语言的语义,并且不会危及虚拟机的完整性。

    • 装载时验证:检查二进制数据以确保数据全部是预期格式、确保除 Object 之外的每个类都有父类、确保该类的所有父类都已经被装载。
    • 正式验证阶段:检查 final 类不能有子类、确保 final 方法不被覆盖、确保在类型和超类型之间没有不兼容的方法声明(比如拥有两个名字相同的方法,参数在数量、顺序、类型上都相同,但返回类型不同)。
    • 符号引用的验证:当虚拟机搜寻一个被符号引用的元素(类型、字段或方法)时,必须首先确认该元素存在。如果虚拟机发现元素存在,则必须进一步检查引用类型有访问该元素的权限。

    准备

    在准备阶段,Java虚拟机为类变量分配内存,设置默认初始值。但在到到初始化阶段之前,类变量都没有被初始化为真正的初始值。

    类型默认值
    int0
    long0L
    short(short)0
    char’\u0000’
    byte(byte)0
    blooeanfalse
    float0.0f
    double0.0d
    referencenull

    解析的过程就是在类型的常量池总寻找类、接口、字段和方法的符号引用,把这些符号引用替换为直接引用的过程

    • 类或接口的解析:判断所要转化成的直接引用是数组类型,还是普通的对象类型的引用,从而进行不同的解析。
    • 字段解析:对字段进行解析时,会先在本类中查找是否包含有简单名称和字段描述符都与目标相匹配的字段,如果有,则查找结束;如果没有,则会按照继承关系从上往下递归搜索该类所实现的各个接口和它们的父接口,还没有,则按照继承关系从上往下递归搜索其父类,直至查找结束,

    初始化

    所有的类变量(即静态量)初始化语句和类型的静态初始化器都被Java编译器收集在一起,放到一个特殊的方法中,这个步骤就是初始化类静态变量和执行静态代码块。 对于类来说,这个方法被称作类初始化方法;对于接口来说,它被称为接口初始化方法。在类和接口的 class 文件中,这个方法被称为<clinit>

    1. 如果存在直接父类,且直接父类没有被初始化,先初始化直接父类。
    2. 如果类存在一个类初始化方法,执行此方法。

    这个步骤是递归执行的,即第一个初始化的类一定是Object

    Java虚拟机必须确保初始化过程被正确地同步。 如果多个线程需要初始化一个类,仅仅允许一个线程来进行初始化,其他线程需等待。

    这个特性可以用来写单例模式。

    Clinit 方法

    • 对于静态变量和静态初始化语句来说:执行的顺序和它们在类或接口中出现的顺序有关。
    • 并非所有的类都需要在它们的class文件中拥有()方法, 如果类没有声明任何类变量,也没有静态初始化语句,那么它就不会有<clinit>()方法。如果类声明了类变量,但没有明确的使用类变量初始化语句或者静态代码块来初始化它们,也不会有<clinit>()方法。如果类仅包含静态final常量的类变量初始化语句,而且这些类变量初始化语句采用编译时常量表达式,类也不会有<clinit>()方法。只有那些需要执行Java代码来赋值的类才会有()
    • final常量:Java虚拟机在使用它们的任何类的常量池或字节码中直接存放的是它们表示的常量值。

    JVM调优有哪些工具?

    jstat

    jstat可以打印出当前JVM运行的各种状态信息,例如新生代内存使用情况,老年代内存使用情况,Minor GC发生总次数,总耗时,Full GC发生总次数,总耗时。

    //5828是java进程id,1000是打印间隔,每1000毫秒打印一次,100是总共打印100次
    jstat -gc 5828 1000 100
    

    打印结果如下:

    各个参数的含义如下:

    S0C 新生代中第一个survivor(幸存区)的总容量 (字节)

    S1C 新生代中第二个survivor(幸存区)的总容量 (字节)

    S0U 新生代中第一个survivor(幸存区)目前已使用空间 (字节)

    S1U 新生代中第二个survivor(幸存区)目前已使用空间 (字节)

    EC 新生代中Eden(伊甸园)的总容量 (字节)

    EU 新生代中Eden(伊甸园)目前已使用空间 (字节)

    OC 老年代的总容量 (字节)

    OU 老年代代目前已使用空间 (字节)

    YGC 目前新生代垃圾回收总次数

    YGCT 目前新生代垃圾回收总消耗时间

    FGC 目前full gc次数总次数

    FGCT 目前full gc次数总耗时,单位是秒

    GCT 垃圾回收总耗时

    一般还可以使用jstat -gcutil <pid>:统计gc信息,这样打印出来的结果是百分比,而不是实际使用的空间,例如jstat -gcutil 1 1000 100

    例如,S0代表 新生代中第一个survivor区的空间使用了73.19%,E代表新生代Eden区使用了51%,O代表老年代食堂了98%

     

    参数描述
    S0年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
    s1年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
    E年轻代中Eden已使用的占当前容量百分比
    Oold代已使用的占当前容量百分比
    M元空间(MetaspaceSize)已使用的占当前容量百分比
    CCS压缩使用比例
    YGC年轻代垃圾回收次数
    FGC老年代垃圾回收次数
    FGCT老年代垃圾回收消耗时间
    GCT垃圾回收消耗总时间

     

    jstack

    jstack可以生成当前JVM的线程快照,也就是当前每个线程当前的状态及正在执行的方法,锁相关的信息。jstack -l 进程id ,-l代表除了堆栈信息外,还会打印锁的附加信息。jstack还会检测出死锁信息。一般可以用于定位线程长时间停顿,线程间死锁等问题。

    例如在下面的例子中,第一个线程获取到lock1,再去获取lock2,第二个线程先获取到lock2,然后再去获取lock1。每个线程都只获得了一个锁,同时在获取另外一个锁,就会进入死锁状态。

    public static void main(String[] args) {
            final Integer lock1 = new Integer(1);
            final String  lock2 = new String();
            ExecutorService executorService = Executors.newCachedThreadPool();
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    synchronized (lock1) {
                        System.out.println("线程1获得了lock1");
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println("线程1休眠结束");
                        System.out.println("线程1开始尝试获取lock2");
                        synchronized (lock2) {
                            System.out.println("线程1获得了lock2");
                        }
                    }
                }
            });
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    synchronized (lock2) {
                        System.out.println("线程2获得了lock2");
                        System.out.println("线程2开始尝试获取lock1");
                        synchronized (lock1) {
                            System.out.println("线程2获得了lock2");
                        }
                    }
                }
            });
        }

    使用jstack -l 进程id就可以打印出当前的线程信息

     

    以及各个线程的状态,执行的方法(pool-1-thread-1和pool-1-thread-2分别代表线程池的第一个线程和第二个线程):

     

    jmap

    一般可以生成当前堆栈快照。使用 jmap -heap可以打印出当前各个分区的内存使用情况,使用jmap -dump:format=b,file=dump.hprof 进程id可以生成当前的堆栈快照,堆快照和对象统计信息,对生成的堆快照进行分析,可以分析堆中对象所占用内存的情况,检查大对象等。执行jvisualvm命令打开使用Java自带的工具Java VisualVM来打开堆栈快照文件,进行分析。可以用于排查内存溢出,内存泄露问题。

    也可以配置启动时的JVM参数,让发送内存溢出时,自动生成堆栈快照文件。

    //出现 OOM 时生成堆 dump: 
    -XX:+HeapDumpOnOutOfMemoryError
    //生成堆文件地址:
    -XX:HeapDumpPath=/home/liuke/jvmlogs/
    

    查看内存使用情况

     

    jmap -histo打印出当前堆中的对象统计信息,包括类名,每个类的实例数量,总占用内存大小。

    instances列:表示当前类有多少个实例。
    bytes列:说明当前类的实例总共占用了多少个字节
    class name列:表示的就是当前类的名称,class name 对于基本数据类型,使用的是缩写。解读:B代表byte ,C代表char ,D代表double, F代表float,I代表int,J代表long,Z代表boolean 
    前边有[代表数组,[I 就相当于int[] 
    对象数组用`[L+类名`表示 

     

    使用jmap -dump:format=b,file=/存放路径/heapdump.hprof 进程id就可以得到堆转储文件,然后执行jvisualvm命令就可以打开JDK自带的jvisualvm软件。

    例如在这个例子中会造成OOM问题,通过生成heapdump.hprof文件,可以使用jvisualvm查看造成OOM问题的具体代码位置。

    public class Test018 {
    
        ArrayList<TestObject> arrayList = new ArrayList<TestObject>();
    
        public static void main(String[] args) {
            Test018 test018 =new Test018();
            Random random = new Random();
            for (int i = 0; i < 10000000; i++) {
                TestObject testObject = new TestObject();
                test018.arrayList.add(testObject);
            }
        }
        private static class TestObject {
            public byte[] placeholder = new byte[64 * 1024];//每个变量是64k
        }
    }
    
    -Xms20m -Xmx20m -verbose:gc -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/存放路径/heapdump.hprof
    

    造成OOM问题的代码位置:

     

    然后在主页点击Histogram,进入Histogram页面可以看到对象列表,with incomming references 也就是可以查看所有对这个对象的引用(思路一般优先看占用内存最大对象;其次看数量最多的对象。)。我们这个例子中主要是byte[]数组分配了占用了大量的内存空间,而byte[]主要来自于Test018类的静态变量arrayList的每个TestObject类型的元素的placeholder属性。

     

    同时可以点击 内存快照对比 功能对两个dump文件进行对比,判断两个dump文件生成间隔期间,各个对象的数量变化,以此来判断内存泄露问题。 

     

    展开全文
  • 空间统计(三)聚类分布制图

    万次阅读 多人点赞 2015-03-17 15:59:43
    这组工具中包含众所周知的...工具集中的其他工具也有类似的作用,都是通过执行聚类分析来识别具有统计显著性的热点、冷点和空间异常值的位置。依照惯例,我们还是 one by one 来看。Similarity Search相似搜索工具,
  • 文章目录空间数据管理数据管理的发展历程空间数据管理模式的变迁文件-关系型全关系型ArcSDE对象关系型模式面向对象的数据库 空间数据管理 【空间数据管理定义(狭义)】基于传统的数据库技术、面向空间数据的特点...
  • 白话空间统计之五:空间关系的概念化(上)

    万次阅读 多人点赞 2015-08-06 16:40:16
    空间统计分析与传统的统计分析,最大的区别就在于空间统计学把空间信息和空间关系都直接整合到了算法之中。如果取消掉空间相关的特性,空间统计学与传统统计学就没有多大的区别了。   因此在做空间统计时,都要求在...
  • 四、计算机网络之子网划分和CIDR

    千次阅读 2017-09-12 21:16:48
    五、子网划分和CIDR 子网 1. 子网划分可以利用IP地址系统把物理网络分解为更小的逻辑实体——子网。 2. 子网的概念最早源自于地址分类系统,而且在ABC类地址中能够得到很好的展现。然而硬件厂商和...
  • ——本文文字内容节选自帕拉格·康纳《超级版图 ——全球供应链、超级城市与新商业文明的崛起》一书 配图来自互联网。 最后文化圈部分,是空间统计:空间权重矩阵的部分。  在地球近地轨道(距...
  • 商业软件 开源软件 ​ 按结构划分 ​ 单机软件,分布式软件 软件缺陷的由来 Bug (虫子) Defect 计算机软件第一夫人:Grace Hopper 发明了Cobo计算机语言,也是找出电脑程序中第一个bug的女程序员 软件缺陷的定义 ...
  • [ext4]空间管理 - 查找块

    千次阅读 2014-04-01 22:35:53
     在文件系统中,当需要执行写操作时,肯定是需要查找需要写入的块。那么如何查找块哪?...知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议 进行许可。
  • geohash之2d 地理空间索引

    千次阅读 2018-06-07 18:37:27
    2d 地理空间索引 概述 2D地理空间索引可以将文档与二维空间中的位置(例如地图上的点)相关联。...地理空间索引支持对坐标字段和 其他字段(例如商业或景点类型)的查询。例如,您可能会写一个查...
  • 什么是商业智能?商业智能工具都有哪些? 商业智能也称作BI,是英文单词Business Intelligence的缩写。商业智能通常被理解为将企业中现有的数据转化为知识,帮助企业做出明智的业务经营决策的工具。这里所谈的数据...
  • 根据场景开放程度、行驶速度(以 20km/h 为 界限划分)和装载对象,自动驾驶的应用可以划分为开放与封闭、高速与低速、载人与载物等多个维度。 高速开放场景的无人驾驶技术难度最高且想象空间最大,也集中了自动驾驶...
  • 智能商业20讲--曾明.听后感悟

    万次阅读 2018-11-29 10:35:14
    **所以我讲双轮驱动,讲网络协同和数据智能是新商业文明DNA,是想强调: 如果不在这两个方面有质的突破,在新商业的竞争中,你是没有生存空间的。 小结 这一讲的核心是想强调网络协同和数据智能是未来商业竞争所...
  • 网络空间地图测绘的战略意义(上)随着信息化时代的发展,互联网也在迅速发展,全球各国已经将网络安全提升到了新的高度。为响应这一趋势,各个国家都针对网络安全颁布专门的法令和政策,网络安全已经成为全球范围内...
  • 热烈祝贺王家林大咖大数据经典传奇著作《SPARK大数据商业实战三部曲》畅销书籍 清华大学出版社发行上市! 本书基于Spark 2.2.0新版本,以Spark商业案例实战和Spark在生产环境下几乎所有类型的性能调优为核心,以...
  • 网络空间安全——总结

    千次阅读 2020-03-12 17:41:36
    系统而全面的了解网络空间安全方面的基础知识、认识安全隐患、掌握相应的防范方法、提高大家的安全意识。 课程重点: 勾勒网络空间安全的框架。 课程内容安排: 安全法律法规 物理设备安全 网络攻防技术 恶意...
  • 商业智能—概念与主要理论

    千次阅读 2017-07-07 14:21:31
    商业智能(Business Intelligence,简称:BI),又称商业智慧或商务智能,指用现代数据仓库技术、线上分析处理技术、数据挖掘和数据展现技术进行数据分析以实现商业价值。 商业智能的概念在1996年最早由加特纳集团...
  • 商业世界的五大基础逻辑

    千次阅读 2019-04-28 17:19:25
    概述 五大基础逻辑,流量之本,倍率之刀,价量之称,风险之眼,规则之缝! 五大基础逻辑 1、流量之本 ...融资、快速扩张、补贴大战、兼并收购……我们...也有人会说,商业竞争是"渠道之争",只有占据了更多的渠道...
  • 2020商业伦理与东西方决策

    万次阅读 2020-07-05 12:39:45
    网络选修课程知到app商业伦理与东西方决策智慧单元章节答案 提 示:选项顺序是系统随机打乱的,请大家看清楚具体选项内容再作答 第一章 1 【单选题】 (10分) 下面哪个不属于五伦之一。(A) A、师生 B、夫妇 ...
  • O2O商业模式剖析

    千次阅读 2016-03-30 16:21:56
    二、从商业模式看:O2O做事的方式有什么不同 我们按雷克汉姆和德文森蒂斯在《销售的革命》中对基本销售类型的划分,将O2O划分为交易型销售(对应波特的成本领先竞争战略)与顾问型销售(对应波特的差异化竞争战略),...
  • 利用数据挖掘技术获得商业智能

    千次阅读 2007-04-27 16:33:00
     对于空间数据,根据地理位置以及障碍物的存在情况可以自动进行区域划分。例如,根据分布在不同地理位置的ATM机的情况将居民进行区域划分,根据这一信息,可以有效地进行ATM机的设置规划,避免浪费,同时也避免失掉...
  • 商业俏佳人》游戏体验文档

    千次阅读 2020-03-07 15:08:46
    游戏核心玩法 1.1产业发展 1.2人才培养 1.2.2人才培养 1.3人才市场 2主线 2.1主要功能模块说明 2.2产出及作用 3投资 3.1主要功能模块说明 3.2产出及作用 5 ...整个《商业俏佳人》玩家通过推动...
  • 商业智能,又称商务智能,英文为Business Intelligence,简写为BI。商业智能通常被理解为将企业中现有的数据转化为知识,帮助企业做出明智的业务经营决策的工具。这里所谈的数据包括来自企业业务系统的订单、库存、...
  • MIPS CPU地址空间简介

    千次阅读 2013-03-03 13:12:20
    uMIPS CPU地址空间简介(整理自《See MIPS Run》和CPU文档):  注:首先需要明确的是CPU物理地址空间不仅仅包括RAM物理内存的空间,还包括CPU内部的一些总线、寄存器的编址。 一个MIPS CPU可以运行在两种优先级别...
  • BSP(二叉空间分割)树

    万次阅读 多人点赞 2012-08-09 09:45:17
    BSP(二叉空间分割)树是另一种类型的空间分割技术,其已经在游戏工业上应用了许多年(Doom是第一个使用BSP树的商业游戏)。尽管在今天BSP树已经没像过去那么受欢迎了,但现在仍在广泛地采用这项技术。 当你看...
  • 商业分析-FAST指标解读

    千次阅读 2019-10-15 10:06:06
    随着线上购物的普及,各线城市的电商渗透率均超过50%,虽然还有一定增长空间,但是单纯依靠提升渗透率并非电商平台的长期发展驱动力。电商平台已经超越过去单纯销货渠道的认知,成为品牌与消费者联系、品牌建设的最...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 37,399
精华内容 14,959
关键字:

商业空间的划分方式