收集牛客网腾讯面试查漏补缺【threadlocal、explain、引用】

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 收集牛客网腾讯面试查漏补缺【threadlocal、explain、引用】

一、ThreadLocal【解决共享变量】


1.ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。

2.使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。

3.ThreadLocalMap是ThreadLocal的内部静态类,而它的构成主要是用Entry来保存数据 ,而且还是继承的弱引用。在Entry内部使用ThreadLocal作为key,使用我们设置的value作为value


脏数据


由于线程池会复用Thread对象,南无与Thread绑定的类的static属性的ThreadLocal变量也会被复用,如果在现成的run()方法中不明显的代用remove()方法,就可能会get(重要的线程信息。)


内存泄漏


实际上 ThreadLocalMap 中使用的 key 为 ThreadLocal 的弱引用,弱引用的特点是,如果这个对象只存在弱引用,那么在下一次垃圾回收的时候必然会被清理掉。

ThreadLocal有三个方法,get set remove 最后 remove必须要进行执行,否则会发生内存泄漏,因为提示表明了static表明threadlocal修饰


使用场景


1、每个线程需要有自己单独的实例

2、实例需要在多个方法中共享,但不希望被多线程共享


存储用户Session

数据库连接,处理数据库事务


二、explain sql语句


explain 我们可以知道以下信息:表的读取顺序,数据读取操作的类型,哪些索引可以使用,哪些索引实际使用了,表之间的引用,每张表有多少行被优化器查询等信息。


在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询时,会返回执行计划的信息,而不是执行这条SQL(如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中)。

mysql> explain select * from actor;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | actor | ALL  | NULL          | NULL | NULL    | NULL |    2 | NULL  |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+

1.id列

id列的编号是 select 的序列号,有几个 select 就有几个id,并且id的顺序是按 select 出现的顺序增长的。MySQL将 select 查询分为简单查询和复杂查询。复杂查询分为三类:简单子查询、派生表(from语句中的子查询)、union 查询。

1)简单子查询


mysql> explain select (select 1 from actor limit 1) from film;
+----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key      | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+
|  1 | PRIMARY     | film  | index | NULL          | idx_name | 32      | NULL |    1 | Using index |
|  2 | SUBQUERY    | actor | index | NULL          | PRIMARY  | 4       | NULL |    2 | Using index |
+----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+

2)from子句中的子查询

mysql> explain select id from (select id from film) as der;
+----+-------------+------------+-------+---------------+----------+---------+------+------+-------------+
| id | select_type | table      | type  | possible_keys | key      | key_len | ref  | rows | Extra       |
+----+-------------+------------+-------+---------------+----------+---------+------+------+-------------+
|  1 | PRIMARY     | <derived2> | ALL   | NULL          | NULL     | NULL    | NULL |    2 | NULL        |
|  2 | DERIVED     | film       | index | NULL          | idx_name | 32      | NULL |    1 | Using index |
+----+-------------+------------+-------+---------------+----------+---------+------+------+-------------+

2.select_type列


select_type 表示对应行是是简单还是复杂的查询,如果是复杂的查询,又是上述三种复杂查询中的哪一种。

1)simple:简单查询。查询不包含子查询和union

mysql> explain select * from film where id = 2;
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref   | rows | Extra |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
|  1 | SIMPLE      | film  | const | PRIMARY       | PRIMARY | 4       | const |    1 | NULL  |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+

2)primary:复杂查询中最外层的 select

3)subquery:包含在 select 中的子查询(不在 from 子句中)

4)derived:包含在 from 子句中的子查询。MySQL会将结果存放在一个临时表中,也称为派生表(derived的英文含义)

5)union:在 union 中的第二个和随后的 select

6)union result:从 union 临时表检索结果的 select

3. table列

这一列表示 explain 的一行正在访问哪个表。

4. type列

这一列表示关联类型或访问类型,即MySQL决定如何查找表中的行。


eq_ref:primary key 或 unique key 索引的所有部分被连接使用 ,最多只会返回一条符合条件的记录。这可能是在 const 之外最好的联接类型了,简单的 select 查询不会出现这种 type

5. possible_keys列

这一列显示查询可能使用哪些索引来查找。

6. key列

这一列显示mysql实际采用哪个索引来优化对该表的访问。

7. key_len列

这一列显示了mysql在索引里使用的字节数,通过这个值可以算出具体使用了索引中的哪些列。

8.ref列

这一列显示了在key列记录的索引中,表查找值所用到的列或常量,常见的有:const(常量),func,NULL,字段名(例:film.id)

9.rows列

这一列是mysql估计要读取并检测的行数,注意这个不是结果集里的行数。

10.Extra列

这一列展示的是额外信息。


三、红黑树?与AVL不同?


红黑树与平衡二叉搜索树类似,都是在插入和删除元素节点时候,通过特定的旋转来维持自身平衡的,从而获得较高的查询新能。

1.节点施能狮红色和黑色

2.根节点必须是黑色

3.所有的NIL节点都是黑色。【叶子节点下挂的两个虚节点】

4.一条路径上不能出现相邻的两个红色节点

5.任何子树中,根节点到叶子节点的所有路径的黑色节点数目相同。


不同点

1.红黑树平衡性不如AVL,大致平衡,不保证严格的左右子树高度差为1,可能高度会更高,平均查找次数回避AVL较多。

2.插入时候,都是至多两次旋转恢复平衡

3.删除时,红黑树至多三次平衡,AVL为ologn次

4.红黑树更适合 频繁的插入和删除

