程序员必备知识点

程序员必备知识点

1、tcp 三次握手,四次挥手

为什么连接的时候是三次握手,关闭的时候却是四次握手?

image-20200928193010926

image-20200928193246073

原文链接:https://blog.csdn.net/whuslei/article/details/6667471

2、tcp 拆包、粘包问题。

应用程序写入的数据大于套接字缓冲区大小,这将会发生拆包。

应用程序写入数据小于套接字缓冲区大小,网卡将应用多次写入的数据发送到网络上,这将会发生粘包。

进行MSS(最大报文长度)大小的TCP分段,当TCP报文长度-TCP头部长度>MSS的时候将发生拆包。

接收方法不及时读取套接字缓冲区数据,这将发生粘包。

粘包、拆包解决办法

TCP本身是面向流的,作为网络服务器,如何从这源源不断涌来的数据流中拆分出或者合并出有意义的信息呢?通常会有以下一些常用的方法:

1、发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度,这样接收端在接收到数据后,通过读取包首部的长度字段,便知道每一个数据包的实际长度了。

2、发送端将每个数据包封装为固定长度(不够的可以通过补0填充),这样接收端每次从接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。

3、可以在数据包之间设置边界,如添加特殊符号,这样,接收端通过这个边界就可以将不同的数据包拆分开。

3、linux io 类型。

4、线程reactor 模型。

5、redis 分布式锁

6、sortSet 排序时间复杂度,及常用命令

Java基础

ArrayList源码

HashMap源码

ConcurrentHashMap源码

线程池ThreadPool

synthronized, volatile, Lock的使用和区别

NIO实现

工厂,代理,单例模式(单例模式多线程问题)

cglib与proxy的使用和区别

Java可重入锁和读写锁

JVM内存模型

JVM GC机制和相关算法

JVM类的加载

JVM性能调优的大体步骤

CAS算法

一致性Hash

arrayList底层结构,linkedList底层结构,两者的区别(RandomAccess)

hashmap底层结构(java8版本),concurrentHashMap(java8版本)、hashTable,三兄弟对比下吧?

nio和bio相比有啥不同(aio呢)

jvm内存划分(java8版本呢?),堆的划分(系统遇到瓶颈,确定是JVM引起,怎么调优,说下具体做法)

成员变量、局部变量等等的会分配到jvm的哪块儿区域

mysql的引擎知道哪些,有啥区别

乐观锁、悲观锁

索引相关的(btree、失效、组合索引的最左分配原则、explain使用)

线程池相关

volitatle关键字

lock的读写、中断、自旋

对threadLocal的理解

序列化、反序列化(一个已经实现Serializable的类,新增个属性,怎样让程序直接报错)

servlet是否线程安全(为什么你认为是/否)

对dubbo的理解(画下provider、consumer、注册中心、监控的关系)

consumer1次调用provider,在dubbo内部各模块运转的流程

谈谈你对mq的理解(你用的activemq,那kafka与之对比,有啥优势呢)

maven中install、package命令的区别

用过哪些设计模式,单例的懒汉、饿汉、线程安全的懒汉、最好的线程安全懒汉实现?

int的位数

1.字节:byte:用来计量存储容量的一种计量单位;位:bit

2.一个字节等于8位 1byte = 8bit

char占用的是2个字节 16位,所以一个char类型的可以存储一个汉字。

整型:

byte:1个字节 8位 -128~127

short :2个字节 16位

int :4个字节 32位

long:8个字节 64位

浮点型:

float:4个字节 32 位

double :8个字节 64位

注:默认的是double类型,如3.14是double类型的,加后缀F(3.14F)则为float类型的。

char类型:

char:2个字节。

Boolean 类型

boolean: (true or false)(并未指明是多少字节 1字节 1位 4字节)

补充:BigInteger类实现了任意精度的整数运算,BigDecimal实现了任意精度的浮点数运算。

hashMap ConcurrentHashMap 区别,hash冲突如何解决的?

synchronized 和lock的区别,synchronized是悲观锁还是乐观锁,cas算法

https://km.sankuai.com/page/34303789

即compare and swap(比较与交换),是一种有名的无锁算法。无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(Non-blocking Synchronization)。CAS算法涉及到三个操作数

需要读写的内存值 V

进行比较的值 A

拟写入的新值 B

当且仅当 V 的值等于 A时,CAS通过原子方式用新值B来更新V的值,否则不会执行任何操作(比较和替换是一个原子操作)。一般情况下是一个自旋操作,即不断的重试。

3、谈谈threadLocal的理解、InheritableThreadLocal 、TransmittableThreadLocal 以及fastThreadLocal

参考答案:https://mlog.club/article/22197

不清楚,使用注意不清楚。

3、线程池

https://www.cnblogs.com/shijiaqi1066/p/3412300.html

构建常用的线程池不清楚,线程池核心参数不清楚 ,流程不清楚

4、请你说一下自己对于 AQS 原理的理解、

参考答案:https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/Multithread/AQS.md

5、CyclicBarrier 和 CountDownLatch 的区别

对于 CountDownLatch 来说,重点是“一个线程(多个线程)等待”,而其他的 N 个线程在完成“某件事情”之后,可以终止,也可以等待。而对于 CyclicBarrier,重点是多个线程,在任意一个线程没有完成,所有的线程都必须等待。

CountDownLatch 是计数器,线程完成一个记录一个,只不过计数不是递增而是递减,而 CyclicBarrier 更像是一个阀门,需要所有线程都到达,阀门才能打开,然后继续执行。

6、aop实现原理:动态代理、cglib,

两种实现有什么区别:基于接口、基于继承类

MyBatis中#与$的区别

jvm

1、描述下jvm内存模型

2、JVM参数Xms Xmx是如何设置的, 如果大小是一至,为什么这样设置?

