java技术整理1
一、基本
1.hashmap:
1.1 转红黑树条件:
a.数组长度大于等于64(默认16,要经过2次扩容--当达到16*默认扩容因子0.75=12就扩容)
b.链表长度大于8
1.2 hashmap先计算hash值,再用hash值计算下标。
2.sleep与await:
1.1 sleep是线程方法,await是object方法
1.2 sleep不会释放锁,而await会
1.3 sleep不依赖于同步器synchronize,而await要
1.4 sleep不需要被唤醒,而await要
3.hashtable与hashmap:
1.1 前者线程安全,而后者不是
1.2 前者不可以把null作为key,而后者可以,并放在第一个节点上
1.3 两者扩容因子默认都是0.75;前者初始容量为11,扩容是当前容量2+1;后者初始容量是16,扩容是当前容量2
4.cookie与session的区别:
前者cookie:
存放在客户端浏览器中;
大小受限制,单个不超过4K,一般1个站点最多保存20个;
String类型;
不太安全(可以加密)
后者sessiono:
存放在服务器中;
大小一般不受限制;
Key-Value(Object类型);
安全性更高;
二、JVM
4.用户线程与内存线程:
1.1 多对一:不需要切换,线程创建、调度、同步非常快;但是如果其中一个用户线程阻塞会造成其他线程无法执行,且无法像内核线程一样实现较完整的调度、优先级;
1.2 一对一:java的jvm几乎把所有对线程的操作都交给了系统内核操作,线程真正启动顺序不一定是按我们启动的顺序,会引起用户态和内核态的频繁切换;如果系统出现大量线程,回家降低系统性能。
5.运行时数据区:
6.内存回收:
7.内存溢出:
1.1 栈溢出
1.2 堆溢出
》
》第8行设置会在堆溢出会导出Damping日志
1.3 方法区溢出
1.4 本机直接内存溢出
8.内存泄漏:
1.1 不使用的内存,却没有被释放;
1.2 每一次请求进来或者每一次操作处理都分配了内存,却有部分不能回收(或未释放),随着请求越来越多,内存泄漏就会越来越严重,必然造成内存溢出。
1.3 内存泄漏一般是资源管理问题或者程序bug,内存溢出则是内存空间不足和内存泄漏的最终结果。
9.hotspot对象头包含哪些部分:
10.根据类分析对象的内存占用:
11.jvm启动参数:在哪里配?
12.堆空间最大值设置:
13.G1垃圾收集器特点:
1.空间整合:哪块垃圾最多优先清理
2.多线程+并发+可预测停顿
14.排查OOM的方法:
14.jvm的相关命令工具:
15.java8默认垃圾收集器:
16.并行垃圾收集器:
17.swt:
安全点:方法调用、循环跳转、异常跳转;设置标志位,并不断轮询,主动停止。
17.cpu使用率飙升,怎么排查?
先通过top命令找到cpu使用率高的线程;top -p 进程号;该界面输入H查找最高cpu的线程;执行jstack 进程号做dump输出线程信息; 同时根据线程的16进制找到对应的堆信息,然后再找出对应的代码
6、最后根据线程信息定位到具体代码
18.垃圾回收器的三色标记:
19.类加载、类加载器:
三、消息中间件
1.为什么用rocketmq:
3.各种消息列队:
4.mq的消息重复:
5.mq的消息重复:
4.解决MQ重复消息:
6.roketmq性能优化:
四、缓存
1.Redis概念:
Nosql,C编写,包含多种数据结构(字符串、列表、集合、散列表、有序集合),支持网络,基于内存还能持久化性能高效每秒可以处理超过10万次读写操作,遵守BSD协议,支持分布式易拓展、支持多种语言的k-v存储数据库。
2.Redis数据类型:
2.Redis与Memcached区别:
3.Redis的应用场景:
4.Redis为什么速度:
5.为什么用Redis而不用map/guava做缓存:
6.Redis的持久化机制:
7.如何保持缓存与数据库双写时一致:
8.缓存穿透:
五、并发编程
1.线程与进程的区别:
2.多线程中的上下文切换:![在这里插入图片描述](https://img-blog.csdnimg.cn/cc747de8d5dd49aca274926f6ad60f3e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZm9seWg=,size_20,color_FFFFFF,t_70,g_se,x_16)
3.java内存模型:
4.原子操作,JUC中原子操作类有哪些:
5.CAS操作及缺点:
6.java中的volatile变量作用:
7.volatile和atomic变量区别:
8.lock接口与synchronized区别:
9.乐观锁和悲观锁的理解及实现:
10.死锁:
11.callable及future:
13.futureTask的底层原理:
14.阻塞队列及实现原理:
15.不可变对象对并发应用的帮助
16.生产消费者模型作用:
17.copyOnWriteArrayList应用场景:
18.java单例:
19.双重检查锁定DCL的单例:
20.AQS:
wait、notify、notifyAll为什么不在thread类中:
六、分布式
1.分布式幂等性接口设计:
2.分布式session方案:
3.分布式事务:
4.ZAB协议:
5.Zookeeper和Redis区别:
6.Zookeepr节点宕机处理:
7.Zookeeper四种类型数据节点:
8.Dubbo和cloud区别:
9.Dubbo协议:
七、数据库
1.mysql存储引擎:
2.innodb与myisam区别:
3.表设计字段选择:
4.mysql的varchar(M)最多存储数据:
5.事务基本特性:
6.事务并发引发问题:
7.mysql索引:
8.三星索引:
9.innodb一颗b+树存放可以存放多少行数据:
10.如何提高insert性能:
11.全局锁、共享锁、排他锁:
12.mysql死锁:![在这里插入图片描述](https://img-blog.csdnimg.cn/9193f10c0bc844939afe36d500924cfe.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZm9seWg=,size_20,color_FFFFFF,t_70,g_se,x_16)
以上主要参考:https://www.bilibili.com/video/BV1vu41197Np?p=4&spm_id_from=pageDri
随心所往,看见未来。Follow your heart,see night!
欢迎点赞、关注、留言,一起学习、交流!