5.AVL更适合低 修改删除,大量查询


四、强引用、软引用、弱引用、虚引用【阿里巴巴手册】


image.png

image.png


五、程序现在CPU突然爆了,如何定位?


1.利用top命令确定是哪一个线程占用内存过高导致的

2.若是自己的Java程序线程则利用thread命令:查看某一个线程的详情,确定是业务线程还是GC垃圾回收的线程

3.jmap -histo 进程号 :打印jvm中所有的对象,查看哪一个对象占用比较大;并且查看日志是否有outofMemary产生

4.利用jinfo工具就可以修改参数产生快照即dump文件并下载到windows环境中

5.visualvm工具打开进行分析并结合jmap 命令打印的对象定位到出问题的代码块

6.结合分析结果和代码,定位问题出现的原因


六、有没有做过大量数据的网络抓包,大致流程如何?



七、LRU算法哈希表和双向链表


思路:链表,插入新的节点直接放入表头,如果访问的节点不在表投命中后,移动节点到表头,如果访问没有命中,则新建一个节点放到表头,若链表达到了最大值,则将最后一个删除,最后一个节点就是最近最少未使用的。


八、DNS负载均衡、长短连接


DNS负载均衡技术的实现原理是在DNS服务器中为同一个主机名配置多个IP地址,在应答DNS查询时,DNS服务器对每个查询将以DNS文件中主机记录的IP地址按顺序返回不同的解析结果,将客户端的访问引导到不同的机器上去,使得不同的客户端访问不同的服务器,从而达到负载均衡的目的。

主要优点


这种技术的主要缺点如下


第一,技术实现比较灵活、方便,简单易行,成本低,适用于大多数TCP/IP应用。不需要网络专家来对之进行设定,或在出现问题时对之进行维护。


第二,对于Web应用来说,不需要对代码作任何的修改。事实上,Web应用本身并不会意识到负载均衡配置,即使在它面前。


第三,Web服务器可以位于互联网的任意位置上。


DNS负载均衡技术在具有以上优点的时候,其缺点也非常明显,主要表现在


第一,不能够按照Web服务器的处理能力分配负载。


第二,不支持高可靠性,DNS负载均衡技术没有考虑容错。


第三,可能会造成额外的网络问题。


第四,一旦某个服务器出现故障,即使及时修改了DNS设置,还是要等待足够的时间(刷新时间)才能发挥作用,在此期间,保存了故障服务器地址的客户计算机将不能正常访问服务器。

目录
相关文章
|
1月前
|
存储 安全 Java
面试题:用过ThreadLocal吗?ThreadLocal是在哪个包下的?看过ThreadLocal源码吗?讲一下ThreadLocal的get和put是怎么实现的?
字节面试题:用过ThreadLocal吗?ThreadLocal是在哪个包下的?看过ThreadLocal源码吗?讲一下ThreadLocal的get和put是怎么实现的?
37 0
|
5月前
|
存储 Java 中间件
《吊打面试官系列》从源码全面解析 ThreadLocal 关键字的来龙去脉
《吊打面试官系列》从源码全面解析 ThreadLocal 关键字的来龙去脉
|
1天前
|
存储 缓存 安全
面试被问ThreadLocal要怎么回答?
ThreadLocal是Java中为每个线程提供独立变量副本的类,避免多线程同步。它内部维护ThreadLocalMap,存在内存泄漏风险,使用后需调用remove()。常用于记录用户请求数据、事务处理、日志记录和连接池管理等场景。注意内存泄漏和性能影响,以及与InheritableThreadLocal和同步代码块的区别。【5月更文挑战第7天】
|
6天前
|
存储 Java
面试高频 ThreadLocal类详解
面试高频 ThreadLocal类详解
7 0
|
6月前
|
设计模式 算法 网络协议
社招offer-腾讯T9-70W年薪(面试经验分享)(上)
社招offer-腾讯T9-70W年薪(面试经验分享)
|
3月前
|
安全 算法 数据安全/隐私保护
腾讯面试官:工作两年了,这么简单的cisp题你都不会?
注册信息安全专业人员,是经中【国信息安全产品测评认证中心】实施的国家【认证】,对信息安全人员执业资质的认可。该证书是面向【信息安全】企业、信息安全咨询【服务机构】、信息安全【测评机构】、【政府机构】、社会各组织、团体、大专院校以及企事业单位中负责信息系统建设、运行维护和管理工作的信息安全专业人员所颁发的专业资质证书。
81 0
腾讯面试官:工作两年了,这么简单的cisp题你都不会?
|
3月前
|
C语言
腾讯面试真题(C语言)
腾讯面试真题(C语言)
|
5月前
|
存储 NoSQL 中间件
[中间件~大厂面试题] 腾讯三面,40亿的QQ号如何去重
[中间件~大厂面试题] 腾讯三面,40亿的QQ号如何去重
|
5月前
|
设计模式 算法 Java
腾讯Java高级岗180道面试真题,面试大厂拿45Koffer没问题!
一、数据结构与算法基础 · 说一下几种常见的排序算法和分别的复杂度。 · 用Java写一个冒泡排序算法 · 描述一下链式存储结构。 · 如何遍历一棵二叉树? · 倒排一个LinkedList。 · 用Java写一个递归遍历目录下面的所有文件。
|
5月前
|
Linux 应用服务中间件 数据库
Linux 面试题-(腾讯,百度,美团,滴滴)
Linux 面试题-(腾讯,百度,美团,滴滴)
52 0