您好,欢迎访问三七文档
1.下列说法中错误的是A.Java语言是编译执行的B.Java中使用了多进程技术C.Java的单行注视以//开头D.Java语言具有很高的安全性2.一个int类型的常量和一个byte类型常量做减法结果的类型是A.intB.byteC.charD.float3.用final声明属性、方法和类时被声明的属性、方法和类表现出哪些特性下面的实例正确吗?如果不正确请说明原因实例finalTestt=newTest();t.setName(“Jack”);4.现有如下2个语句块try{System.ext(0);}catch(….){}finally{}请问该语句能否执行到finally语句块中5.写一个单例模式?描述工厂模式和单例优缺点举例在什么情况下用6.线程同步的关键字是什么?sleep()和wait()有什么区别?怎么唤醒wait()停止的线程?7.使用Socket编写一个程序,客户端向服务器端发送请求(发送字符串即可),服务端接收后发送反馈信息.8.为什么TCP会粘包,如何应对9.在IM通信中如何解决丢包问题?10.描述4至5以往项目中遇到的问题及解决方法。11.描述Linux服务器如何一步步调优。12.描述以往服务器压力测试情况,及测试工具测试方法。1-4题考察基本基础知识5题考察对Java设计模式基本知识6-8题考察网络编程基础知识9-12题考察项目实战经验答案:1.AB2.A3.final用于声明属性方法和类分别表示属性不可变方法不可覆盖类不可继承。正确因为setName是方法可以通过方法改变类的属性。4.不会。5.sleep()方法:线程主动放弃CPU,使得线程在指定的时间内进入阻塞状态,不能得到CPU时间,指定的时间一过,线程重新进入可执行状态。典型地,sleep()被用在等待某个资源就绪的情形:测试发现条件不满足后,让线程阻塞一段时间后重新测试,直到条件满足为止。wait():与notify()配套使用,wait()使得线程进入阻塞状态,它有两种形式,一种允许指定以毫秒为单位的一段时间作为参数,另一种没有参数,当指定时间参数时对应的notify()被调用或者超出指定时间时线程重新进入可执行状态,后者则必须对应的notify()被调用。6.7.为什么TCP会粘包前几天,调试mina的TCP通信,第一个协议包解析正常,第二个数据包不完整。为什么会这样吗,我们用mina这样通信框架,还会出现这种问题?带者问题,我们先分析一下问题。提到通信,我们面临都通信协议,数据协议的选择。通信协议我们可选择TCP/UDP:TCP(transportcontrolprotocol,传输控制协议)是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包。这样,接收端,就难于分辨出来了,必须提供科学的拆包机制。即面向流的通信是无消息保护边界的。UDP(userdatagramprotocol,用户数据报协议)是无连接的,面向消息的,提供高效率服务。不会使用块的合并优化算法,,由于UDP支持的是一对多的模式,所以接收端的skbuff(套接字缓冲区)采用了链式结构来记录每一个到达的UDP包,在每个UDP包中就有了消息头(消息来源地址,端口等信息),这样,对于接收端来说,就容易进行区分处理了。即面向消息的通信是有消息保护边界的。由于TCP无消息保护边界,需要在消息接收端处理消息边界问题。也就是为什么我们以前使用UDP没有此问题。反而使用TCP后,出现少包的现象。粘包的分析上面说了原理,但可能有人使用TCP通信会出现多包/少包,而一些人不会。那么我们具体分析一下,少包,多包的情况。正常情况,发送及时每消息发送,接收也不繁忙,及时处理掉消息。像UDP一样.发送粘包,多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包.这种情况和客户端处理繁忙,接收缓存区积压,用户一次从接收缓存区多个数据包的接收端处理一样。发送粘包或接收缓存区积压,但用户缓冲区大于接收缓存区数据包总大小。此时需要考虑处理一次处理多数据包的情况,但每个数据包都是完整的。发送粘包或接收缓存区积压,用户缓存区是数据包大小的整数倍。此时需要考虑处理一次处理多数据包的情况,但每个数据包都是完整的。发送粘包或接收缓存区积压,用户缓存区不是数据包大小的整数倍。此时需要考虑处理一次处理多数据包的情况,同时也需要考虑数据包不完整。我们的情况就属于最后一种,发生了数据包不完整的情况。啰嗦了这么多,总结一下,就两种情况下会发生粘包。1.发送端需要等缓冲区满才发送出去,造成粘包2.接收方不及时接收缓冲区的包,造成多个包接收如何应对先卖个关子,不是所有的粘包都需要处理。我们先列举一下,免得在编码过程中,因为知道了粘包的情况下,都处理粘包。1.连续的数据流不需要处理。如一个在线视频,它是一个连续不断的流,不需要考虑分包。2.每发一个消息,建一次连接的情况。3.发送端使用了TCP强制数据立即传送的操作指令push。4.UDP,前面已说明白了。在这在强调一下,UDP不需要处理,免的忘记了。如果用socket编写编程的话,我就不多说我,可参考下面的资料:Grizzly:第二章的样例:解析收到的消息。xSocket:第18节。Netty:的API文档。Netty抽象了一个“消息桢解码器”的类来处理这些。Mina2:Mina2:如果En文不好的话,可参考。它在判断包是否完整时,有个小缺陷,它没使用IOBuffer的prefixedDataAvailable。但注释写的比较好。把官网上的代码,也在这展示一下。publicclassImageResponseDecoderextendsCumulativeProtocolDecoder{/***返回值的解释:*1、false,继续接收下一批数据,有两种情形,如缓冲区数据刚刚就是一个完整消息,或不够一条消息时。如果不够一条消息,那么会将下一批数据和剩余消息进行合并*2、true,当缓冲区的消息多于一条消息时,剩余消息会再会推送至doDecode*/protectedbooleandoDecode(IoSessionsession,IoBufferin,ProtocolDecoderOutputout)throwsException{//发送数据时,头四个字节记录了消息的长度。此方法会读四个字节,并和实现流长度对比。返回前,将流reset.if(in.prefixedDataAvailable(4)){intlength=in.getInt();byte[]bytes=newbyte[length];in.get(bytes);ByteArrayInputStreambais=newByteArrayInputStream(bytes);BufferedImageimage=ImageIO.read(bais);out.write(image);returntrue;//如果读取内容后还粘了包,系统会自动处理。}else{returnfalse;//继续接收数据,以待数据完整}}}再总结一下处理流程:就发送数据时,包开始写入消息长度n,当接收到的缓存区数据m,各处理流程如下:1)若nm,则表明数据流包含多包数据,从其头部截取n个字节存入临时缓冲区,剩余部分数据依此继续循环处理,直至结束。或nm2)若n=m,则表明数据流内容恰好是一完整结构数据,直接将其存入临时缓冲区即可。3)若nm,则表明数据流内容尚不够构成一完整结构数据,需留待与下一包数据合并后再行处理
本文标题:Java面试题
链接地址:https://www.777doc.com/doc-2879164 .html