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

73 篇文章 8 订阅
12 篇文章 0 订阅

一、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更适合低 修改删除,大量查询

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

在这里插入图片描述
在这里插入图片描述

五、程序现在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设置,还是要等待足够的时间(刷新时间)才能发挥作用,在此期间,保存了故障服务器地址的客户计算机将不能正常访问服务器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coding路人王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值