精华内容
下载资源
问答
  • 资源名称:双路服务器和双核服务器对比解析   内容简介:  对于很多用户来说,可能对服务器一些基础知识都不是非常了解,比如双路服务器和双核服务器是一样吗?至强处理器和奔腾处理何区别?1U、2U...
  • 双路服务器安装双CPU或加装第二CPU的需注意什么
  • 里面很多服务器评测的结果,几乎可以看到每款服务器CPU及消费级别的得分,最重要的是可以看到多CPU得分,最最重要的是我对数据进行了归类,按CPU的系类分好类别了。
  • 服务器处理器单路、双路和多路(如4、8、16、64等);现在经常听到“双核心”处理器,什么是“双核心”处理器?目前哪些厂家生产“双核心”处理器呢?今天我们就带着读者的这些疑问来为为大家详细进行解答。
  • 宝德PR4710双路服务器

    2020-03-04 08:45:15
    宝德7系列32/64位全兼容服务器PR4710完美融合Intel最新Xeon处理器、芯片组技术及Ultra 320 SCSI硬盘热插拔技术,是一款经济适用、物超所值的主流工作组/部门级高可靠双路服务器, 专为成长型MB企业精心打造。
  • 宝德PR4520双路服务器

    2020-03-04 08:45:14
    宝德5系列32/64位全兼容服务器PR4520完美融合Intel最新Xeon处理器、芯片组技术及Ultra 320 SCSI硬盘热插拔技术,是一款经济适用、物超所值的主流工作组/部门级高可靠双路服务器, 专为成长型企业精心打造。
  • 众所周知:凭借Intel四核处理器的...而且完全可以与2U双核双路服务器在产品性能和可扩展性上已经不相伯仲了。那么到底1U机架式双路四核产品的性能怎样呢?今天我们将为您带来一款强氧1U双路四核1420T服务器产品的评测。
  • DIY双路服务器之个人主机

    千次阅读 2018-11-14 11:09:08
       本帖记录博主始于2018-09-22双路x58装机经历!不喜勿喷,令本文仅代表个人观点,以及个人对产品的看法,忘广大网友海涵,指正,切记,不喜勿喷,门在后面。喷子请绕道!谢谢合作。    身为硬件爱好者...

    一、引言

       本帖记录博主始于2018-09-22双路x58装机经历!不喜勿喷,令本文仅代表个人观点,以及个人对产品的看法,忘广大网友海涵,指正,切记,不喜勿喷,门在后面。喷子请绕道!谢谢合作。

       身为硬件爱好者,最怕的是什么?-------!你猜对了,那就是没钱!博主起始很早就比较喜欢研究硬件,但是每次都是“始于追求,终于金钱!”,每次都是因为买不起,,而止住了脚步,记得那一年的不是阴云密布某一天,我被一个满脸胡子和褶皱的胖小伙,拉进了一个神秘而有充满智慧的国度!

             他说:“你听过图拉丁吧么?”
             我:“没有”
             他:“那亏你还硬件爱好者呢…”


    于是我带着他鄙视的眼光走进了这个国度…
    我发现我爱上了这里!------>图拉丁吧!

    二、硬件购置

    种种原因,不废话了,万能我某宝,上配置!

    cpu	  	 Intel Xeon X5687  *  2= 165 × 2 = 330元
    内存		 ecc 1333 4G       *  6= 48  × 6 = 288元
    主板		 Dell C2100        *  1= 319 × 1 = 319元
    SSD      Kingston240G	   *  1= 240 × 1 = 240元
    SATA     WD_500G           *  1=  0  × 1 =  0----->存货~
    电源		 Tt Smart SE 730W  *  1= 190 × 1 = 190元
    显卡		 EVGA GTX 670 4G   *  1= 390 × 1 = 390元
    声卡		 威讯usb声卡		   *  1= 20  × 1 = 20元
    机箱		 航嘉			   *  1= 140 × 1 = 140元
    显示器    HYC 			   *  1= 320 × 1 = 320--------------------------------------------------
    大钳子           		   *  1= 15  × 1 = 15元
    组合螺丝刀 				   *  1= 10  × 1 = 10元
    剪子						   *  1= 6   × 1 = 6元
    胶布						   *  10= --  × 10= 10元
    加长VGA线 			       *  1= 16  × 1 = 16--------------------------------------------------
    水冷套装  杂货铺拼的(3个店)	   *  1= 272 × 1 = 272(水冷清单: 2个cpu冷头,1个北桥冷头,水泵,卡扣,水管,水箱,冷排,风扇,水。)
    总计:										 2566元
    ————————————————————————————————————————————————————————————————————————
    注:(显示器是58同城上捡的垃圾,下面这三样加起来320元,结果显卡是坏的,NMB!!!)
    	HYC 24+ Toshiba 500G + 七彩虹 灵动鲨 GTX660 1G = 320

       关于硬件购置解释说明,其中中间虚线工具类,是现买的[捂脸],以前的工具某种原因不在了,一并就打在里面了。最后硬盘剩下个 SSD 240G + 500 + 500G,显卡是后加的,就没上水冷。键鼠存货自备。

    三、装机

    ╮(╯▽╰)╭
    哎。。。!一眼难进啊,装机的过程泰国波折。。。。

    • 第一次开始组装
      22号买的东西,终于在28号全部到齐了。开始装机。
      由于博主白天还要上班,于是只能晚上回来鼓捣一会。。。
      经过了三个小时的奋战,终于全部安装完毕!点火!发射!
      Boom@@! ! @ !@ !@!!# %%&*((!@# %^&*(……
      我就这么上了墙,主机箱闪了一下就灭了。。。
      联系卖家,然后拍图,调整。
      结果发现,(@ο@) 哇~
      在这里插入图片描述
      在这里插入图片描述
      cpu0 的辅助供电我插反了,还娘的插进去了,这种错误没想到有一天也会发生在我身上,,,对,没错,插进去了,还供电了,,对,没错,还供电了。。。

      万幸的是没冒烟。。但是后续连闪都不闪了,BIOS放电啊,全部拆了重新装啊,都不行,
      只能盼着是主板短路,小修一下就好了,千万不要烧U,烧板啊。~~

      然后就忐忑的抱着它去了一家维修电脑的店。
      好么,大哥,啥都不明白,没见过服务器板子。一顿捅咕啊,我这个心疼,完了还找不到毛病。、。、

      我也不试第二家了,直接联系卖家(超级良心的卖家~!),看看能不能修修,还是咋地了。然后已经十一了。。。

      十一回家,回来已经7号了。。。
      《常回家看看》,回家看看~…

      顺丰中…

    • 中间小记事
      回来的第一件事就是立马把板子,U,电源,发给卖家…
      顺丰中…
      接到货的卖家,他说他出差了(⊙﹏⊙)b
      然后就是焦急的等待卖家。。
      (卖家出差,他的伙计说我的板子boom了,其实是搞错了,不是我的,然后等他回来亲自弄。)
      各种等啊,抓心挠肝的等啊,,,
      终于,一个电话想起来,打破了这个宁静的夜空。。。
      “喂?你这都没事啊。我直接就点亮了。”
      what??black man what??怎么见了老东家立马就没事了呢。。
      瞬间我就怀疑是不是我的机箱不太合适,接触到主板,短路引起的自检不过!
      ps:因为太心急,水冷也比较麻烦,没有裸机测试。。。亲们,下次一定记得裸机测试。

         然后跟卖家确定好了,没事,再发回来,,,我的个乖乖,你这没事来回旅游啊,这旅游费我可掏不起啊。。。大家都知道服务器的分量,,,耐心等待着卖家返货,一天。。。两天。。。三天。。。四天。。。都娘的一周了,还没到,按耐不住,要单号,卖家说,他那天发了600多单货,没法找单号,,中间催过几次,不了了之。这实在不行了,夺命连环催,卖家也按耐不住了,(开始我以为他没发呢,曾一度以为线下交易,他吞了我的货,最后,他真的十个良心好卖家!(__) 嘻嘻……)他一去快递点看,货被压下了,由于我这开xxxxJB会,不让3KG以上快递进。气死我了,,7天白等了。。。然后卖家也比较急,转身投向了顺丰的怀抱。。。嘿嘿。我的宝贝,你终于回来了,耐心的等待中。。。。
         what?又来一个插曲,这是闹撒子了妹。顺丰应该隔天到啊,等到第三天,还没我的消息,,,再次骚扰卖家,他说你都签收了啊。what??black man what??,截图一过来,好么。我的乖乖,地址写错了。而且还昨天就签收了。还被拆箱了。。。。我这个心痛啊!!希望这位哥哥不要对它做了点什么,破了我的《双路处女点》!
         这我可按耐不住了,起身,亲自去取,哇,虽然同城!一查地址,一出就要两个半小时,,,,公交车要上高速,,,一咬牙,一跺脚,去!!不到5点出发,晚上10点才回来,,,天上还飘起了凄凉的小水珠。。。。(本来到付的,,,结果卖家主动付了邮费给那个人~还挺良心。)

    • 第二次装机(终于回来了!)
      由于一些配件已经装好!

      轻车熟路~

      裸机测试 pass!

      看来确实是主板沾到机箱了,导致短路自检不过。(亲们,上水冷千万要买好机箱,足够大的,不要将就!!)

      拿着胶布,咔嚓咔嚓,一顿粘啊,把机箱但凡能接触到主板的地方都用胶布隔开!

      然后入洞房,自检!pass!

      嗯?为毛显示器不亮呢?难道屏蔽了集显??(博主现在还没有独显)

      然后默默无闻的抠下了coms电池,将主板恢复了出厂设置。。。

      然后还不亮,偶尔自检还不过!!!这到底是怎么了,跟我有仇么?!

      开始以为加的两块硬盘自检才不过的,后来只上新的固态也不过!

      好了,安心开启debug模式。。。

      内存全部摘下,只插两根。

      嗯?亮了,亮了,都好使了,

      嗯!内存的毛病,先做系统再说吧,给新硬盘坐上了系统,然后把内存全部插上,,,一按键盘就死机,一按键盘就死机!!!哇,心好累,然后内存拔下来,嗯,,,是内存的事,看来内存的插法说道真多啊,,,走吧,去找点官方的资料,找到了dell c2100的硬件说明书,,,研读了下,原来真的是内存的插法问题!!

    在这里插入图片描述
    在这里插入图片描述
    仔细研读了这两张图,突然悟出了道理,针对Dell c2100来说一个蓝色,带两个黑色,就代表一个通道。如果,想组件多通道内存,那么就按照主板说明书上的通道标号开始插,

    BIOS模式 Independent(独立)
    (1) A0一根,D0一根,这样为单通道,
    (2) A0,B0各一根,D0,E0各一根,这样为双通道,
    (3) A0,B0,C0各一根,D0,E0,F0各一根,这样为三通道,
    必须从0位插起
    
    BIOS模式 LockStep(锁步)将多个通道当作是一个通道来控制
    (1)从最靠近CPU的槽子开始插,即可。
    

    注! 大家以后遇到各种设备的问题啊,第一时间去它的官网看看,有没有相应说明书,没有或者看不懂,再百度,这样效率最高了!有人比较准确!

    总结:服务器板子,挑剔内存,BIOS设置应和插法对应,不然可能会不识别,或者自检不过。
    中间还有好多没写啊,感觉一回顾,好像又装了一遍,,,╮(╯▽╰)╭,心好累,就不一一描述了。。。
    记下来给自己回忆吧!

    比如:
    1.三个硬盘,都有系统,引导顺序错误,导致系统崩溃
    2.水冷螺丝过粗,cpu卡扣带背板拿不掉。。。跑了n个五金店、、、
    3.机箱过小,冷排压到主板,插不了内存。。。铁丝拧冷排,楼下买铁丝的故事。。。
    4.水泵刚买回来就揪掉了一个爪~~~
    

    这次装机学到了不少知识!以前忽略的小细节

    硬件搭配啊,功耗计算啊,机箱走风啊,冷却啊。精准跳线啊,供电啊。。。等等,,

    以前的装机太过简单。。。以至于自己总觉得,所有的装机都这么简单。。。

    • 第三次装机
      心心念念的EVGA GTX670 终于到了!大概长这样博主勿怪,盗你个链接,你实在拍的太好了。(侵删!)

      虽然是二手的,但是这做工,和样子,还是让我喜欢上了EVGA,如果以后买新的,大家可以纳入考虑品牌!

      曾经的一代卡皇。!装机。上!

      挖槽。。。插不上。。用力,,还是插不上,。,。娘的,卡太长,双路的内存通道,挤住了尾巴。

      哎,这机装的,真波折,,,我是拆卡尾巴呢,还是内存通道拔牙呢!!

      几经纠结,加上结构分析,采取了,内存拔牙。。。拿起钳子就对卡扣下手,咔嚓就下来了,去掉卡扣的高度就能插上了

      好容易插上了,开机!what? black man what?自检都过不去了,,,

      哎,橡皮蹭一蹭金手指,吹风机吹一吹,卡槽,插上,自检不亮。。。。哇,想哭!

      活动活动电源,哎?闪了下,我开始怀疑显卡有问题,,可是卖家说没问题~!

      BiOS把PCI的设置改了,这三项

      PCI-E SLOT Option ROM
      PCI-E Connector Option ROM
      OnBoard VGA device
      

      原来都是开启的,我把他都关闭了!
      好,重新开机!

      自检!pass!(嗯,看来是设置背锅)

      进入系统,插上HDMI模式!

      挖槽。心凉了,,,花屏。。。。。

      这可是我的第一个可以说上了点档次的独显啊。emmmm…

      新有不甘,再次CALL 凸(艹皿艹 )卖家,,,

      卖家说HDMI不稳定,会引起花屏。。。让我插DVI-I买了个转接头,再战!!!

      WA~~我滴个乖乖,,你终于亮了。。全部通过,至此,装机结束!

      终于我于2018-11-01用我的劳动成果玩上了第一局《英雄联盟》 开熏,傻花❀❀❀❀❀~~~~

    2018-09-22—2018-11-01 Done!


    !!!版权声明!!!

    本系列为博主学心得与体会,所有内容均为原创(✿◡‿◡)

    欢迎传播、复制、修改。引用、转载等☞请注明转载来源。感谢您的配合

    用于商业目的,请与博主采取联系,并请与原书版权所有者联系,谢谢!\(≧▽≦)/

    我的联系方式:email–> 1209551258@qq.com

    !!!版权声明!!!


    生活嘛~ 最重要的就是开心喽~ O(∩_∩)O~~

    这里写图片描述


    展开全文
  • 霆智服务器安装Windows Server 2008 64位操作系统-双路RAID
  • 内含华为鲲鹏920-4826/Intel-Platinum-9242/Intel-E5-2680V2双路计算服务器的LinpackHPL benchmark对比评测图,含gcc/icc结果。需要积分下载些东西,感谢理解支持!
  • 双路服务器的CPU规格是否必须一致.pdf
  • 服务器的认识

    千次阅读 多人点赞 2019-07-31 17:51:43
    服务器要运行什么应用? 我们要根据服务器的用途,来决定服务器的性能、容量和可靠性需求。 这里我们按照最典型的基础架构:Web服务器、数据服务器、应用程序服务器来展开讨论。 1.Web服务器 Web服务器对硬件要求...

    服务器要运行什么应用?

    我们要根据服务器的用途,来决定服务器的性能、容量和可靠性需求。

    这里我们按照最典型的基础架构:Web服务器、数据服务器、应用程序服务器来展开讨论。

    1.Web服务器

    Web服务器对硬件要求不高,甚至一般的硬件配置(2颗4核、8G内存、1T硬盘)即可满足需求,如果后期Web服务访问量上升,只需要新增同等配置的服务器加入负载均衡集群即可实现Web服务的性能扩展。

    2.数据服务器

    数据服务器对硬件要求最高,主要特征是CPU要足够快、内存足够大,磁盘IO足够快和稳定。比如:MySQL、Oracle服务器要求CPU配置一定要好,最好是双路志强金牌Gold,磁盘最好使用SSD系列。

    而Redis服务器主要是内存型应用,所以要求内存一定要足够大,并且可扩展,而对磁盘和CPU要求就没那么高。

    3.应用程序服务器

    应用服务器的典型特征是承担了计算和功能实现。对CPU的配置,至少是双路志强银牌Silver系列。对于可靠性问题,如果你只有一台服务器的话,那么这台服务器必须足够可靠,磁盘做成RAID1阵列是必不可少的。

    4.其他公共服务器

    还有一些公用的服务器,例如:邮件服务器、DNS服务器、域控服务器。对稳定性要求较高,因此一般会推荐有至少两台进行主、备部署。对硬件来说,没有特殊的需求,所以一般的硬件即可。

    业务系统要支持多少用户?

    硬件服务器是为了提供某种服务,而使用这些服务的用户有多少,也是我们需要考虑的因素,有几个具体的问题需要我们做出评估:

    • 预估有多少用户会同时在线?
    • 预估每天同时在线访问最高峰值是多少?
    • 预估数据量会有多大?
    • 预估网络宽带会占用多少?

    要用多大空间来存储数据?

    我们需要从两个角度来考虑这个问题。一个角度是有哪些类别的数据,另一个角度是数据的增长速度,例如:每天大概会新增多少数据,根据这个增速,就可以规划出未来1-3年内数据量大小。

    最后我们才能得到一个更具体的数字,还需要为计算出来的数字结果乘1.5左右的系数。

    业务重要性有多高?

    服务器可以为不同业务系统提供各种应用服务,这个重要性直接影响到我们对服务器的选型配置。

    1.门户网站

    一台服务器,铜牌Bronze 单路cpu、4G内存、500GB足够了,并且也不需要备机,就算服务器出现了一点硬件故障,导致几个小时甚至一两天不能提供访问,工作也会照常继续,天也不会塌下来。对公司也影响不大。

    2.测试平台

    如果仅仅做功能测试,那么对硬件配置基本没要求,虚拟机也可以满足要求,而如果是做性能测试,那么就根据性能测试的方向,选择某方面比较强劲的硬件即可。

    3.电商平台

    CPU要足够好,内存也要足够大,磁盘一定要做RAID10。同时,还要部署主、备架构,数据要做实时备份、异地远程备份,因为重要的业务系统,一旦发生故障,直接导致的损失就是金钱。

    怎么选择CPU?

    CPU的主频越高,其性能也更高;两个CPU要比一个CPU来得更爽;说到品牌,也就是Intel和AMD,Intel服务器市场份额更高一些。常见情况:

    1.公司业务刚起步

    量不大的情况下,此时预算可能也不是很充足,那么建议选择一个英特尔至强铜牌单路CPU即可,但是记得要留扩展接口。

    2.跑多个服务

    比如apache+php+tomcat+mysql架构,都运行在一台机器上,那么,推荐英特尔至强银牌双路CPU,这将是一个不错的选择。

    3.运行MySQL/Oracle

    那么至少应该选择一个英特尔至强金牌双路10核CPU,并且预留CPU扩展接口,当负载越来越大的时候,可以选择增加CPU到四路。

    需要多大的内存?

    相比于CPU,内存(RAM)其实是影响性能的最关键因素,很多业务系统CPU利用率一般都在10%~50%之间,甚至更低。

    1.Web前端服务器

    例如apache、nginx。不需要太大的内存,因为这些Web服务器主要是处理静态请求,一天几十万的访问量,4GB内存已经足够了。

    2.java重型应用服务器

    比如Tomcat、Resin、WebLogic、Websphere、jboss等此类。配置的内存在16GB-32GB之间即可,大于32GB的内存配置基本是浪费了。

    3.内存型业务系统

    例如:redis、Squid、Varnish、Memcached等,我们需要为服务器配置尽可能高的内存容量,因为这类应用主要消耗的就是内存。

    需要怎样的硬盘存储?

    硬盘存储系统的选择和配置是整个服务器系统里最为复杂的一部分,我们需要考虑硬盘的数量、容量、接口类型、转速、缓存大小,以及是否需要Raid卡,Raid卡的型号和Raid级别等问题。

    1.磁盘类型

    目前有SATA、SAS和SSD三种类型,SATA、SAS属于机械硬盘,转速低,读写速度慢,但是价格便宜,磁盘容量大。SSD硬盘属于固态硬盘,优点是读写速度快,缺点是价格昂贵。

    2.RAID

    主要分为软RAID、硬RAID二种。软RAID所有功能均有操作系统和CPU来完成,没有独立的RAID控制器处理芯片和I/O处理芯片,效率最低。硬RAID配备了专门的RAID控制器处理芯片和I/O处理芯片以及阵列缓冲,不占用CPU资源。

    网卡如何选择?

    网卡和服务器的网络带宽互相影响,这里我们从网卡的速率和网卡的冗余两个方面来进行分析。

    1.网卡的速率

    到底是选用千兆网卡呢,还是选择万兆网卡呢,这主要取决于我们对带宽流量的评估。大多数情况下,千兆网卡足够用来对外网提供服务,而内部数据交换如果非常频繁,例如hadoop业务,建议使用万兆网卡。

    2.网卡的稳定性

    对网络稳定性要求高,推荐双网卡做冗余,两个网卡连接到不同的交换机上,这样,任意一个网卡故障都不影响业务的正常运行。

    展开全文
  • 华硕率先发布支持45nm处理器的双路服务器产品.pdf
  • 行业分类-电器装置-一种双路输入供电的切换电路、装置及服务器电源.zip
  • 服务器指一个管理资源并为用户提供服务的计算机,通常分为文件服务器、数据库服务器和应用程序服务器。运行以上软件的计算机或计算机系统也被称为服务器。相对于普通PC来说,服务器在稳定性、安全性、性能等方面都...

    服务器的基础

            服务器指一个管理资源并为用户提供服务的计算机,通常分为文件服务器、数据库服务器和应用程序服务器。运行以上软件的计算机或计算机系统也被称为服务器。相对于普通PC来说,服务器在稳定性、安全性、性能等方面都要求更高,因此CPU、芯片组、内存、磁盘系统、网络等硬件和普通PC有所不同。
            服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。
            服务器的构成包括处理器、硬盘、内存、系统总线等,和通用的计算机架构类似,但是由于需要提供高可靠的服务,因此在处理能力、稳定性、可靠性、安全性、可扩展性、可管理性等方面要求较高。在网络环境下,根据服务器提供的服务类型不同,分为文件服务器,数据库服务器,应用程序服务器,WEB服务器等。

    主要特点

    1、可扩展性(Scalability)

            服务器必须具有一定的“可扩展性”,这是因为企业网络不可能长久不变,特别是在当今信息时代。如果服务器没有一定的可扩展性,当用户一增多就不能胜任的话,一台价值几万,甚至几十万的服务器在短时间内就要遭到淘汰,这是任何企业都无法承受的。为了保持可扩展性,通常需要在服务器上具备一定的可扩展空间和冗余件(如磁盘阵列架位、PCI和内存条插槽位等)。
            可扩展性具体体现在硬盘是否可扩充,CPU是否可升级或扩展,系统是否支持WindowsNT、Linux或UNIX等多种可选主流操作系统等方面,只有这样才能保持前期投资为后期充分利用。

    2、易用性(Usability)

    2、易使用性
            服务器的功能相对于PC机来说复杂许多,不仅指其硬件配置,更多的是指其软件系统配置。服务器要实现如此多的功能,没有全面的软件支持是无法想象的。但是软件系统一多,又可能造成服务器的使用性能下降,管理人员无法有效操纵。所以许多服务器厂商在进行服务器的设计时,除了在服务器的可用性、稳定性等方面要充分考虑外,还必须在服务器的易使用性方面下足功夫。
            服务器的易使用性主要体现在服务器是不是容易操作,用户导航系统是不是完善,机箱设计是不是人性化,有没有关键恢复功能,是否有操作系统备份,以及有没有足够的培训支持等方面。

    3、可管理性(Managbility)

    3、可用性
            对于一台服务器而言,一个非常重要的方面就是它的“可用性”,即所选服务器能满足长期稳定工作的要求,不能经常出问题。其实就等同于Sun所提出的可靠性(Reliability)。
            因为服务器所面对的是整个网络的用户,而不是单个用户,在大中型企业中,通常要求服务器是永不中断的。在一些特殊应用领域,即使没有用户使用,有些服务器也得不间断地工作,因为它必须持续地为用户提供连接服务,而不管是在上班,还是下班,也不管是工作日,还是休息、节假日。这就是要求服务器必须具备极高的稳定性的根本原因。
            一般来说专门的服务器都要7X24小时不间断地工作,特别像一些大型的网络服务器,如大公司所用服务器、网站服务器,以及提供公众服务iqdeWEB服务器等更是如此。对于这些服务器来说,也许真正工作开机的次数只有一次,那就是它刚买回全面安装配置好后投入正式使用的那一次,此后,它不间断地工作,一直到彻底报废。如果动不动就出毛病,则网络不可能保持长久正常运作。为了确保服务器具有高得“可用性”,除了要求各配件质量过关外。另外,还可采取必要的技术和配置措施,如硬件冗余、在线诊断等。

    4、可管理性(Availability)

    4、易管理性
            在服务器的主要特性中,还有一个重要特性,那就是服务器的“易管理性”。虽然我们说服务器需要不间断地持续工作,但再好的产品都有可能出现故障,拿人们常说的一句话来说就是:不是不知道它可能坏,而是不知道它何时坏。服务器虽然在稳定性方面有足够保障,但也应有必要的避免出错的措施,以及时发现问题,而且出了故障也能及时得到维护。这不仅可减少服务器出错的机会,同时还可大大提高服务器维护的效率。其实也就是Sun提出的可服务性(Serviceability)。
            像平时所用的计算机一样停下来进行维修,对于一个大型的服务器来说是不可能的事,这样就很可能造成整个网络的瘫痪,所带来的损失是无法用金钱来衡量的。服务器生产厂商为了解决这一难题提供了许多新的技术,如冗余技术、系统备份、在线诊断技术、故障报警技术、内存纠错技术、热拔插技术、和远程诊断技术等,使绝大多数故障能够在不停机的情况下得到及时修复。
            服务器的易管理性还体现在服务器有没有智能管理系统,有没有自动报警功能,是不是有独立于系统的管理系统,有没有液晶监视器等方面。只有这样,管理员才能轻松管理,高效工作。

    服务器的分类

            按应用层次划分通常也称为“按服务器档次划分”或 “按网络规模”分,是服务器最为普遍的一种划分方法,它主要根据服务器在网络中应用的层次(或服务器的档次来)来划分的。要注意的是这里所指的服务器档次并不是按服务器CPU主频高低来划分,而是依据整个服务器的综合性能,特别是所采用的一些服务器专用技术来衡量的。按这种划分方法,服务器可分为:入门级服务器、工作组级服务器、部门级服务器、企业级服务器、视频服务器。

    1、入门级服务器

            这类服务器是最基础的一类服务器,也是最低档的服务器。随着PC技术的日益提高,现在许多入门级服务器与PC机的配置差不多,所以目前也有部分人认为入门级服务器与“PC服务器”等同。这类服务器所包含的服务器特性并不是很多,通常只具备以下几方面特性:
            1有一些基本硬件的冗余,如硬盘、电源、风扇等,但不是必须的;
            2通常采用SCSI接口硬盘,现在也有采用SATA串行接口的;
            3部分部件支持热插拔,如硬盘和内存等,这些也不是必须的;
            4通常只有一个CPU,但不是绝对;
            5内存容量最大支持16GB。
    这类服务器主要采用Windows或者NetWare网络操作系统,可以充分满足办公室型的中小型网络用户的文件共享、数据处理、Internet接入及简单数据库应用的需求。这种服务器与一般的PC机很相似,有很多小型公司干脆就用一台高性能的品牌PC机作为服务器,所以这种服务器无论在性能上,还是价格上都与一台高性能PC品牌机相差无几。
            入门级服务器所连的终端比较有限(通常为20台左右),况且在稳定性、可扩展性以及容错冗余性能较差,仅适用于没有大型数据库数据交换、日常工作网络流量不大,无需长期不间断开机的小型企业。不过要说明的一点就是目前有的比较大型的服务器开发、生产厂商在后面我们要讲的企业级服务器中也划分出几个档次,其中最低档的一个企业级服务器档次就是称之为"入门级企业级服务器",这里所讲的入门级并不是与我们上面所讲的"入门级"具有相同的含义,不过这种划分的还是比较少。还有一点就是,这种服务器一般采用Intel的专用服务器CPU芯片,是基于Intel架构(俗称"IA结构")的,当然这并不是一种硬性的标准规定,而是由于服务器的应用层次需要和价位的限制。
            入门级服务器通常只使用一块CPU,并根据需要配置相应的内存(如256MB)和大容量IDE硬盘,必要时也会采用IDE RAID(一种磁盘阵列技术,主要目的是保证数据的可靠性和可恢复性)进行数据保护。入门级服务器主要是针对基于Windows NT,NetWare等网络操作系统的用户,可以满足办公室型的中小型网络用户的文件共享、打印服务、数据处理、Internet接入及简单数据库应用的需求,也可以在小范围内完成诸如E-mail、 Proxy 、DNS等服务。
            对于一个小部门的办公需要而言,服务器的主要作用是完成文件和打印服务,文件和打印服务是服务器的最基本应用之一,对硬件的要求较低,一般采用单颗或双颗CPU的入门级服务器即可。为了给打印机提供足够的打印缓冲区需要较大的内存,为了应付频繁和大量的文件存取要求有快速的硬盘子系统,而好的管理性能则可以提高服务器的使用效率
    图一
    如图,这是一台戴尔1U的机架式服务器,机箱宽度:434mm机箱深度:534.5mm,产品重量 12.2kg。扩展槽有两个2×PCI-E 3.0,内存类型 ECC DDR4

    2、工作级服务器

            工作组服务器是一个比入门级高一个层次的服务器,但仍属于低档服务器之类。从这个名字也可以看出,它只能连接一个工作组(50台左右)那么多用户,网络规模较小,服务器的稳定性也不像下面我们要讲的企业级服务器那样高的应用环境,当然在其它性能方面的要求也相应要低一些。工作组服务器具有以下几方面的主要特点:
            1、通常仅支持单或双CPU结构的应用服务器(但也不是绝对的,特别是SUN的工作组服务器就有能支持多达4个处理器的工作组服务器,当然这类型的服务器价格方面也就有些不同了)
            2、可支持大容量的ECC内存和增强服务器管理功能的SM总线
            3、功能较全面、可管理性强,且易于维护
            4、采用Intel服务器CPU和Windows/NetWare网络操作系统,但也有一部分是采用UNIX系列操作系统的
           5、可以满足中小型网络用户的数据处理、文件共享、Internet接入及简单数据库应用的需求。工作组服务器较入门级服务器来说性能有所提高,功能有所增强,有一定的可扩展性,但容错和冗余性能仍不完善、也不能满足大型数据库系统的应用,但价格也比前者贵许多,一般相当于2~3台高性能的PC品牌机总价。
           6、 工作组级服务器一般支持1至2个PⅢ处理器或单颗P4(奔腾4)处理器,可支持大容量的ECC(一种内存技术,多用于服务器内存)内存,功能全面。可管理性强、且易于维护,具备了小型服务器所必备的各种特性,如采用SCSI(一种总线接口技术)总线的I/O(输入/输出)系统,SMP对称多处理器结构、可选装RAID、热插拔硬盘、热插拔电源等,具有高可用性特性。适用于为中小企业提供Web、Mail等服务,也能够用于学校等教育部门的数字校园网、多媒体教室的建设等。


    如图,这是一台戴尔2U机架式的服务器,机箱深度:715.5mm,标配CPU数量1颗,最大CPU数量2颗,扩展槽多达8个3.0插槽,4个x16插槽。内存类型DDR4

    3、部门级服务器

           这类服务器是属于中档服务器之列,一般都是支持双CPU以上的对称处理器结构,具备比较完全的硬件配置,如磁盘阵列、存储托架等。部门级服务器的最大特点就是,除了具有工作组服务器全部服务器特点外,还集成了大量的监测及管理电路,具有全面的服务器管理能力,可监测如温度、电压、风扇、机箱等状态参数,结合标准服务器管理软件,使管理人员及时了解服务器的工作状况。同时,大多数部门级服务器具有优良的系统扩展性,能够满足用户在业务量迅速增大时能够及时在线升级系统,充分保护了用户的投资。它是企业网络中分散的各基层数据采集单位与最高层的数据中心保持顺利连通的必要环节,一般为中型企业的首选,也可用于金融、邮电等行业。
            部门级服务器一般采用IBM、SUN和HP各自开发的CPU芯片,这类芯片一般是RISC结构,所采用的操作系统一般是UNIX系列操作系统,现在的LINUX也在部门级服务器中得到了广泛应用。
           部门级服务器可连接100个左右的计算机用户、适用于对处理速度和系统可靠性高一些的中小型企业网络,其硬件配置相对较高,其可靠性比工作组级服务器要高一些,当然其价格也较高(通常为5台左右高性能PC机价格总和)。由于这类服务器需要安装比较多的部件,所以机箱通常较大,采用机柜式的。
           部门级服务器通常可以支持2至4个PⅢ Xeon(至强)处理器,具有较高的可靠性、可用性、可扩展性和可管理性。首先,集成了大量的监测及管理电路,具有全面的服务器管理能力,可监测如温度、电压、风扇、机箱等状态参数。此外,结合服务器管理软件,可以使管理人员及时了解服务器的工作状况。同时,大多数部门级服务器具有优良的系统扩展性,当用户在业务量迅速增大时能够及时在线升级系统,可保护用户的投资。目前,部门级服务器是企业网络中分散的各基层数据采集单位与最高层数据中心保持顺利连通的必要环节。适合中型企业(如金融、邮电等行业)作为数据中心、Web站点等应用。
    在这里插入图片描述
    如图,这是一款戴尔的2U塔式服务器,标配CPU数量2颗,主板芯片组Intel C610,扩展槽有 6个第3代PCIe插槽,内存插槽数量12条

    4、企业级服务器

    4、企业级服务器
            企业级服务器是属于高档服务器行列,正因如此,能生产这种服务器的企业也不是很多,但同样因没有行业标准硬件规定企业级服务器需达到什么水平,所以现在也看到了许多本不具备开发、生产企业级服务器水平的企业声称自己有了企业级服务器。企业级服务器最起码是采用4个以上CPU的对称处理器结构,有的高达几十个。
    企业级服务器属于高档服务器,普遍可支持4至8个PIII Xeon(至强)或P4 Xeon(至强)处理器,拥有独立的双PCI通道和内存扩展板设计,具有高内存带宽,大容量热插拔硬盘和热插拔电源,具有超强的数据处理能力。
           另外一般还具有独立的双PCI通道和内存扩展板设计,具有高内存带宽、大容量热插拔硬盘和热插拔电源、超强的数据处理能力和群集性能等。这种企业级服务器的机箱就更大了,一般为机柜式的,有的还由几个机柜来组成,像大型机一样。企业级服务器产品除了具有部门级服务器全部服务器特性外,最大的特点就是它还具有高度的容错能力、优良的扩展性能、故障预报警功能、在线诊断和RAM、PCI、CPU等具有热插拨性能。有的企业级服务器还引入了大型计算机的许多优良特性。这类服务器所采用的芯片也都是几大服务器开发、生产厂商自己开发的独有CPU芯片,所采用的操作系统一般也是UNIX(Solaris)或LINUX。企业级服务器适合运行在需要处理大量数据、高处理速度和对可靠性要求极高的金融、证券、交通、邮电、通信或大型企业。企业级服务器用于联网计算机在数百台以上、对处理速度和数据安全要求非常高的大型网络。企业级服务器的硬件配置最高,系统可靠性也最强。
            企业级服务器主要适用于需要处理大量数据、高处理速度和对可靠性要求极高的大型企业和重要行业(如金融、证券、交通、邮电、通信等行业),可用于提供ERP(企业资源配置)、电子商务、OA(办公自动化)等服务。如Dell的PowerEdge 4600服务器,标准配置为2.4GHz Intel Xeon处理器,最大支持12GB的内存。此外,采用了Server Works GC-HE芯片组,支持2至4路Xeon处理器。集成了RAID控制器并配备了128MB缓存,可以为用户提供0、1、5、10四个级别的RAID,最大可以支持10个热插拔硬盘并提供730GB的磁盘存储空间。

           由于是面向企业级应用,所在在可维护性以及冗余性能上有其独到的地方,例如配备了7个PCI-X插槽(其中6个支持热插拔),而且不需任何工具即可对冗余风扇、电源以及PCI-X进行安装和更换。
    在这里插入图片描述
    如图是联想的8U机架式服务器,标配CPU数量8颗,扩展槽 2×PCI-e 3.0 半长全高 x16插槽(x16信号),1×PCI-e 3.0 半长全高 x16插槽(x8信号),1×ML2 专用网络夹层卡插槽(x8信号),产品尺寸 482×351×804mm(含理线架深度836mm,含全长扩展I/O模组深度921mm)产品重量 35.9-54.7kg

    服务器的操作系统

    服务器操作系统主要分为四大流派:WINDOWS、NETWARE、UNIX、LINUX。

    WINDOWS
            重要版本WINNT 4.0 Server、Win2000/Advanced Server、Win2003/Advanced Server,WINDOWS SERVER 2008, Windows Server 2012,Windows服务器操作系统派应用,结合.Net开发环境,为亲微软企业用户提供了良好的应用框架。

    NetWare
            在一些特定行业和事业单位中,NetWare优秀的批处理功能和安全、稳定的系统性能也有很大的生存空间。NetWare目前常用的版本主要有Novell的3.11、3.12、4.10、5.0等中英文版。

    Unix
            Unix服务器操作系统由AT&T公司和SCO公司共同推出,主要支持大型的文件系统服务、数据服务等应用。目前市面上流传的主要有SCO SVR、BSD Unix、SUN Solaris、IBM-AIX、HP-U、FreeBSDX 。

    Linux
           LINUX操作系统虽然与UNIX操作系统类似,但是它不是UNIX操作系统的变种。Torvald从开始编写内核代码时就仿效UNIX,几乎所有UNIX的工具与外壳都可以运行在LINUX上。

    服务器配置的选择

    1、CPU的选择

           与我们平常选购PC机一样,首先要确定是CPU,而不是主板,因为CPU是整个服务器核心所在。服务棒性能如何,在相当大程度上取决于所选择的CPU类型。
            要选择CPU,首先就要知道当前的服务器CPU品牌、类型和型号,至少是系列名。在PC机中,我们可以选择的品牌目前来说只有两个,那就是Intel和AMD,但在服务器处理器方面,CPU的选择范围就大了许多。除了Intel和AMO外,目前还有IBM和SUN。Intel和AMO的处理器是基于x86,或者IA-64架构的,主要支持的操作系统是微软的Windows系统和各品牌的Linux系统;而IBM和SUN 的处理器装本上都是基于RISC架构的,主要支持各自的UNIX系统和一些特定品牌的Linux系统。从整体上来讲,Intel和AMO的处理器兼容性能好,支持面广,但一般仅能满足中、低档用户需求,像IDC、电信、金融、证券之类的用户通常是选择支持UNIX系统,基于IBM和SUN处理器的服务器系统。在价格方面,当然是基于Intel和AMO处理器的服务器要便宜些。
           处理器品牌确定只是第一步,后面还要选择处理器的类型。以上四大服务器处理器品牌中都有仅支持一个处理器的单路处理器,还有仅支持两路的双路处理器(DP ),当然近有支持多个处理器的多路处理器(MP)了。具体选择哪种就要充分考虑当前及未来至少3年内的应用需求了。如果公司比较小,而且业务发展不是很快,则可以考虑选择仪支持单路的处理器,但这不是笔者所支持的。笔者强烈建议选择至少是支持双路的DP处理器,这样可以最大限度地保护以前的投资。但要注意的是,事先要了解所选择的DP处理器是否必须安装两个处理器(有些是可以的,有些是不行的)才能正常工作,以免购买后后悔。
            如果选择的是支持多路的处理器,则要了解所采取的架构,是SMTP对称架构,还是可以非对称的MMP 架构,以便根据实际需求购买相应数量的处理器。
           处理器品牌和类型确定后,就要选择具体的型号。目前在Intel 和AMD 两公司的服务器处理器方面,主要竞争的就是双核,四核处理器,再加上这两加剧烈的竞争,现在双核处理器的价格与单核的基本上一 样,所以在选择这两家公司的处理器时就最好选择双核以上的产品理号了。对于中型以上的企业,或者发展比较迅速的小型企业,建议选择四核,甚至很快将要上市的多核处理器了。相对来说,采用多核技术的处理器比起购买多个处理器更实惠。如果选择是四核处理器,而又同时安装了4个处理器,则服务器可以允许同时进行16个进程,在进程数量上相当于16个单核处理器。
            另外,就是双核、四核处理器产品,也有不同系列和型号,具体选择哪种就要根据实际的需求和经济承受能力来定了,不一定非要选择最新的,适用就是最好的。IBM和SUN的处理器目前通常是双核、四核和八核的处理器产品,主要用于支持他们自己的UNIX操作系统。
           https://ark.intel.com/content/www/cn/zh/ark.html#@PanelLabel595此网站可以查询intel一系列cpu的代数和频率

    2、主板的选择

    主板的选择
            选好了处理器后接下来要做的就是服务器主板的选择了,主板是整个服务器新技术、新功能、新特性和综合性能的最直接体现。服务器的主板相比普通PC 机的主板来说更加重要,因为在服务器主饭不仅决定了服务器所采用的最新技术,还决定了服务稽整体性能的发挥。当然,服务器主板的选择首先还是要囱前面所傲的处理器选择决定的。但服务器不像PC 那样,我们自己在市场上选择主板,而是是以整机形式购买的。这时服务器主板性能的体现就是通过相应型号服务器的介绍来获得了。通常是建议选择采用相应品牌处理器厂商自己开发的生扳芯片。细的主板,这样兼容性更好,也可以最大限度地发挥相应处理器的新技术和新特性。

           在选择主板方面我们主要考虑的是服务器的标准配置和扩展性能。如支将的处理器数、支持的内存类型和最大内存数、各种磁盘接口数、各种扩展槽类型和数量(如PCI 、PCl-X 、PCI-E 或者lnfiniBand I/O等),是否集成RAID 控制卡,RAID 控制卡类型,集成的问卡类型和数量,以及其他一些内/外置接口配置。
            以上这些配置具体要视乎所选择的服务器级别而定,入门级的服务器配置最低,处理器一般是只支持2路,内存通常最大只支持4GB,磁盘架位也通常只提供4个,I/O扩展槽数通常是在6个以内(通常是采用32 位和64 位PCI总线的),不支持外置扩展。适用于50个用户左右的小型企业。
            部门级的服务器又比工作服务器的配置稍高,处理器支持4~8路,最大内存12GB左右,磁盘架位在8个左右,各种I/O扩展槽数在8个左右(通常提供像PCI-X 、PCI-E 这类新的总线),而且通常还支持外置扩展。适用于200 以上用户,且业务发展较快的中型企业。
    企业级的服务器配置最高,通常是支持8路处理器以上,最大内存在16GB 左右,磁盘架位通过外阁扩展可以提供10 个以上,各种I/0 扩展槽(通常提供像PCI-X 、PCI-E、lnfiniBand这类新的总线)也可以通过外围扩展方式扩展。适用于500 用户以上的企业用户。

    3、内存的选择

           内存的重要性仅次于CPU,在服务器中更是如此,因为服务器的许多故障都是因内存而产生的。在服务器内存选择方面,不仅要考虑当前主流的内存技术,如DDR2、DDR3 ,以及所支持的内存容量,还要看它所具有的其他特性,如支持的内行模组(如普通的DIMM,还有现在最新的FB-DIMM),纠错方式(至少要支持标准的ECC),是否支拌内在镜像、内存保护、内存阵列等技术。

    服务器内存条配置原则
           1、Purley平台支持的内存类型有 RDIMM和LRDIMM ;
           2、Purley平台支持的DIMM频率有 : 2133/ 2400/2666/ 2933(CasCade) ;
           3、推荐采用平衡插法配置内存,所有内存通道配置一样的内存(包括速率、容量、Rank等 ),不支持 不同类型DIMM的混插;
           4、多颗CPU配置时,首先保持各个CPU的内存配置一-样 ;
           5、当只有一个DIMM时,必须插在给定通道的slot0槽位(离CPU最远的位置);
           6、当单rank、双rank、四rank DIMM插成2DPC,总是先从 最远的槽位开始插rank高的DIMM
           注: 2 DPC : 2 DIMM per Channel (每个通道插2根DIMM条)

    附:内存带宽计算:
           满配最大内存带宽=内存标称频率内存总线位数通道数CPU个数
           实际使用的内存带宽=内存标称频率
    内存总线位数实际使用的通道数
    举例:
           如2路CPU ,支持64根内存,通道数为6的服务器,配2666的内存条 时内存的带宽为: 2666
    64* 6* 2 =2047488 Mbit/s= 250GB/s
    带宽选择
            假设你仅有一个页面是100KB,那么1G流量可以访问的页面是:(1x1024x1024)/100=10485,也就是说每天1G流量可以承受1万PV,很多个人网站是达不到这么大pv的,所以很多网站每个月30G流量足够了。当然如果下载的话流量就可能会很大。
           另外,一个页面文件100K,访问时消耗的流量未必就是100K,浏览器都会缓存页面,很多元素是不会重复计算流量的。另外还可以通过gzip等方式降低流量占用。
    所以,一般情况下,流量限制并没有多数人想像的那么可怕,而且不管主机商是否限制,其实都隐含了流量限制。如果你的服务器只有1M的带宽,你拼命地用(102460602430)/(102410248)=316,一个月也只能用掉300多G而已

    4、硬盘的选择

            服务器因为要面对多用户的并发文件访问,所以要求服务器所用的硬盘的读写性能非常高。这一方面是通过提高硬盘转速、硬盘接口带宽来保障,另一方面还要通过磁撤阵列(RAID)来加强。
            现在就硬盘接口方面,服务器硬盘主要仍是采用并行的SCSI,但目前新型的SATA 和SAS 接口也开始在一些高档服务器中采用,因为这两种新的接口技术经过儿年的发展已经很成熟。硬盘转速通常都在,IOOOOPPM以上。
           在RAID 方面,在服务器领域也可以采用SC钮,RAID、SATA-RAID 和SAS-RAID,与3种主要应用的硬盘接口一致。相比之下,SCSI-RAID 和SAS-RAID 性能更高,的SAS 这种接口技术相对更新,目前比较少的服务器支持,也比较少这种阵列卡选择。

    5、网卡的选择

           • 总线分类:PCIe、USB、ISA、PCI,ISA/PCI等总线是比较早期的网络总线,现在已很少用了,USB接口的网卡主要用在消费级电子中。
           • 结构形态:集成网卡(LOM)、PCIe标卡网卡、Mezz卡。
           • 应用类型:按网卡所应用的的计算机类型来区分,可以将网卡分为应用于工作站的网卡和应用于服务器的网卡。
    在这里插入图片描述
    在这里插入图片描述

           • 电口,PC上常见到的那种网口接口,这种接口叫RJ45,使用的是普通的网线
           • 光口,用于连接光模块,网卡上用于插光模块的接口,我们叫光笼子。
    光模块按封装形式,可以分为SFP+、SFP28、QSFP+,其中SFP+和SFP28在结构外观上是一致的,可以相互兼容,只是SFP28支持的速率更高,可以达到25G,而SFP+一般只到10G。QSFP+在外观形态上与SFP+差异很大,两者不兼容。QSFP+应用在40G以上速率上。
           • DAC线缆是直连铜缆,这种铜缆的模块头是和线缆一体的,不需要再配置光模块。电缆的衰减大,一般只有1m,3m,5m长度的,但价格便宜,是端距离传输的最佳解决方案。
           • AOC叫做有源光缆,一根AOC线缆相当于两个光模块+光纤,也是一体的,这种线缆数据传输可靠性高,但价格贵。

    服务器常识的注意事项

    1 双路等于双核么?

           无论服务器的单路、双路、四路乃至八路,其中的“路”都是指服务器物理CPU的数量,也就是服务器主板上CPU插槽的数量。
    最近出现的双核处理器,是在一颗物理CPU内部封装了两个CPU核心,这样的好处在于能够让用户在成本增加不多的前提下,拥有更强劲的性能。而且能够比较显著的降低性能功耗比,这对企业用户节约使用成本也有积极的意义。

    2 至强与奔腾的区别

           服务器上用的至强处理器和普通的P4处理器其内核基本上是一样的。区别之一是英特尔奔腾4处理器开始,便将奔腾4处理器归为个人处理器,用户不能以2颗奔腾4处理器来构架2路服务器系统,而开发出运算效能更高的至强处理器。至强处理器目前分为至强DP(最大支持双路处理)和至强MP(最大支持8路处理)。
            区别之二就是二级缓存不同。至强的二级缓存是1MB~16MB,P4的二级缓存是512KB~1MB,而二级缓存的容量也是决定服务器处理效能的重要因素。
    至强系列CPU多为604接口,而P4的CPU,多为478针或是775架构。
           注:在X86架构下,服务器除了使用英特尔奔腾、至强系列处理器外,AMD也为服务器提供了专门的处理器-皓龙Opteron,最大可支持8路。

    3 服务器的几种类型
            目前按照外形结构划分,服务器可分为塔式、机架式、刀片式三种类型。
           塔式服务器一般的塔式服务器机箱和我们常用的PC机箱差不多,而大型的塔式机箱就要粗大很多,总的来说外形尺寸没有固定标准。
    机架式服务器
            机架式服务器是由于满足企业的密集部署,形成的以19英寸机架作为标准宽度的服务器类型,高度则从1U到数U。将服务器放置到机架上,并不仅仅有利于日常的维护及治理,也可能避免意想不到的故障。首先,放置服务器不占用过多空间。机架服务器整洁地排放在机架中,不会浪费空间。其次,连接线等也能够整洁地收放到机架里。电源线和LAN线等全都能在机柜中布好线,可以减少堆积在地面上的连接线,从而防止脚踢掉电线等事故的发生。
            规定的尺寸是服务器的宽(48.26cm=19英寸)与高(4.445cm的倍数)。由于宽为19英寸,所以有时也将满足这一规定的机架称为“19英寸机架”。
    刀片式服务器
            刀片服务器是一种HAHD(High Availability High Density,高可用高密度)的低成本服务器平台,是专门为非凡应用行业和高密度计算机环境设计的,其中每一块“刀片”实际上就是一块系统母板,类似于一个个独立的服务器。在这种模式下,每一个母板运行自己的系统,服务于指定的不同用户群,相互之间没有关联。不过可以使用系统软件将这些母板集合成一个服务器集群。在集群模式下,所有的母板可以连接起来提供高速的网络环境,可以共享资源,为相同的用户群服务。

    4 “U”是什么?
           “U”在服务器领域中特指机架式服务器厚度,是一种表示服务器外部尺寸的单位,是unit的缩略语,具体尺寸由作为业界团体的美国电子工业协会(EIA)决定。
           之所以要规定服务器的尺寸,是为了使服务器保持适当的尺寸以便放在铁质或铝质机架上。机架上有固定服务器的螺孔,将它与服务器的螺孔对好,用螺丝加以固定。厚度以4.445cm为基本单位。1U就是4.445cm,2U则是1U的2倍为8.89cm。也就是说,所谓“1U的机架式服务器”,就是外形满足EIA规格、厚度为4.445cm的产品。

    5 服务器与工作站的区别是什么?
            服务器是给工作站提供各种服务的,网络通信服务,文件共享服务,硬件共享服务,各种资源服务。工作站在获取服务器各种资源的同时也可以帮服务器分流计算等任务。
           服务器和工作站都是高性能的计算机,只是相对而言服务器专注于数据吞吐能力,所以支持的外设(硬盘、I/O插槽等)更多;而工作站则专注于图形处理能力,所以外设则相对少一些,但采用非凡为图形处理设计的架构,采用高档显示卡,支持3D图像处理。工作站主要应用在各种设计、多媒体制作领域。

    展开全文
  • 英特尔公司宣布,将发运其首款面向入门级双路服务器的双核、超线程英特尔至强处理器。这款全新的处理器将可以帮助提高多线程服务器应用的性能并缩短响应时间。 英特尔服务器平台事业部总经理Kirk Skaugen表示:...
  • Java基础知识面试题(2020最新版)

    万次阅读 多人点赞 2020-02-19 12:11:27
    原理是什么Java语言哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的主类何不同?Java应用程序与小程序之间那些差别?Java和C++的区别Oracle JDK 和 OpenJDK 的...

    Java面试总结(2021优化版)已发布在个人微信公众号【技术人成长之路】,优化版首先修正了读者反馈的部分答案存在的错误,同时根据最新面试总结,删除了低频问题,添加了一些常见面试题,对文章进行了精简优化,欢迎大家关注!😊😊

    【技术人成长之路】,助力技术人成长!更多精彩文章第一时间在公众号发布哦!

    文章目录

    Java面试总结汇总,整理了包括Java基础知识,集合容器,并发编程,JVM,常用开源框架Spring,MyBatis,数据库,中间件等,包含了作为一个Java工程师在面试中需要用到或者可能用到的绝大部分知识。欢迎大家阅读,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感激不尽。文章持续更新中…

    序号内容链接地址
    1Java基础知识面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390612
    2Java集合容器面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104588551
    3Java异常面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390689
    4并发编程面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104863992
    5JVM面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390752
    6Spring面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397516
    7Spring MVC面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397427
    8Spring Boot面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397299
    9Spring Cloud面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397367
    10MyBatis面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/101292950
    11Redis面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/103522351
    12MySQL数据库面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104778621
    13消息中间件MQ与RabbitMQ面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104588612
    14Dubbo面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390006
    15Linux面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104588679
    16Tomcat面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397665
    17ZooKeeper面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397719
    18Netty面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104391081
    19架构设计&分布式&数据结构与算法面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/105870730

    Java概述

    何为编程

    编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程。

    为了使计算机能够理解人的意图,人类就必须要将需解决的问题的思路、方法、和手段通过计算机能够理解的形式告诉计算机,使得计算机能够根据人的指令一步一步去工作,完成某种特定的任务。这种人和计算机之间交流的过程就是编程。

    什么是Java

    Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。

    jdk1.5之后的三大版本

    • Java SE(J2SE,Java 2 Platform Standard Edition,标准版)
      Java SE 以前称为 J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。Java SE 包含了支持 Java Web 服务开发的类,并为Java EE和Java ME提供基础。
    • Java EE(J2EE,Java 2 Platform Enterprise Edition,企业版)
      Java EE 以前称为 J2EE。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器端Java 应用程序。Java EE 是在 Java SE 的基础上构建的,它提供 Web 服务、组件模型、管理和通信 API,可以用来实现企业级的面向服务体系结构(service-oriented architecture,SOA)和 Web2.0应用程序。2018年2月,Eclipse 宣布正式将 JavaEE 更名为 JakartaEE
    • Java ME(J2ME,Java 2 Platform Micro Edition,微型版)
      Java ME 以前称为 J2ME。Java ME 为在移动设备和嵌入式设备(比如手机、PDA、电视机顶盒和打印机)上运行的应用程序提供一个健壮且灵活的环境。Java ME 包括灵活的用户界面、健壮的安全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序的丰富支持。基于 Java ME 规范的应用程序只需编写一次,就可以用于许多设备,而且可以利用每个设备的本机功能。

    JVM、JRE和JDK的关系

    JVM
    Java Virtual Machine是Java虚拟机,Java程序需要运行在虚拟机上,不同的平台有自己的虚拟机,因此Java语言可以实现跨平台。

    JRE
    Java Runtime Environment包括Java虚拟机和Java程序所需的核心类库等。核心类库主要是java.lang包:包含了运行Java程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等,系统缺省加载这个包

    如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。

    JDK
    Java Development Kit是提供给Java开发人员使用的,其中包含了Java的开发工具,也包括了JRE。所以安装了JDK,就无需再单独安装JRE了。其中的开发工具:编译工具(javac.exe),打包工具(jar.exe)等

    JVM&JRE&JDK关系图

    什么是跨平台性?原理是什么

    所谓跨平台性,是指java语言编写的程序,一次编译后,可以在多个系统平台上运行。

    实现原理:Java程序是通过java虚拟机在系统平台上运行的,只要该系统可以安装相应的java虚拟机,该系统就可以运行java程序。

    Java语言有哪些特点

    简单易学(Java语言的语法与C语言和C++语言很接近)

    面向对象(封装,继承,多态)

    平台无关性(Java虚拟机实现平台无关性)

    支持网络编程并且很方便(Java语言诞生本身就是为简化网络编程设计的)

    支持多线程(多线程机制使应用程序在同一时间并行执行多项任)

    健壮性(Java语言的强类型机制、异常处理、垃圾的自动收集等)

    安全性

    什么是字节码?采用字节码的最大好处是什么

    字节码:Java源代码经过虚拟机编译器编译后产生的文件(即扩展为.class的文件),它不面向任何特定的处理器,只面向虚拟机。

    采用字节码的好处

    Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以Java程序运行时比较高效,而且,由于字节码并不专对一种特定的机器,因此,Java程序无须重新编译便可在多种不同的计算机上运行。

    先看下java中的编译器和解释器

    Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在Java中,这种供虚拟机理解的代码叫做字节码(即扩展为.class的文件),它不面向任何特定的处理器,只面向虚拟机。每一种平台的解释器是不同的,但是实现的虚拟机是相同的。Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行,这就是上面提到的Java的特点的编译与解释并存的解释。

    Java源代码---->编译器---->jvm可执行的Java字节码(即虚拟指令)---->jvm---->jvm中解释器----->机器可执行的二进制机器码---->程序运行。
    

    什么是Java程序的主类?应用程序和小程序的主类有何不同?

    一个程序中可以有多个类,但只能有一个类是主类。在Java应用程序中,这个主类是指包含main()方法的类。而在Java小程序中,这个主类是一个继承自系统类JApplet或Applet的子类。应用程序的主类不一定要求是public类,但小程序的主类要求必须是public类。主类是Java程序执行的入口点。

    Java应用程序与小程序之间有那些差别?

    简单说应用程序是从主线程启动(也就是main()方法)。applet小程序没有main方法,主要是嵌在浏览器页面上运行(调用init()线程或者run()来启动),嵌入浏览器这点跟flash的小游戏类似。

    Java和C++的区别

    我知道很多人没学过C++,但是面试官就是没事喜欢拿咱们Java和C++比呀!没办法!!!就算没学过C++,也要记下来!

    • 都是面向对象的语言,都支持封装、继承和多态
    • Java不提供指针来直接访问内存,程序内存更加安全
    • Java的类是单继承的,C++支持多重继承;虽然Java的类不可以多继承,但是接口可以多继承。
    • Java有自动内存管理机制,不需要程序员手动释放无用内存

    Oracle JDK 和 OpenJDK 的对比

    1. Oracle JDK版本将每三年发布一次,而OpenJDK版本每三个月发布一次;

    2. OpenJDK 是一个参考模型并且是完全开源的,而Oracle JDK是OpenJDK的一个实现,并不是完全开源的;

    3. Oracle JDK 比 OpenJDK 更稳定。OpenJDK和Oracle JDK的代码几乎相同,但Oracle JDK有更多的类和一些错误修复。因此,如果您想开发企业/商业软件,我建议您选择Oracle JDK,因为它经过了彻底的测试和稳定。某些情况下,有些人提到在使用OpenJDK 可能会遇到了许多应用程序崩溃的问题,但是,只需切换到Oracle JDK就可以解决问题;

    4. 在响应性和JVM性能方面,Oracle JDK与OpenJDK相比提供了更好的性能;

    5. Oracle JDK不会为即将发布的版本提供长期支持,用户每次都必须通过更新到最新版本获得支持来获取最新版本;

    6. Oracle JDK根据二进制代码许可协议获得许可,而OpenJDK根据GPL v2许可获得许可。

    基础语法

    数据类型

    Java有哪些数据类型

    定义:Java语言是强类型语言,对于每一种数据都定义了明确的具体的数据类型,在内存中分配了不同大小的内存空间。

    分类

    • 基本数据类型
      • 数值型
        • 整数类型(byte,short,int,long)
        • 浮点类型(float,double)
      • 字符型(char)
      • 布尔型(boolean)
    • 引用数据类型
      • 类(class)
      • 接口(interface)
      • 数组([])

    Java基本数据类型图

    switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上

    在 Java 5 以前,switch(expr)中,expr 只能是 byte、short、char、int。从 Java5 开始,Java 中引入了枚举类型,expr 也可以是 enum 类型,从 Java 7 开始,expr 还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的。

    用最有效率的方法计算 2 乘以 8

    2 << 3(左移 3 位相当于乘以 2 的 3 次方,右移 3 位相当于除以 2 的 3 次方)。

    Math.round(11.5) 等于多少?Math.round(-11.5)等于多少

    Math.round(11.5)的返回值是 12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加 0.5 然后进行下取整。

    float f=3.4;是否正确

    不正确。3.4 是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换float f =(float)3.4; 或者写成 float f =3.4F;。

    short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗

    对于 short s1 = 1; s1 = s1 + 1;由于 1 是 int 类型,因此 s1+1 运算结果也是 int型,需要强制转换类型才能赋值给 short 型。

    而 short s1 = 1; s1 += 1;可以正确编译,因为 s1+= 1;相当于 s1 = (short(s1 + 1);其中有隐含的强制类型转换。

    编码

    Java语言采用何种编码方案?有何特点?

    Java语言采用Unicode编码标准,Unicode(标准码),它为每个字符制订了一个唯一的数值,因此在任何的语言,平台,程序都可以放心的使用。

    注释

    什么Java注释

    定义:用于解释说明程序的文字

    分类

    • 单行注释
      格式: // 注释文字
    • 多行注释
      格式: /* 注释文字 */
    • 文档注释
      格式:/** 注释文字 */

    作用

    在程序中,尤其是复杂的程序中,适当地加入注释可以增加程序的可读性,有利于程序的修改、调试和交流。注释的内容在程序编译的时候会被忽视,不会产生目标代码,注释的部分不会对程序的执行结果产生任何影响。

    注意事项:多行和文档注释都不能嵌套使用。

    访问修饰符

    访问修饰符 public,private,protected,以及不写(默认)时的区别

    定义:Java中,可以使用访问修饰符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。

    分类

    private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
    default (即缺省,什么也不写,不使用任何关键字): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
    protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。
    public : 对所有类可见。使用对象:类、接口、变量、方法

    访问修饰符图

    运算符

    &和&&的区别

    &运算符有两种用法:(1)按位与;(2)逻辑与。

    &&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true 整个表达式的值才是 true。&&之所以称为短路运算,是因为如果&&左边的表达式的值是 false,右边的表达式会被直接短路掉,不会进行运算。

    注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。

    关键字

    Java 有没有 goto

    goto 是 Java 中的保留字,在目前版本的 Java 中没有使用。

    final 有什么用?

    用于修饰类、属性和方法;

    • 被final修饰的类不可以被继承
    • 被final修饰的方法不可以被重写
    • 被final修饰的变量不可以被改变,被final修饰不可变的是变量的引用,而不是引用指向的内容,引用指向的内容是可以改变的

    final finally finalize区别

    • final可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表
      示该变量是一个常量不能被重新赋值。
    • finally一般作用在try-catch代码块中,在处理异常的时候,通常我们将一定要执行的代码方法finally代码块
      中,表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。
    • finalize是一个方法,属于Object类的一个方法,而Object类是所有类的父类,该方法一般由垃圾回收器来调
      用,当我们调用System.gc() 方法的时候,由垃圾回收器调用finalize(),回收垃圾,一个对象是否可回收的
      最后判断。

    this关键字的用法

    this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。

    this的用法在java中大体可以分为3种:

    1.普通的直接引用,this相当于是指向当前对象本身。

    2.形参与成员名字重名,用this来区分:

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    

    3.引用本类的构造函数

    class Person{
        private String name;
        private int age;
        
        public Person() {
        }
     
        public Person(String name) {
            this.name = name;
        }
        public Person(String name, int age) {
            this(name);
            this.age = age;
        }
    }
    

    super关键字的用法

    super可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。

    super也有三种用法:

    1.普通的直接引用

    与this类似,super相当于是指向当前对象的父类的引用,这样就可以用super.xxx来引用父类的成员。

    2.子类中的成员变量或方法与父类中的成员变量或方法同名时,用super进行区分

    class Person{
        protected String name;
     
        public Person(String name) {
            this.name = name;
        }
     
    }
     
    class Student extends Person{
        private String name;
     
        public Student(String name, String name1) {
            super(name);
            this.name = name1;
        }
     
        public void getInfo(){
            System.out.println(this.name);      //Child
            System.out.println(super.name);     //Father
        }
     
    }
    
    public class Test {
        public static void main(String[] args) {
           Student s1 = new Student("Father","Child");
           s1.getInfo();
     
        }
    }
    

    3.引用父类构造函数

    3、引用父类构造函数

    • super(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句)。
    • this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。

    this与super的区别

    • super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名(实参)
    • this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)
    • super()和this()类似,区别是,super()在子类中调用父类的构造方法,this()在本类内调用本类的其它构造方法。
    • super()和this()均需放在构造方法内第一行。
    • 尽管可以用this调用一个构造器,但却不能调用两个。
    • this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
    • this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。
    • 从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。

    static存在的主要意义

    static的主要意义是在于创建独立于具体对象的域变量或者方法。以致于即使没有创建对象,也能使用属性和调用方法

    static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。

    为什么说static块可以用来优化程序性能,是因为它的特性:只会在类加载的时候执行一次。因此,很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。

    static的独特之处

    1、被static修饰的变量或者方法是独立于该类的任何对象,也就是说,这些变量和方法不属于任何一个实例对象,而是被类的实例对象所共享

    怎么理解 “被类的实例对象所共享” 这句话呢?就是说,一个类的静态成员,它是属于大伙的【大伙指的是这个类的多个对象实例,我们都知道一个类可以创建多个实例!】,所有的类对象共享的,不像成员变量是自个的【自个指的是这个类的单个实例对象】…我觉得我已经讲的很通俗了,你明白了咩?

    2、在该类被第一次加载的时候,就会去加载被static修饰的部分,而且只在类第一次使用时加载并进行初始化,注意这是第一次用就要初始化,后面根据需要是可以再次赋值的。

    3、static变量值在类加载的时候分配空间,以后创建类对象的时候不会重新分配。赋值的话,是可以任意赋值的!

    4、被static修饰的变量或者方法是优先于对象存在的,也就是说当一个类加载完毕之后,即便没有创建对象,也可以去访问。

    static应用场景

    因为static是被类的实例对象所共享,因此如果某个成员变量是被所有对象所共享的,那么这个成员变量就应该定义为静态变量

    因此比较常见的static应用场景有:

    1、修饰成员变量 2、修饰成员方法 3、静态代码块 4、修饰类【只能修饰内部类也就是静态内部类】 5、静态导包

    static注意事项

    1、静态只能访问静态。 2、非静态既可以访问非静态的,也可以访问静态的。

    流程控制语句

    break ,continue ,return 的区别及作用

    break 跳出总上一层循环,不再执行循环(结束当前的循环体)

    continue 跳出本次循环,继续执行下次循环(结束正在执行的循环 进入下一个循环条件)

    return 程序返回,不再执行下面的代码(结束当前的方法 直接返回)

    在 Java 中,如何跳出当前的多重嵌套循环

    在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break 语句,即可跳出外层循环。例如:

    public static void main(String[] args) {
        ok:
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                System.out.println("i=" + i + ",j=" + j);
                if (j == 5) {
                    break ok;
                }
    
            }
        }
    }
    

    面向对象

    面向对象概述

    面向对象和面向过程的区别

    面向过程

    优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。

    缺点:没有面向对象易维护、易复用、易扩展

    面向对象

    优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护

    缺点:性能比面向过程低

    面向过程是具体化的,流程化的,解决一个问题,你需要一步一步的分析,一步一步的实现。

    面向对象是模型化的,你只需抽象出一个类,这是一个封闭的盒子,在这里你拥有数据也拥有解决问题的方法。需要什么功能直接使用就可以了,不必去一步一步的实现,至于这个功能是如何实现的,管我们什么事?我们会用就可以了。

    面向对象的底层其实还是面向过程,把面向过程抽象成类,然后封装,方便我们使用的就是面向对象了。

    面向对象三大特性

    面向对象的特征有哪些方面

    面向对象的特征主要有以下几个方面

    抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。

    封装

    封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。

    继承

    继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码。

    关于继承如下 3 点请记住:

    1. 子类拥有父类非 private 的属性和方法。

    2. 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。

    3. 子类可以用自己的方式实现父类的方法。(以后介绍)。

    多态

    所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。

    在Java中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)。

    其中Java 面向对象编程三大特性:封装 继承 多态

    封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用性和安全性。

    继承:继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承可以提高代码复用性。继承是多态的前提。

    关于继承如下 3 点请记住

    1. 子类拥有父类非 private 的属性和方法。

    2. 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。

    3. 子类可以用自己的方式实现父类的方法。

    多态性:父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的拓展性。

    在Java中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)。

    方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。

    一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。运行时的多态是面向对象最精髓的东西,要实现多态需要做两件事:

    • 方法重写(子类继承父类并重写父类中已有的或抽象的方法);
    • 对象造型(用父类型引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)。

    什么是多态机制?Java语言是如何实现多态的?

    所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。

    多态分为编译时多态和运行时多态。其中编辑时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的函数,通过编辑之后会变成两个不同的函数,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是我们所说的多态性。

    多态的实现

    Java实现多态有三个必要条件:继承、重写、向上转型。

    继承:在多态中必须存在有继承关系的子类和父类。

    重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。

    向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。

    只有满足了上述三个条件,我们才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行为。

    对于Java而言,它多态的实现机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。

    面向对象五大基本原则是什么(可选)

    • 单一职责原则SRP(Single Responsibility Principle)
      类的功能要单一,不能包罗万象,跟杂货铺似的。
    • 开放封闭原则OCP(Open-Close Principle)
      一个模块对于拓展是开放的,对于修改是封闭的,想要增加功能热烈欢迎,想要修改,哼,一万个不乐意。
    • 里式替换原则LSP(the Liskov Substitution Principle LSP)
      子类可以替换父类出现在父类能够出现的任何地方。比如你能代表你爸去你姥姥家干活。哈哈~~
    • 依赖倒置原则DIP(the Dependency Inversion Principle DIP)
      高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。抽象不应该依赖于具体实现,具体实现应该依赖于抽象。就是你出国要说你是中国人,而不能说你是哪个村子的。比如说中国人是抽象的,下面有具体的xx省,xx市,xx县。你要依赖的抽象是中国人,而不是你是xx村的。
    • 接口分离原则ISP(the Interface Segregation Principle ISP)
      设计时采用多个与特定客户类有关的接口比采用一个通用的接口要好。就比如一个手机拥有打电话,看视频,玩游戏等功能,把这几个功能拆分成不同的接口,比在一个接口里要好的多。

    类与接口

    抽象类和接口的对比

    抽象类是用来捕捉子类的通用特性的。接口是抽象方法的集合。

    从设计层面来说,抽象类是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。

    相同点

    • 接口和抽象类都不能实例化
    • 都位于继承的顶端,用于被其他实现或继承
    • 都包含抽象方法,其子类都必须覆写这些抽象方法

    不同点

    参数抽象类接口
    声明抽象类使用abstract关键字声明接口使用interface关键字声明
    实现子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现子类使用implements关键字来实现接口。它需要提供接口中所有声明的方法的实现
    构造器抽象类可以有构造器接口不能有构造器
    访问修饰符抽象类中的方法可以是任意访问修饰符接口方法默认修饰符是public。并且不允许定义为 private 或者 protected
    多继承一个类最多只能继承一个抽象类一个类可以实现多个接口
    字段声明抽象类的字段声明可以是任意的接口的字段默认都是 static 和 final 的

    备注:Java8中接口中引入默认方法和静态方法,以此来减少抽象类和接口之间的差异。

    现在,我们可以为接口提供默认实现的方法了,并且不用强制子类来实现它。

    接口和抽象类各有优缺点,在接口和抽象类的选择上,必须遵守这样一个原则:

    • 行为模型应该总是通过接口而不是抽象类定义,所以通常是优先选用接口,尽量少用抽象类。
    • 选择抽象类的时候通常是如下情况:需要定义子类的行为,又要为子类提供通用的功能。

    普通类和抽象类有哪些区别?

    • 普通类不能包含抽象方法,抽象类可以包含抽象方法。
    • 抽象类不能直接实例化,普通类可以直接实例化。

    抽象类能使用 final 修饰吗?

    不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能修饰抽象类

    创建一个对象用什么关键字?对象实例与对象引用有何不同?

    new关键字,new创建对象实例(对象实例在堆内存中),对象引用指向对象实例(对象引用存放在栈内存中)。一个对象引用可以指向0个或1个对象(一根绳子可以不系气球,也可以系一个气球);一个对象可以有n个引用指向它(可以用n条绳子系住一个气球)

    变量与方法

    成员变量与局部变量的区别有哪些

    变量:在程序执行的过程中,在某个范围内其值可以发生改变的量。从本质上讲,变量其实是内存中的一小块区域

    成员变量:方法外部,类内部定义的变量

    局部变量:类的方法中的变量。

    成员变量和局部变量的区别

    作用域

    成员变量:针对整个类有效。
    局部变量:只在某个范围内有效。(一般指的就是方法,语句体内)

    存储位置

    成员变量:随着对象的创建而存在,随着对象的消失而消失,存储在堆内存中。
    局部变量:在方法被调用,或者语句被执行的时候存在,存储在栈内存中。当方法调用完,或者语句结束后,就自动释放。

    生命周期

    成员变量:随着对象的创建而存在,随着对象的消失而消失
    局部变量:当方法调用完,或者语句结束后,就自动释放。

    初始值

    成员变量:有默认初始值。

    局部变量:没有默认初始值,使用前必须赋值。

    使用原则

    在使用变量时需要遵循的原则为:就近原则
    首先在局部范围找,有就使用;接着在成员位置找。

    在Java中定义一个不做事且没有参数的构造方法的作用

    Java程序在执行子类的构造方法之前,如果没有用super()来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用super()来调用父类中特定的构造方法,则编译时将发生错误,因为Java程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。

    在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?

    帮助子类做初始化工作。

    一个类的构造方法的作用是什么?若一个类没有声明构造方法,改程序能正确执行吗?为什么?

    主要作用是完成对类对象的初始化工作。可以执行。因为一个类即使没有声明构造方法也会有默认的不带参数的构造方法。

    构造方法有哪些特性?

    名字与类名相同;

    没有返回值,但不能用void声明构造函数;

    生成类的对象时自动执行,无需调用。

    静态变量和实例变量区别

    静态变量: 静态变量由于不属于任何实例对象,属于类的,所以在内存中只会有一份,在类的加载过程中,JVM只为静态变量分配一次内存空间。

    实例变量: 每次创建对象,都会为每个对象分配成员变量内存空间,实例变量是属于实例对象的,在内存中,创建几次对象,就有几份成员变量。

    静态变量与普通变量区别

    static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。

    还有一点就是static成员变量的初始化顺序按照定义的顺序进行初始化。

    静态方法和实例方法有何不同?

    静态方法和实例方法的区别主要体现在两个方面:

    1. 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。
    2. 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制

    在一个静态方法内调用一个非静态成员为什么是非法的?

    由于静态方法可以不通过对象进行调用,因此在静态方法里,不能调用其他非静态变量,也不可以访问非静态变量成员。

    什么是方法的返回值?返回值的作用是什么?

    方法的返回值是指我们获取到的某个方法体中的代码执行后产生的结果!(前提是该方法可能产生结果)。返回值的作用:接收出结果,使得它可以用于其他的操作!

    内部类

    什么是内部类?

    在Java中,可以将一个类的定义放在另外一个类的定义内部,这就是内部类。内部类本身就是类的一个属性,与其他属性定义方式一致。

    内部类的分类有哪些

    内部类可以分为四种:成员内部类、局部内部类、匿名内部类和静态内部类

    静态内部类

    定义在类内部的静态类,就是静态内部类。

    public class Outer {
    
        private static int radius = 1;
    
        static class StaticInner {
            public void visit() {
                System.out.println("visit outer static  variable:" + radius);
            }
        }
    }
    

    静态内部类可以访问外部类所有的静态变量,而不可访问外部类的非静态变量;静态内部类的创建方式,new 外部类.静态内部类(),如下:

    Outer.StaticInner inner = new Outer.StaticInner();
    inner.visit();
    
    成员内部类

    定义在类内部,成员位置上的非静态类,就是成员内部类。

    public class Outer {
    
        private static  int radius = 1;
        private int count =2;
        
         class Inner {
            public void visit() {
                System.out.println("visit outer static  variable:" + radius);
                System.out.println("visit outer   variable:" + count);
            }
        }
    }
    

    成员内部类可以访问外部类所有的变量和方法,包括静态和非静态,私有和公有。成员内部类依赖于外部类的实例,它的创建方式外部类实例.new 内部类(),如下:

    Outer outer = new Outer();
    Outer.Inner inner = outer.new Inner();
    inner.visit();
    
    局部内部类

    定义在方法中的内部类,就是局部内部类。

    public class Outer {
    
        private  int out_a = 1;
        private static int STATIC_b = 2;
    
        public void testFunctionClass(){
            int inner_c =3;
            class Inner {
                private void fun(){
                    System.out.println(out_a);
                    System.out.println(STATIC_b);
                    System.out.println(inner_c);
                }
            }
            Inner  inner = new Inner();
            inner.fun();
        }
        public static void testStaticFunctionClass(){
            int d =3;
            class Inner {
                private void fun(){
                    // System.out.println(out_a); 编译错误,定义在静态方法中的局部类不可以访问外部类的实例变量
                    System.out.println(STATIC_b);
                    System.out.println(d);
                }
            }
            Inner  inner = new Inner();
            inner.fun();
        }
    }
    

    定义在实例方法中的局部类可以访问外部类的所有变量和方法,定义在静态方法中的局部类只能访问外部类的静态变量和方法。局部内部类的创建方式,在对应方法内,new 内部类(),如下:

     public static void testStaticFunctionClass(){
        class Inner {
        }
        Inner  inner = new Inner();
     }
    
    匿名内部类

    匿名内部类就是没有名字的内部类,日常开发中使用的比较多。

    public class Outer {
    
        private void test(final int i) {
            new Service() {
                public void method() {
                    for (int j = 0; j < i; j++) {
                        System.out.println("匿名内部类" );
                    }
                }
            }.method();
        }
     }
     //匿名内部类必须继承或实现一个已有的接口 
     interface Service{
        void method();
    }
    

    除了没有名字,匿名内部类还有以下特点:

    • 匿名内部类必须继承一个抽象类或者实现一个接口。
    • 匿名内部类不能定义任何静态成员和静态方法。
    • 当所在的方法的形参需要被匿名内部类使用时,必须声明为 final。
    • 匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。

    匿名内部类创建方式:

    new/接口{ 
      //匿名内部类实现部分
    }
    

    内部类的优点

    我们为什么要使用内部类呢?因为它有以下优点:

    • 一个内部类对象可以访问创建它的外部类对象的内容,包括私有数据!
    • 内部类不为同一包的其他类所见,具有很好的封装性;
    • 内部类有效实现了“多重继承”,优化 java 单继承的缺陷。
    • 匿名内部类可以很方便的定义回调。

    内部类有哪些应用场景

    1. 一些多算法场合
    2. 解决一些非面向对象的语句块。
    3. 适当使用内部类,使得代码更加灵活和富有扩展性。
    4. 当某个类除了它的外部类,不再被其他的类使用时。

    局部内部类和匿名内部类访问局部变量的时候,为什么变量必须要加上final?

    局部内部类和匿名内部类访问局部变量的时候,为什么变量必须要加上final呢?它内部原理是什么呢?

    先看这段代码:

    public class Outer {
    
        void outMethod(){
            final int a =10;
            class Inner {
                void innerMethod(){
                    System.out.println(a);
                }
    
            }
        }
    }
    

    以上例子,为什么要加final呢?是因为生命周期不一致, 局部变量直接存储在栈中,当方法执行结束后,非final的局部变量就被销毁。而局部内部类对局部变量的引用依然存在,如果局部内部类要调用局部变量时,就会出错。加了final,可以确保局部内部类使用的变量与外层的局部变量区分开,解决了这个问题。

    内部类相关,看程序说出运行结果

    public class Outer {
        private int age = 12;
    
        class Inner {
            private int age = 13;
            public void print() {
                int age = 14;
                System.out.println("局部变量:" + age);
                System.out.println("内部类变量:" + this.age);
                System.out.println("外部类变量:" + Outer.this.age);
            }
        }
    
        public static void main(String[] args) {
            Outer.Inner in = new Outer().new Inner();
            in.print();
        }
    
    }
    

    运行结果:

    局部变量:14
    内部类变量:13
    外部类变量:12
    

    重写与重载

    构造器(constructor)是否可被重写(override)

    构造器不能被继承,因此不能被重写,但可以被重载。

    重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?

    方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。

    重载:发生在同一个类中,方法名相同参数列表不同(参数类型不同、个数不同、顺序不同),与方法返回值和访问修饰符无关,即重载的方法不能根据返回类型进行区分

    重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类(里氏代换原则);如果父类方法访问修饰符为private则子类中就不是重写。

    对象相等判断

    == 和 equals 的区别是什么

    == : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型 == 比较的是值,引用数据类型 == 比较的是内存地址)

    equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:

    情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。

    情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象的内容相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。

    举个例子:

    public class test1 {
        public static void main(String[] args) {
            String a = new String("ab"); // a 为一个引用
            String b = new String("ab"); // b为另一个引用,对象的内容一样
            String aa = "ab"; // 放在常量池中
            String bb = "ab"; // 从常量池中查找
            if (aa == bb) // true
                System.out.println("aa==bb");
            if (a == b) // false,非同一对象
                System.out.println("a==b");
            if (a.equals(b)) // true
                System.out.println("aEQb");
            if (42 == 42.0) { // true
                System.out.println("true");
            }
        }
    }
    

    说明:

    • String中的equals方法是被重写过的,因为object的equals方法是比较的对象的内存地址,而String的equals方法比较的是对象的值。
    • 当创建String类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个String对象。

    hashCode 与 equals (重要)

    HashSet如何检查重复

    两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?

    hashCode和equals方法的关系

    面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?”

    hashCode()介绍

    hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode()函数。

    散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码!(可以快速找到所需要的对象)

    为什么要有 hashCode

    我们以“HashSet 如何检查重复”为例子来说明为什么要有 hashCode

    当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashcode 值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用 equals()方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。(摘自我的Java启蒙书《Head first java》第二版)。这样我们就大大减少了 equals 的次数,相应就大大提高了执行速度。

    hashCode()与equals()的相关规定

    如果两个对象相等,则hashcode一定也是相同的

    两个对象相等,对两个对象分别调用equals方法都返回true

    两个对象有相同的hashcode值,它们也不一定是相等的

    因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖

    hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)

    对象的相等与指向他们的引用相等,两者有什么不同?

    对象的相等 比的是内存中存放的内容是否相等而 引用相等 比较的是他们指向的内存地址是否相等。

    值传递

    当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递

    是值传递。Java 语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对对象引用的改变是不会影响到调用者的

    为什么 Java 中只有值传递

    首先回顾一下在程序设计语言中有关将参数传递给方法(或函数)的一些专业术语。按值调用(call by value)表示方法接收的是调用者提供的值,而按引用调用(call by reference)表示方法接收的是调用者提供的变量地址。一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。 它用来描述各种程序设计语言(不只是Java)中方法参数传递方式。

    Java程序设计语言总是采用按值调用。也就是说,方法得到的是所有参数值的一个拷贝,也就是说,方法不能修改传递给它的任何参数变量的内容。

    下面通过 3 个例子来给大家说明

    example 1

    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 20;
    
        swap(num1, num2);
    
        System.out.println("num1 = " + num1);
        System.out.println("num2 = " + num2);
    }
    
    public static void swap(int a, int b) {
        int temp = a;
        a = b;
        b = temp;
    
        System.out.println("a = " + a);
        System.out.println("b = " + b);
    }
    

    结果

    a = 20
    b = 10
    num1 = 10
    num2 = 20
    

    解析

    img

    在swap方法中,a、b的值进行交换,并不会影响到 num1、num2。因为,a、b中的值,只是从 num1、num2 的复制过来的。也就是说,a、b相当于num1、num2 的副本,副本的内容无论怎么修改,都不会影响到原件本身。

    通过上面例子,我们已经知道了一个方法不能修改一个基本数据类型的参数,而对象引用作为参数就不一样,请看 example2.

    example 2

        public static void main(String[] args) {
            int[] arr = { 1, 2, 3, 4, 5 };
            System.out.println(arr[0]);
            change(arr);
            System.out.println(arr[0]);
        }
    
        public static void change(int[] array) {
            // 将数组的第一个元素变为0
            array[0] = 0;
        }
    

    结果

    1
    0
    

    解析

    img

    array 被初始化 arr 的拷贝也就是一个对象的引用,也就是说 array 和 arr 指向的时同一个数组对象。 因此,外部对引用对象的改变会反映到所对应的对象上。

    通过 example2 我们已经看到,实现一个改变对象参数状态的方法并不是一件难事。理由很简单,方法得到的是对象引用的拷贝,对象引用及其他的拷贝同时引用同一个对象。

    很多程序设计语言(特别是,C++和Pascal)提供了两种参数传递的方式:值调用和引用调用。有些程序员(甚至本书的作者)认为Java程序设计语言对对象采用的是引用调用,实际上,这种理解是不对的。由于这种误解具有一定的普遍性,所以下面给出一个反例来详细地阐述一下这个问题。

    example 3

    public class Test {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Student s1 = new Student("小张");
            Student s2 = new Student("小李");
            Test.swap(s1, s2);
            System.out.println("s1:" + s1.getName());
            System.out.println("s2:" + s2.getName());
        }
    
        public static void swap(Student x, Student y) {
            Student temp = x;
            x = y;
            y = temp;
            System.out.println("x:" + x.getName());
            System.out.println("y:" + y.getName());
        }
    }
    

    结果

    x:小李
    y:小张
    s1:小张
    s2:小李
    

    解析

    交换之前:

    img

    交换之后:

    img

    通过上面两张图可以很清晰的看出: 方法并没有改变存储在变量 s1 和 s2 中的对象引用。swap方法的参数x和y被初始化为两个对象引用的拷贝,这个方法交换的是这两个拷贝

    总结

    Java程序设计语言对对象采用的不是引用调用,实际上,对象引用是按值传递的。

    下面再总结一下Java中方法参数的使用情况:

    • 一个方法不能修改一个基本数据类型的参数(即数值型或布尔型》
    • 一个方法可以改变一个对象参数的状态。
    • 一个方法不能让对象参数引用一个新的对象。

    值传递和引用传递有什么区别

    值传递:指的是在方法调用时,传递的参数是按值的拷贝传递,传递的是值的拷贝,也就是说传递后就互不相关了。

    引用传递:指的是在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。

    Java包

    JDK 中常用的包有哪些

    • java.lang:这个是系统的基础类;
    • java.io:这里面是所有输入输出有关的类,比如文件操作等;
    • java.nio:为了完善 io 包中的功能,提高 io 包中性能而写的一个新包;
    • java.net:这里面是与网络有关的类;
    • java.util:这个是系统辅助类,特别是集合类;
    • java.sql:这个是数据库操作的类。

    import java和javax有什么区别

    刚开始的时候 JavaAPI 所必需的包是 java 开头的包,javax 当时只是扩展 API 包来说使用。然而随着时间的推移,javax 逐渐的扩展成为 Java API 的组成部分。但是,将扩展从 javax 包移动到 java 包将是太麻烦了,最终会破坏一堆现有的代码。因此,最终决定 javax 包将成为标准API的一部分。

    所以,实际上java和javax没有区别。这都是一个名字。

    IO流

    java 中 IO 流分为几种?

    • 按照流的流向分,可以分为输入流和输出流;
    • 按照操作单元划分,可以划分为字节流和字符流;
    • 按照流的角色划分为节点流和处理流。

    Java Io流共涉及40多个类,这些类看上去很杂乱,但实际上很有规则,而且彼此之间存在非常紧密的联系, Java I0流的40多个类都是从如下4个抽象类基类中派生出来的。

    • InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
    • OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。

    按操作方式分类结构图:

    IO-操作方式分类

    按操作对象分类结构图:

    IO-操作对象分类

    BIO,NIO,AIO 有什么区别?

    简答

    • BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
    • NIO:Non IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
    • AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。

    详细回答

    • BIO (Blocking I/O): 同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。在活动连接数不是特别高(小于单机1000)的情况下,这种模型是比较不错的,可以让每一个连接专注于自己的 I/O 并且编程模型简单,也不用过多考虑系统的过载、限流等问题。线程池本身就是一个天然的漏斗,可以缓冲一些系统处理不了的连接或请求。但是,当面对十万甚至百万级连接的时候,传统的 BIO 模型是无能为力的。因此,我们需要一种更高效的 I/O 处理模型来应对更高的并发量。
    • NIO (New I/O): NIO是一种同步非阻塞的I/O模型,在Java 1.4 中引入了NIO框架,对应 java.nio 包,提供了 Channel , Selector,Buffer等抽象。NIO中的N可以理解为Non-blocking,不单纯是New。它支持面向缓冲的,基于通道的I/O操作方法。 NIO提供了与传统BIO模型中的 SocketServerSocket 相对应的 SocketChannelServerSocketChannel 两种不同的套接字通道实现,两种通道都支持阻塞和非阻塞两种模式。阻塞模式使用就像传统中的支持一样,比较简单,但是性能和可靠性都不好;非阻塞模式正好与之相反。对于低负载、低并发的应用程序,可以使用同步阻塞I/O来提升开发速率和更好的维护性;对于高负载、高并发的(网络)应用,应使用 NIO 的非阻塞模式来开发
    • AIO (Asynchronous I/O): AIO 也就是 NIO 2。在 Java 7 中引入了 NIO 的改进版 NIO 2,它是异步非阻塞的IO模型。异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。AIO 是异步IO的缩写,虽然 NIO 在网络操作中,提供了非阻塞的方法,但是 NIO 的 IO 行为还是同步的。对于 NIO 来说,我们的业务线程是在 IO 操作准备好时,得到通知,接着就由这个线程自行进行 IO 操作,IO操作本身是同步的。查阅网上相关资料,我发现就目前来说 AIO 的应用还不是很广泛,Netty 之前也尝试使用过 AIO,不过又放弃了。

    Files的常用方法都有哪些?

    • Files. exists():检测文件路径是否存在。
    • Files. createFile():创建文件。
    • Files. createDirectory():创建文件夹。
    • Files. delete():删除一个文件或目录。
    • Files. copy():复制文件。
    • Files. move():移动文件。
    • Files. size():查看文件个数。
    • Files. read():读取文件。
    • Files. write():写入文件。

    反射

    什么是反射机制?

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

    静态编译和动态编译

    • **静态编译:**在编译时确定类型,绑定对象
    • **动态编译:**运行时确定类型,绑定对象

    反射机制优缺点

    • 优点: 运行期类型的判断,动态加载类,提高代码灵活度。
    • 缺点: 性能瓶颈:反射相当于一系列解释操作,通知 JVM 要做的事情,性能比直接的java代码要慢很多。

    反射机制的应用场景有哪些?

    反射是框架设计的灵魂。

    在我们平时的项目开发过程中,基本上很少会直接使用到反射机制,但这不能说明反射机制没有用,实际上有很多设计、开发都与反射机制有关,例如模块化的开发,通过反射去调用对应的字节码;动态代理设计模式也采用了反射机制,还有我们日常使用的 Spring/Hibernate 等框架也大量使用到了反射机制。

    举例:①我们在使用JDBC连接数据库时使用Class.forName()通过反射加载数据库的驱动程序;②Spring框架也用到很多反射机制,最经典的就是xml的配置模式。Spring 通过 XML 配置模式装载 Bean 的过程:1) 将程序内所有 XML 或 Properties 配置文件加载入内存中; 2)Java类里面解析xml或properties里面的内容,得到对应实体类的字节码字符串以及相关的属性信息; 3)使用反射机制,根据这个字符串获得某个类的Class实例; 4)动态配置实例的属性

    Java获取反射的三种方法

    1.通过new对象实现反射机制 2.通过路径实现反射机制 3.通过类名实现反射机制

    public class Student {
        private int id;
        String name;
        protected boolean sex;
        public float score;
    }
    
    public class Get {
        //获取反射机制三种方式
        public static void main(String[] args) throws ClassNotFoundException {
            //方式一(通过建立对象)
            Student stu = new Student();
            Class classobj1 = stu.getClass();
            System.out.println(classobj1.getName());
            //方式二(所在通过路径-相对路径)
            Class classobj2 = Class.forName("fanshe.Student");
            System.out.println(classobj2.getName());
            //方式三(通过类名)
            Class classobj3 = Student.class;
            System.out.println(classobj3.getName());
        }
    }
    

    网络编程

    网络编程的面试题可以查看我的这篇文章重学TCP/IP协议和三次握手四次挥手,内容不仅包括TCP/IP协议和三次握手四次挥手的知识,还包括计算机网络体系结构,HTTP协议,get请求和post请求区别,session和cookie的区别等,欢迎大家阅读。

    常用API

    String相关

    字符型常量和字符串常量的区别

    1. 形式上: 字符常量是单引号引起的一个字符 字符串常量是双引号引起的若干个字符
    2. 含义上: 字符常量相当于一个整形值(ASCII值),可以参加表达式运算 字符串常量代表一个地址值(该字符串在内存中存放位置)
    3. 占内存大小 字符常量只占两个字节 字符串常量占若干个字节(至少一个字符结束标志)

    什么是字符串常量池?

    字符串常量池位于堆内存中,专门用来存储字符串常量,可以提高内存的使用率,避免开辟多块空间存储相同的字符串,在创建字符串时 JVM 会首先检查字符串常量池,如果该字符串已经存在池中,则返回它的引用,如果不存在,则实例化一个字符串放到池中,并返回其引用。

    String 是最基本的数据类型吗

    不是。Java 中的基本数据类型只有 8 个 :byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type),剩下的都是引用类型(referencetype),Java 5 以后引入的枚举类型也算是一种比较特殊的引用类型。

    这是很基础的东西,但是很多初学者却容易忽视,Java 的 8 种基本数据类型中不包括 String,基本数据类型中用来描述文本数据的是 char,但是它只能表示单个字符,比如 ‘a’,‘好’ 之类的,如果要描述一段文本,就需要用多个 char 类型的变量,也就是一个 char 类型数组,比如“你好” 就是长度为2的数组 char[] chars = {‘你’,‘好’};

    但是使用数组过于麻烦,所以就有了 String,String 底层就是一个 char 类型的数组,只是使用的时候开发者不需要直接操作底层数组,用更加简便的方式即可完成对字符串的使用。

    String有哪些特性

    • 不变性:String 是只读字符串,是一个典型的 immutable 对象,对它进行任何操作,其实都是创建一个新的对象,再把引用指向该对象。不变模式的主要作用在于当一个对象需要被多线程共享并频繁访问时,可以保证数据的一致性。

    • 常量池优化:String 对象创建之后,会在字符串常量池中进行缓存,如果下次创建同样的对象时,会直接返回缓存的引用。

    • final:使用 final 来定义 String 类,表示 String 类不能被继承,提高了系统的安全性。

    String为什么是不可变的吗?

    简单来说就是String类利用了final修饰的char类型数组存储字符,源码如下图所以:

    /** The value is used for character storage. */
    private final char value[];
    

    String真的是不可变的吗?

    我觉得如果别人问这个问题的话,回答不可变就可以了。 下面只是给大家看两个有代表性的例子:

    1) String不可变但不代表引用不可以变

    String str = "Hello";
    str = str + " World";
    System.out.println("str=" + str);
    

    结果:

    str=Hello World
    

    解析:

    实际上,原来String的内容是不变的,只是str由原来指向"Hello"的内存地址转为指向"Hello World"的内存地址而已,也就是说多开辟了一块内存区域给"Hello World"字符串。

    2) 通过反射是可以修改所谓的“不可变”对象

    // 创建字符串"Hello World", 并赋给引用s
    String s = "Hello World";
    
    System.out.println("s = " + s); // Hello World
    
    // 获取String类中的value字段
    Field valueFieldOfString = String.class.getDeclaredField("value");
    
    // 改变value属性的访问权限
    valueFieldOfString.setAccessible(true);
    
    // 获取s对象上的value属性的值
    char[] value = (char[]) valueFieldOfString.get(s);
    
    // 改变value所引用的数组中的第5个字符
    value[5] = '_';
    
    System.out.println("s = " + s); // Hello_World
    

    结果:

    s = Hello World
    s = Hello_World
    

    解析:

    用反射可以访问私有成员, 然后反射出String对象中的value属性, 进而改变通过获得的value引用改变数组的结构。但是一般我们不会这么做,这里只是简单提一下有这个东西。

    是否可以继承 String 类

    String 类是 final 类,不可以被继承。

    String str="i"与 String str=new String(“i”)一样吗?

    不一样,因为内存的分配方式不一样。String str="i"的方式,java 虚拟机会将其分配到常量池中;而 String str=new String(“i”) 则会被分到堆内存中。

    String s = new String(“xyz”);创建了几个字符串对象

    两个对象,一个是静态区的"xyz",一个是用new创建在堆上的对象。

    String str1 = "hello"; //str1指向静态区
    String str2 = new String("hello");  //str2指向堆上的对象
    String str3 = "hello";
    String str4 = new String("hello");
    System.out.println(str1.equals(str2)); //true
    System.out.println(str2.equals(str4)); //true
    System.out.println(str1 == str3); //true
    System.out.println(str1 == str2); //false
    System.out.println(str2 == str4); //false
    System.out.println(str2 == "hello"); //false
    str2 = str1;
    System.out.println(str2 == "hello"); //true
    

    如何将字符串反转?

    使用 StringBuilder 或者 stringBuffer 的 reverse() 方法。

    示例代码:

    // StringBuffer reverse
    StringBuffer stringBuffer = new StringBuffer();
    stringBuffer. append("abcdefg");
    System. out. println(stringBuffer. reverse()); // gfedcba
    // StringBuilder reverse
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder. append("abcdefg");
    System. out. println(stringBuilder. reverse()); // gfedcba
    

    数组有没有 length()方法?String 有没有 length()方法

    数组没有 length()方法 ,有 length 的属性。String 有 length()方法。JavaScript中,获得字符串的长度是通过 length 属性得到的,这一点容易和 Java 混淆。

    String 类的常用方法都有那些?

    • indexOf():返回指定字符的索引。
    • charAt():返回指定索引处的字符。
    • replace():字符串替换。
    • trim():去除字符串两端空白。
    • split():分割字符串,返回一个分割后的字符串数组。
    • getBytes():返回字符串的 byte 类型数组。
    • length():返回字符串长度。
    • toLowerCase():将字符串转成小写字母。
    • toUpperCase():将字符串转成大写字符。
    • substring():截取字符串。
    • equals():字符串比较。

    在使用 HashMap 的时候,用 String 做 key 有什么好处?

    HashMap 内部实现是通过 key 的 hashcode 来确定 value 的存储位置,因为字符串是不可变的,所以当创建字符串时,它的 hashcode 被缓存下来,不需要再次计算,所以相比于其他对象更快。

    String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的

    可变性

    String类中使用字符数组保存字符串,private final char value[],所以string对象是不可变的。StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,char[] value,这两种对象都是可变的。

    线程安全性

    String中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。

    性能

    每次对String 类型进行改变的时候,都会生成一个新的String对象,然后将指针指向新的String 对象。StringBuffer每次都会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用StirngBuilder 相比使用StringBuffer 仅能获得10%~15% 左右的性能提升,但却要冒多线程不安全的风险。

    对于三者使用的总结

    如果要操作少量的数据用 = String

    单线程操作字符串缓冲区 下操作大量数据 = StringBuilder

    多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

    Date相关

    包装类相关

    自动装箱与拆箱

    装箱:将基本类型用它们对应的引用类型包装起来;

    拆箱:将包装类型转换为基本数据类型;

    int 和 Integer 有什么区别

    Java 是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java 为每一个基本数据类型都引入了对应的包装类型(wrapper class),int 的包装类就是 Integer,从 Java 5 开始引入了自动装箱/拆箱机制,使得二者可以相互转换。

    Java 为每个原始类型提供了包装类型:

    原始类型: boolean,char,byte,short,int,long,float,double

    包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double

    Integer a= 127 与 Integer b = 127相等吗

    对于对象引用类型:==比较的是对象的内存地址。
    对于基本数据类型:==比较的是值。

    如果整型字面量的值在-128到127之间,那么自动装箱时不会new新的Integer对象,而是直接引用常量池中的Integer对象,超过范围 a1==b1的结果是false

    public static void main(String[] args) {
        Integer a = new Integer(3);
        Integer b = 3;  // 将3自动装箱成Integer类型
        int c = 3;
        System.out.println(a == b); // false 两个引用没有引用同一对象
        System.out.println(a == c); // true a自动拆箱成int类型再和c比较
        System.out.println(b == c); // true
    
        Integer a1 = 128;
        Integer b1 = 128;
        System.out.println(a1 == b1); // false
    
        Integer a2 = 127;
        Integer b2 = 127;
        System.out.println(a2 == b2); // true
    }
    

    常用工具类库

    单元测试

    日志

    展开全文
  • Java知识体系最强总结(2021版)

    万次阅读 多人点赞 2019-12-18 10:09:56
    本人从事Java开发已多年,平时记录问题解决方案和总结知识点的习惯,整理了一些有关Java的知识体系,这不是最终版,会不定期的更新。也算是记录自己在从事编程工作的成长足迹,通过博客可以促进博主与阅读者的共同...
  • Java面试题大全(2020版)

    万次阅读 多人点赞 2019-11-26 11:59:06
    发现网上很多Java面试题都没有答案,所以花了很长时间搜集...1. JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。 JRE:Java Runtime Environ...
  • R730服务器有两个电源,可设置哪个为主电源,哪个为备用电源。 也就是说分别给这两个电源供电,一个是市电,一个是UPS,它自己内部是首选哪个电源做为自身电源供电的。 1、在idrac setting选项中设置。 开机按F2...
  • 前言(废话):最近导师刚给配置了一台E5GPU(GTX1080Ti 11g)的服务器,由于一些原因导师将原装的两根32G内存(三星)条拿走放在另外一台正在使用的工作站上,并将替换下的一个16G内存条(英睿达镁光 DDR4 2400 16G...
  • 网上二手服务器能做家用电脑吗?

    千次阅读 2019-05-16 15:22:15
    最近想配置一台电脑,八年前的那台老电脑已经无法胜任我现在的工作了。在网上荡了很久,终于看见一款电脑甚合我意。是某宝上卖的一款服务器!...服务器是统称,常见的分为两种,一种是双路服务器,一种是单路服务器...
  • Wireshark学习

    千次阅读 多人点赞 2020-01-31 14:00:32
    3)在LAN交换机上配置两端口镜像,将连接服务器双网卡的两个物理机端口流量同时镜像给Wireshark主机的网卡。 还有一个问题: 在负载共享抓包模式下抓包,若进出服务器流量过高,采用方法1,将会把两块网卡...
  • 各种CPU核心都具有固定的逻辑结构,一级缓存、二级缓存、执行单元、指令级单元和总线接口等逻辑单元都会科学的布局。 cpu,就是处理器多了1个。 2个cpu优势: 1.内存插槽超级多,一般都可以上64gb或者更大...
  • CentOS6 双线ip服务器路由设置方法

    千次阅读 2019-03-01 10:11:37
    服务器双线由教育网和电信网,实现通过不同的路线过来的用户按原来的返回数据。 操作系统:CentOS 6.4 网卡0(教育网):IP:10.10.10.10 掩码:255.255.255.0 网关:10.10.10.1 网卡1(电信网):IP:192....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 66,649
精华内容 26,659
关键字:

双路服务器有什么用