摘要:
- TCP和UDP的区别
- HTTP和HTTPS的区别
- 说说你对HTTP的理解
- Java是如何实现GC操作的?
- JVM你了解多少?
- int一定占4个字节吗?
- float的精度是多少?
- 性能优化包括哪几个方面?
- 怎么实现对
ListView
或RecyclerView
列表的性能优化?
问题一
- TCP提供可靠的通信
- TCP面向连接的通信
- TCP具备顺序控制、重发控制等机制
- TCP是一对一的连接,不适合用于广播
- TCP发送数据包后,长时间收不到应答,会重新发送
- TCP发送和接收数据库,会对数据包进行校验
- UDP是不可靠的数据报协议
- UDP应用于广播和多播的环境中
- UDP不具备丢包重发的功能
- UDP不保证数据包一定收到
问题二
- http 是无状态的超文本传输协议
- http 分为请求报文和响应报文
- http 报文包括:头部字段、主体内容
- http 增加Cookies技术,管理请求状态和响应状态
- http 包括http1.0、http1.1和http2.0
- http 1.1增加了持久连接,避免TCP频繁建立、断开造成性能的开销
- http 1.0部分支持持久连接
- http 1.1新增的请求方法有:Connection、Trace、Options
- http 常用的请求方法:Get、Post、Put、Delete、Head
- http 增加管线化技术,可以同时发送多个请求,同时接收多个响应
- https 是安全的超文本传输协议
- https 由http+ssl协议组成
- https 向服务器获取Ca证书,客户端使用公钥加密数据,服务端使用私钥解密数据
- https 请求过程增加了数据加解密过程,速度相比http会慢一些
- http和https是两种不同的协议,http默认端口号80,https默认端口号443
- https 在传输层和应用层之间增加了SSL协议
- https 加密的方式分为:对称密钥加密、非对称密钥加密。对称密钥加密,发送方和接收方使用同一个密钥加密、解密;非对称密钥加密,发送方使用服务器返回的公钥加密,服务端使用私钥解密
- https 可能会被Fiddler或Charles抓包工具拦截,伪造Ca证书,获取或篡改传输过程中的数据
https就是用来解决Http存在的缺陷:
- 通信使用明文,内容可能会被窃听
- 不验证通信方的身份,有可能遭遇伪装
- 无法证明报文的完整性,也可能已遭纂改
问题三
- http 无状态的协议,客户端和服务端不记录状态
- http 客户端和服务端以明文的方式传输数据
- http 属于应用层上的协议
- http 包括请求报文和响应报文
- http 有http 1.0、http 1.1和http 2.0多个版本
- http 1.1和一部分的http 1.0引入了持久连接的功能,降低TCP建立和断开的开销
- http 1.1新增的请求方法有:Options、Trace和Connection
- http 1.1新增管线化技术,可以同时发送多个请求,同时处理多个响应
- Cookie 技术方便管理请求和响应的状态
- http 常用的请求头有:
Content-Type
、Content-Length
、Content-Encoding
、Connection
问题四
Java虚拟机不固定什么时候执行GC操作,不固定回收哪些对象,GC的操作有JVM在合适的时机触发,比如:内存资源不足,某个对象占据较大内存,某些对象不再被引用等,《深入Java虚拟机》这本书介绍了垃圾收集的几种算法,每一种算法对应一种收集器,程序员在编码的时候,编写符合垃圾收集算法的程序,提高内存的利用率。
- 跟踪收集器。以某个活动的对象为追踪的根节点,追踪过程遇到的对象以某种方式打上标记,没有被标记的对象被释放。
- 引用计数收集器。堆中的每个对象都有一个引用计数,一个对象被创建,将这个对象的引用赋值给一个变量,这个引用计数置为1,其他任何变量被赋值为这个对象的引用,计数加1。当对象的引用超过它的生命周期或被设置为一个新的值时,计数减1。计数为0的对象可以被当做垃圾收集。缺点:每次引用计数加1或减1,都会带来额外的开销。
- 压缩收集器。内存在分配过程会产生大量的“堆碎块”,压缩收集器会快速地移动对象减少“堆碎块”,将对象移动到一端,释放出一整块较大内存。缺点:更新被移动对象的引用,指向一个对象句柄,对象句柄才指向堆中对象的实际地址,每一次对象的访问都会带来性能的损失。
- 拷贝收集器。活动的对象移动到一个新区域,拷贝的过程,将对象紧凑排列,这样清除了旧区域对象间的空隙,同时旧区域变为空闲区域。缺点:堆内存被划分为两个区域,任何时候都只能使用其中一个区域,指定的堆大小需要是原内存的两倍,降低内存利用率。
- 按代收集的收集器。将对象分为:年幼代,年青代,年中代,年老代,永久代,年幼代进行最频繁的垃圾收集,没有被收集的对象移动到下一代,经过好几次垃圾收集仍然存活,这个对象成为寿命更高的一代。优点:提高了最基本的垃圾收集算法的性能。
- 自适应收集器。可以自由选择一种或多种垃圾收集算法在具体合适的场景中使用,更灵活、更充分发挥每种算法的优势。
- 火车算法。将不活动的对象分配到一节节的车厢中,每次只收集一小部分,时间更快,影响更小,避免破坏性的垃圾收集,消除用户可觉察到的垃圾收集停顿。
问题五
1、了解类加载的过程,分为几个阶段:加载、验证、准备、解析、初始化:
- 加载,根据类的全限定名获取这个类的二进制字节流,将二进制字节流中的静态存储结构转换成方法区中的运行时数据结构,同时在内存中创建代表这个类的
java.lang.Class
对象,作为这个类的各种数据的访问入口 - 验证,验证Class文件的字节流包含的信息是否符合虚拟机的要求,至少不会危害虚拟机自身的安全。包括:文件格式的验证,元数据的验证,字节码验证和符号引用验证。
- 准备,正式为类变量分配内存并设置类变量的初始值。
- 解析,这是虚拟机将常量池中的符号引用替换成直接引用的过程。
- 初始化,当遇到
new
、getStatic
、putStatic
、invokeStatic
这4条字节码指令时,会触发类的初始化;当使用java.lang.reflect
包的方法对类进行反射调用时,会触发类的初始化;当初始化一个类,优先初始化起父类;虚拟机启动时,作为程序入口的主类会被初始化;
2、了解类和类的加载器,双亲委派模型,保证类只会被加载一次:用到的类加载器有启动类加载器(BootStrap ClassLoader)、Ext ClassLoader、Application ClassLoader、Custom ClassLoader,除了BootStrap ClassLoader没有父类加载器外,其他加载器都有父类加载器。BootStrap ClassLoader加载<JAVA_HOME>/lib
类库,Ext ClassLoader加载 <JAVA_HOME>/lib/ext
类库。
双亲委派模型的工作过程:如果一个类加载器接收到加载一个类的请求,它首先不会自己去加载,而是把这个请求委托给父类加载器,父类加载器还存在父类,依次委托父类加载,如果父类无法加载处理这个类,依次交由子类加载器处理。
3、了解Java内存模型:线程独享工作内存,共享主内存,工作内存对应于虚拟机栈中的部分区域,主内存对应于堆的对象实例数据部分。
问题六
一个int在32位编译器的虚拟机最小占2个字节,最多占4个字节;一个int在64位编译器的虚拟机中占4个字节。每一个编译器可以根据硬件的情况自由决定数据类型占的字节数,short和int最小2个字节,最多4个字节,同时short占的字节数不能大于int,int占的字节数不能大于long
问题七
一个float类型有:符号位(1位)、指数位(8位)和尾数位(23位)组成,它的精度由尾数位决定,即2^23 = 8388608
,精度为6~7位有效数字;指数取值范围:-2^7-1~2^7=-127~128
问题八
性能优化包括:绘制优化、apk大小优化、内存优化、存储优化。详情查看《性能优化》
问题九
列表优化包括如下几个方面:
- 绘制优化,减少item的嵌套层级,推荐使用ConstraintLayout
- 绘制优化,避免item过度绘制,将嵌套的控件背景设为透明
- 绘制优化,固定item的高度,缓存初始化的item,避免每次重新创建item,测量item造成的性能开销
- 在
onBindViewHolder
、getView
较少逻辑判断,避免创建大量临时的对象,避免垃圾回收器频繁地回收造成列表卡顿 - 使用RecyclerView,支持插入、删除、移动操作的局部刷新,推荐使用刷新方法
notifyItemInserted
、notifyItemReMoved
、notifyItemMoved
、notifyItemChanged
附件
报文组合部分:
首部字段组成部分:
你可能感兴趣的文章
转载请注明出处: https://www.teachcourse.cn/2753.html ,谢谢支持!