参考答案:

Xmx设置JVM 的最大可用内存,Xms 设置JVM实际使用内存,一般Xmx和Xms相同,这是因为当Xmx内存空间不够用时,将进行扩容导致Full GC。将Xmx和Xms设置成相同的值,避免因Xms偏小导致频繁重新分配内存,影响应用使用。

2、有遇到过OOM么,什么情况,怎么发现的,怎么查原因的?

考察点:jstat mat工具

3、如何定位一个CPU Load过高的java线程?

top -c

top -Hp pid

printf “%x\n” pid (将pid转换16进制表示的)

定位线程堆栈 jstack 29054 | grep ‘0x1a17’ -C30 —color

redis

分布式锁:一般,只是提到加超时时间

持久化:rdb、aof,可以

AOF更安全,可将数据及时同步到文件中,但需要较多的磁盘IO,AOF文件尺寸较大,文件内容恢复相对较慢, 也更完整。

RDB持久化,安全性较差,它是正常时期数据备份及 master-slave数据同步的最佳手段,文件尺寸较小,恢复数度较快。

缓存穿透:可以

注意事项:大key

设计模式

mysql

事务隔离级别:OK,默认级别不清楚

慢查询:explain 不清楚

mysql 常见存储引警-清楚 ,聚簇索引和非聚簇索引的区别不清楚

索引最左前缀:理解,了解了

分表:分表维度理解可以

数据迁移:停服务,mq双写

怎么保证迁移后数据正确:记录数,

mvcc :同一份数据临时保留多版本的一种方式,进而实现并发控制

算法:

1、螺旋打印矩阵

https://leetcode-cn.com/problems/spiral-matrix/solution/luo-xuan-ju-zhen-by-leetcode/

2、倒叙速出

主动学习:看过什么书,印象深的点是什么?如何自我学习?

Springboot学习,大V的学习问题解决思路;自己做笔记!

文章目录
  1. 1. 程序员必备知识点
    1. 1.1. 1、tcp 三次握手,四次挥手
    2. 1.2. 2、tcp 拆包、粘包问题。
      1. 1.2.1. 粘包、拆包解决办法
  2. 2. Java基础
    1. 2.1. ArrayList源码
    2. 2.2. HashMap源码
    3. 2.3. ConcurrentHashMap源码
    4. 2.4. 线程池ThreadPool
    5. 2.5. synthronized, volatile, Lock的使用和区别
    6. 2.6. NIO实现
    7. 2.7. 工厂,代理,单例模式(单例模式多线程问题)
    8. 2.8. cglib与proxy的使用和区别
    9. 2.9. Java可重入锁和读写锁
    10. 2.10. JVM内存模型
    11. 2.11. JVM GC机制和相关算法
    12. 2.12. JVM类的加载
    13. 2.13. JVM性能调优的大体步骤
    14. 2.14. CAS算法
    15. 2.15. 一致性Hash
    16. 2.16. arrayList底层结构,linkedList底层结构,两者的区别(RandomAccess)
    17. 2.17. hashmap底层结构(java8版本),concurrentHashMap(java8版本)、hashTable,三兄弟对比下吧?
    18. 2.18. nio和bio相比有啥不同(aio呢)
    19. 2.19. jvm内存划分(java8版本呢?),堆的划分(系统遇到瓶颈,确定是JVM引起,怎么调优,说下具体做法)
    20. 2.20. 成员变量、局部变量等等的会分配到jvm的哪块儿区域
    21. 2.21. mysql的引擎知道哪些,有啥区别
    22. 2.22. 乐观锁、悲观锁
    23. 2.23. 索引相关的(btree、失效、组合索引的最左分配原则、explain使用)
    24. 2.24. 线程池相关
    25. 2.25. volitatle关键字
    26. 2.26. lock的读写、中断、自旋
    27. 2.27. 对threadLocal的理解
    28. 2.28. 序列化、反序列化(一个已经实现Serializable的类,新增个属性,怎样让程序直接报错)
    29. 2.29. servlet是否线程安全(为什么你认为是/否)
    30. 2.30. 对dubbo的理解(画下provider、consumer、注册中心、监控的关系)
    31. 2.31. consumer1次调用provider,在dubbo内部各模块运转的流程
    32. 2.32. 谈谈你对mq的理解(你用的activemq,那kafka与之对比,有啥优势呢)
    33. 2.33. maven中install、package命令的区别
    34. 2.34. 用过哪些设计模式,单例的懒汉、饿汉、线程安全的懒汉、最好的线程安全懒汉实现?
    35. 2.35. int的位数
    36. 2.36. hashMap ConcurrentHashMap 区别,hash冲突如何解决的?
    37. 2.37. synchronized 和lock的区别,synchronized是悲观锁还是乐观锁,cas算法
    38. 2.38. 3、谈谈threadLocal的理解、InheritableThreadLocal 、TransmittableThreadLocal 以及fastThreadLocal
    39. 2.39. 3、线程池
    40. 2.40. 4、请你说一下自己对于 AQS 原理的理解、
    41. 2.41. 5、CyclicBarrier 和 CountDownLatch 的区别
    42. 2.42. 6、aop实现原理:动态代理、cglib,
    43. 2.43. MyBatis中#与$的区别
  3. 3. jvm
    1. 3.1. 1、描述下jvm内存模型
    2. 3.2. 2、JVM参数Xms Xmx是如何设置的, 如果大小是一至,为什么这样设置?
    3. 3.3. 2、有遇到过OOM么,什么情况,怎么发现的,怎么查原因的?
    4. 3.4. 3、如何定位一个CPU Load过高的java线程?
  4. 4. redis
  5. 5. 设计模式
  6. 6. mysql
  7. 7. 算法: