《码出高效:Java 开发手册》技术笔记

前言

《java开发手册》这本书是一本由阿里巴巴公司的开发工程师们编写的技术书籍,
相比于其他编程书籍,本书更为贴近一些共通的知识而非实际的代码,对开发工程师的综合素质有显著的提升,本书共有九章,笔者计划用八篇文章去记录读这本书的一些心得和体会

正文

首先是第一章,这章内容主要是讲一些基础的计算机知识,包括浮点数,网络协议,网络安全知识,这些都是和日常开发非常相关的一些东西

二进制的加减法

计算机基本是0和1,二进制,具体就是一条电路,具有高低电平两种状态,日常说的32位机器,就是2的32次方-1个状态;表示负数时就是最左一位为符号位,0正1负,那么最大就是01111111,换算就是127
同时二进制数运算时用补码,正数的原反补码三者相同,而负数补码等于反码+1,这样底层减法也能当加法算,减少运算器消耗

位移运算

位移运算在开发中可以见到,通常是用于进行乘除2的n次方时,进行快速操作,底层操作是:右移n位时把这个数对应的补码最右边抹去n位,最左分为两种情况:负数补1,正数补0,左移同理
有符号位移运算
无符号位移运算
这里连续三个>就是无符号

其他位运算

还有一些位运算就是按位与,按位取反 ( 符号为~)、按位与(符号为 &) 、接位或(符号为|)、接位异或等运算
按位与:比如获取网段值,IP地址与掩码255.255.255.0进行按位与运算得到高24位,即为当前ip的网段,底层就是换成二进制进行与运算
逻辑与:&& ,有短路功能,左为false直接退出
逻辑或:同逻辑与,左为true直接退出
异或:无短路功能,左右不同为1,否则为0

浮点数

浮点数是相对于定点数来说的,定点就是确定小数点的位置,由此确定整数和小数部分
浮点数则是由科学计数法表示的,由符号位,有效数字,指数三部分组成,这点高中数学有讲
目前常用的就是单双精度浮点数
单精度:4字节,32位,底层如图
在这里插入图片描述在计算机学中,指数叫阶码,有效数字叫尾数
符号位很简单:0正1负
阶码其实是移码, [x ] 移 = x+(2^n-1)(n 为 x的二进制位数,含符号位)
尾数很简单,就是原码

浮点数使用

使用时推荐使用双精度,单精度容易出问题
在这里插入图片描述

在这里插入图片描述
如金融行业的货币表示,推荐使用整型存储其最小单位的值,人民币的分,美元的美分,用时再换算
如圆周率要求存储小数点后 1000 位数字,使用单双精度难以保存,推荐使用数组存小数部分
在比较浮点数时,由于存在误差,所以禁止通过判断两个浮点数是否相等来控制某些业务流程
数据库使用decimal,禁止使用单双浮点

字符集与乱码

01如何表示文字,是英文字母,那么就是大小写52个,加上一些特殊字符,也就是 ASCII码
其中有一个特殊的换行符
unix中是\n,
windows :\r\n
旧macos:\r
新macos:\n
而汉字的个数远远超过英文字符的个数
GB2312:6712
GBK :支持繁体,兼容gb2312
GB18030:为gbk超集并兼容gbk
unicode:规定了所有语言的字符,实现 Unicode 的编码格式有三种 , UTF-8 、 UTF-16 、 UTF -
32
实际开发中,为了避免乱码,服务器级别、 schema 级、表级别乃至列级别应该规定一致的编码

Cpu与内存

Cpu是一块高精密度集成电路板,承载运算和控制,执行指令功能,是编程的中心,通常与内存的关系非常紧密;其主要组成是控制器和运算器,由寄存器对这两者进行协调如下图为cpu内部逻辑结构
在这里插入图片描述
控制器:类似一个编译器,其中
控制单元主要控制时序和指令
指令译码器:在控制单元智慧下读取分析指令,交由运算器执行
指令寄存器:存储指令集
运算器:ALU:算逻运算单元,运算器核心
运算器执行01的计算
寄存器:高速缓存L1L2,远小于内存空间,成本也非常高
部分处理器也有L3缓存
相比C++可以malloc操作内存,java都交给jvm操作内存,也就是垃圾回收

TCP/IP

网络协议

这里讲到网络协议,计算机之间需要网络连接,而网络协议就是规则,各方遵守规则就可以互相交流
包括HTTP, HTTPS、 FTP 、SMTP 、 UDP, ARP 、 PPP 、 IEEE 802.x等协议
TCP/IP协议也叫传输控制协议,是一个以TCPIP为核心的协议族
它对网络分层是4层
链路层:以字节为单位对01分组做为数据,添加源和目标机器的物理地址,校验位,封成一个包传输
在这里插入图片描述
网络层:根据ip定义网络地址,区分网段;子网内用ARP协议进行mac寻址,子网外通过路由转发ip数据包
传输层:数据包到了目标计算机后,在传输层进行确认并交给应用程序,这里一般是TCP和UDP协议
应用层:传输层信息到了应用程序后,进行解读,通常有一个固定格式

