面经分享总结-20190818

RPC框架和普通http有什么区别和优势? 基于Tcp封装还是http封装的

rpc是长连接吗?如果要传输一个特别大的文件 底层还是基于流吗? Nio是一个什么IO模型?

异常和error的区别,oom是error还是异常?什么东西分配在堆上和栈上?

只对堆进行gc 这句话对不对 调用system.gc()马上就执行gc吗


 

RPC框架和普通http有什么区别和优势? 基于Tcp封装还是http封装的

RPC(即Remote Procedure Call,远程过程调用)主要是基于TCP/IP协议的,而HTTP服务(HyperText Transfer Protocol,超文本传输协议)主要是基于HTTP协议的(HTTP协议是在传输层协议TCP之上的)。

一个完整的RPC架构里面包含了四个核心的组件,分别是Client ,Server,Client Stub以及Server Stub,这个Stub大家可以理解为存根。分别说说这几个组件:

  • 客户端(Client),服务的调用方;

  • 服务端(Server),真正的服务提供者;

  • 客户端存根,存放服务端的地址消息,再将客户端的请求参数打包成网络消息,然后通过网络远程发送给服务方;

  • 服务端存根,接收客户端发送过来的消息,将消息解包,并调用本地的方法;

  • HTTP ,RESTful 优点:就是简单、直接、开发方便。利用现成的http协议进行传输。

  • RPC 的优点:内部子系统较多、接口非常多的情况下,RPC框架的好处首先就是长链接,不必每次通信都要像http一样去3次握手什么的,减少了网络开销;其次就是RPC框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。

rpc是长连接吗?如果要传输一个特别大的文件 底层还是基于流吗? Nio是一个什么IO模型?

RPC 是长连接,基于流,

传统 IO:为每一个连接创建一个线程,当连接数过多的时候,内存和 CPU 开销大.阻塞会带来频繁的上下文切换.
非阻塞NIO:

1. 由一个专门的线程来处理所有的 IO 事件,并负责分发。 
2. 事件驱动机制:事件到的时候触发,而不是同步的去监视事件。 
3. 线程通讯:线程之间通过 wait,notify 等方式通讯。保证每次上下文切换都是有意义的。减少无谓的线程切换。 

Java NIO的服务端只需启动一个专门的线程来处理所有的 IO 事件,java NIO采用了双向通道(channel)进行数据传输,而不是单向的流(stream),在通道上可以注册我们感兴趣的事件。

服务端和客户端各自维护一个管理通道的对象,我们称之为selector,该对象能检测一个或多个通道 (channel) 上的事件。我们以服务端为例,如果服务端的selector上注册了读事件,某时刻客户端给服务端发送了一些数据,阻塞I/O这时会调用read()方法阻塞地读取数据,而NIO的服务端会在selector中添加一个读事件。服务端的处理线程会轮询地访问selector,如果访问selector时发现有感兴趣的事件到达,则处理这些事件,如果没有感兴趣的事件到达,则处理线程会一直阻塞直到感兴趣的事件到达为止。下面是我理解的java NIO的通信模型示意图:

 

面经分享总结-20190818_第1张图片

异常和error的区别,oom是error还是异常?什么东西分配在堆上和栈上?

error 是系统内部级别的错误,程序不必处理,Java 内部错误和硬件问题. 内存不足,系统崩溃, 虚拟机错误等, 出了错误没有办法,只有退出.oom 是 error.

异常表示需要捕捉和处理的异常, 主要是因为程序瑕疵和外在输入等问题导致的, 程序必须处理.异常又分为受检查异常和运行时异常.

运行时异常:无法让程序恢复的异常,一般是执行了错误的操作,编译器不检查这类异常.

受检查异常:可处理的异常,程序可以修复.

主要区别在于处理方式:检查型异常都需要使用 try,catch 和 finally 关键字在编译器进行处理, 否则会出现编译器报错。对于非检查型异常则不需要这样做。java 中所有继承 Exception 的类的异常都是检查型异常,所有继承 RuntimeException 的异常都被称为非检查型异常。

堆上:几乎所有的实例对象都分配在堆上.

栈上:每个方法被执行的时候,都会创建一个栈帧用来存放局部变量表,操作数栈,动态链接和方法出口等信息.

只对堆进行gc 这句话对不对 调用system.gc()马上就执行gc吗

此函数system.gc()建议JVM进行主GC,虽然只是建议而非一定,但很多情况下它会触发主GC,从而增加主GC的频率,也即增加了间歇性停顿的次数

缺页中断 分页地址转换 内存抖动

缺页中断:程序运行过程中,要访问的页面不在内存当中,就会发生缺页中断将页面加入到内存中.如果内存无空闲,必须从内存中调出一个页面用来置换该页面.因此与缓存原理类似,产生了页面置换算法.主要目的是降低缺页率.

分页地址转换:内存管理单元(MMU)管理着地址空间和物理内存的转换,其中的页表(Page table)存储着页(程序地址空间)和 页框(物理内存空间)的映射表。一个虚拟地址分成两个部分,一部分存储页面号,一部分存储偏移量。

内存抖动:内存频繁的分配和回收,频繁的gc会导致UI卡顿,严重的时候导致out of memory error.

 

 

你可能感兴趣的:(面经分享总结-20190818)