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