IP协议

计算机有mac地址进行区分,但这样很多计算机,找到过于费时,所以有ip地址进行分段分层的管理,就类似于快递分省市县层层分发,最后快递员喊小区的人取快递
IP地址属于网络层,在wlan内进行路由寻址,长度32位4个字节,掩码用来区分子网,下图为ip协议格式,注意不是ip地址格式
在这里插入图片描述
TTL:数据包的生存时间,代表可经过路由器数,经过一个自减一,为0时,数据包被丢弃并通知源主机
ICMP:一个检测网络通畅,主机可达性的协议,ping,tracert这些命令就是基于ICMP的检测网络状态的工具

TCP建立连接

TCP,又称传输控制协议,它是面向连接、确保数据在端到端间可靠传输的协议
面向连接是指传输前先建立一条信道
可靠是指要确认发出字节的编号,校验数据包的有效性,超时重传,滑动窗口,拥塞控制等等
TCP报文格式
服务端和客户端:tcp的面向连接由这两个端实现,首先需要服务端在特定端口监听,然后客户端发送
SYN :用作建立连接时的同步信号
ACK: 用于对收到的数据进行确认,所确认的数据由确认序列号表示;
FIN :表示后面没有数据需要发送,通常意昧着所建立的连接需要关闭了。
三次挥手:这个概念是计网基础概念了
A 机器发出一个数据包并将 SYN 置 l ,表示希望建立连接。这个包中的序列
号假设是 x 。
B 机器收到 数据包后,通过 SYN 得知这是一个建立连接的请求,于是发送一个响应包并将 SYN 和 ACK 标记都置 l 。假设这个包中的序列号是 y ,而确认序列号必须是 x+l ,表示收到了 A 发过来的 SYN
A 收到 B 的响应包后需进行确认,确认包中将 ACK 置 l ,并将确认序列号
设置为 y+ l ,表示收到了来自 B 的 SYN
在这里插入图片描述
三次握手的原因很好理解,这张图就可以解释
在这里插入图片描述只有三次后才能确认这八种能力,后续传输才能不出问题
还有一个就是两次就会产生脏连接,因为报文存活时间是大于tcp连接时间的
在这里插入图片描述从底层看,tcp连接通过fd文件描述符完成,linux中,很多资源都是通过fd数描述
在协议层面,可以keep-alive,也就是定时发送数据包,表示健康状态,通常也可在应用层发送心跳包检查健康

TCP断开连接

作为一种全双工连接,tcp连接需要四次握手
在这里插入图片描述
第一步:A 想要关闭连接,待本方数据发送完毕后,传递 FIN 信号给 B。
第二步:B 应答 ACK ,告诉 A 可以断开,但是需要等 B 处理完数据,再主动给 A 发送 FIN 信号。这时, A 处于半关闭状态( FIN WAIT 2 ),无法再发送新的数据。
第三步:B 做好连接关闭前的准备工作后,发送 FIN 给 A ,此时B 机器也进入半关闭状态( CLOSE_WAIT )。
第四步A 发送针对 B FIN 的 ACK 后,进入 TIME - WAIT 状态,经过 2MSL ( Maximum Segment Lifetime )后,没有收到 B传来的报文,确定 B 已经收到 A 机器最后发送的 ACK 指令,此时 TCP连接正式释放。

TIME WAIT 和 CLOSE WAIT在实际业务中是优化的两个重点,参数设置不当会对服务器造成大量负载

连接池

对于大量的连接,频繁创建断开会加重负载,这时就用连接池来重复利用连接,
RPC 服务集群的注册中心与服务提供方、消费方之间,消息服务集群的缓存服务器和消费者服务器之间,应用后台服务器和数据库之间,都会使用连接池来提升性能。
比较常用的就是数据库层面连接池,以druid为例子,主要是连接数min和max的设置,如果 MIN 过小,可能会出现过多请求排队等待获取连接,如果 MIN 过大,会造成资源浪费。如果 MAX 过小,则峰值情况下仍有很多请求处于等待状态;如果MAX 过大,可能导致数据库连接被占满,大量请求超时,进而影响其他应用,引发服务器连环雪崩。
这里还提到了数据库的优化手段:
高效且合适的索引
排查连接资源未显式关闭的情形
合并短的请求
合理拆分多个表 join 的SQL ,若超过三个表则禁止 join
使用临时表
应用层优化。 包括进行数据结构优化、并发多线程改造等
改用其他数据库。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值