Skip to content

Commit e3fc1ba

Browse files
committed
change image
1 parent 09317ed commit e3fc1ba

5 files changed

Lines changed: 150 additions & 38 deletions

File tree

README.md

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,35 @@
9090
- [2.Redis中哨兵是什么?](docs/RedisUserful.md#Redis中哨兵是什么?)
9191
- [3.客户端是怎么接入哨兵系统的?](docs/RedisUserful.md#客户端是怎么接入哨兵系统的?)
9292
- [4.Redis哨兵系统是怎么实现自动故障转移的?](docs/RedisUserful.md#Redis哨兵系统是怎么实现自动故障转移的?)
93-
- [MySQL](docs/MySQLNote.md)
93+
* MySQL
94+
- [MySQL相关的面试题](docs/MySQLNote.md)
95+
- [1.一条MySQL更新语句的执行过程是什么样的?](docs/MySQLNote.md#一条MySQL更新语句的执行过程是什么样的?)
96+
- [2.脏页是什么?](docs/MySQLNote.md#脏页是什么?)
97+
- [3.Checkpoint是什么?](docs/MySQLNote.md#Checkpoint是什么?)
98+
- [4.undo log,redo log,bin log是什么?](docs/MySQLNote.md#undolog,redolog,binlog是什么?)
99+
- [5.MySQL中的事务是什么?](docs/MySQLNote.md#MySQL中的事务是什么?)
100+
- [6.MySQL的隔离级别是怎么样的?](docs/MySQLNote.md#MySQL的隔离级别是怎么样的?)
101+
- [7.MVCC的实现原理是怎么样的?](docs/MySQLNote.md#MVCC的实现原理是怎么样的?)
102+
- [8.MySQL是怎么解决幻读的问题的?](docs/MySQLNote.md#MySQL是怎么解决幻读的问题的)
103+
- [9.MySQL中有哪些锁?](docs/MySQLNote.md#MySQL中有哪些锁?)
104+
- [10.B树是什么?](docs/MySQLNote.md#B树是什么?)
105+
- [11.B树与B+树的区别是什么?](docs/MySQLNote.md#B树与B+树的区别是什么?)
106+
- [12.索引是什么?](docs/MySQLNote.md#索引是什么?)
107+
- [13.字符串索引和数字类型索引的区别?](docs/MySQLNote.md#字符串索引和数字类型索引的区别?)
108+
- [14.union和union all的区别是什么?](docs/MySQLNote.md#union和union)
109+
- [15.Join的工作流程是怎么样的,怎么进行优化?](docs/MySQLNote.md#Join的工作流程是怎么样的,怎么进行优化)
110+
- [16.聚集索引是什么?](docs/MySQLNote.md#聚集索引是什么?)
111+
- [17.联合索引是什么?](docs/MySQLNote.md#联合索引是什么?)
112+
- [18.覆盖索引是什么?](docs/MySQLNote.md#覆盖索引是什么?)
113+
- [19.哪些情况不要建索引?](docs/MySQLNote.md#哪些情况不要建索引?)
114+
- [20.主键,唯一性索引,普通索引的区别是什么?](docs/MySQLNote.md#主键,唯一性索引,普通索引的区别是什么?)
115+
- [21.InnoDB和MyISAM的区别是什么?](docs/MySQLNote.md#InnoDB和MyISAM的区别是什么?)
116+
- [22.什么是分库分表?](docs/MySQLNote.md#什么是分库分表?)
117+
- [23.怎么实现跨库分页查询?](docs/MySQLNote.md#怎么实现跨库分页查询?)
118+
- [24.MySQL主从复制的工作流程是什么样的?](docs/MySQLNote.md#MySQL主从复制的工作流程是什么样的?)
119+
- [25.char类型与varchar类型的区别?](docs/MySQLNote.md#char类型与varchar类型的区别)
120+
- [26.如何优化MySQL慢查询?](docs/MySQLNote.md# 如何优化MySQL慢查询)
121+
- [27.SELECT Count(*)怎么优化?](docs/MySQLNote.md#SELECT Count(*)怎么优化)
94122
- [Kafka](docs/Kafka.md)
95123
- [ZooKeeper](docs/ZooKeeper.md)
96124
- [JVM读书摘要](docs/JVMBook.md)

docs/JavaJVM.md

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,38 @@ Minor GC:对新生代进行回收,不会影响到年老代。因为新生代
252252

253253
Full GC:也叫 Major GC,对整个堆进行回收,包括新生代和老年代。由于Full GC需要对整个堆进行回收,所以比Minor GC要慢,因此应该尽可能减少Full GC的次数,导致Full GC的原因包括:老年代被写满和System.gc()被显式调用等。
254254

255+
### 触发Minor GC的条件有哪些?
256+
为新对象分配内存时,新生代的Eden区空间不足。
257+
新生代回收日志:
258+
```
259+
2020-05-12T16:15:10.736+0800: 7.803: [GC (Allocation Failure) 2020-05-12T16:15:10.736+0800: 7.803: [ParNew: 838912K->22016K(943744K), 0.0982676 secs] 838912K->22016K(1992320K), 0.0983280 secs] [Times: user=0.19 sys=0.01, real=0.10 secs]
260+
```
261+
### 触发Full GC的条件有哪些?
262+
主要分为三种:
263+
#### 1.system.gc()
264+
265+
代码中调用system.gc()方法,建议JVM进行垃圾回收。
266+
267+
#### 2.方法区空间不足
268+
269+
方法区中存放的是一些类的信息,当系统中要加载的类、反射的类和调用的方法较多时,方法区可能会被占满,触发 Full GC
270+
271+
#### 3.老年代空间不足
272+
273+
而老年代空间不足又有很多种情况:
274+
3.1 Promotion Failed 老年代存放不下晋升对象
275+
在进行 MinorGC 时, Survivor Space 放不下存活的对象,此时会让这些对象晋升,只能将它们放入老年代,而此时老年代也放不下时造成的。
276+
还有一些情况也会导致新生代对象晋升,例如存活对象经历的垃圾回收次数超过一定次数(XX:MaxTenuringThreshold参数设置的次数,默认为15),那么会导致晋升,
277+
或者在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄。
278+
3.2 Concurrent Mode Failure
279+
在执行 CMS GC 的过程中,同时有对象要放入老年代,而此时老年代空间不足造成的。
280+
3.3 历次晋升的对象平均大小>老年代的剩余空间
281+
这是一个较为复杂的触发情况, HotSpot为了避免由于年轻代对象晋升到老年代导致老年代空间不足的现象,
282+
在进行 Minor GC时,做了一个判断,如果之前统计所得到的 MinorGC 晋升到老年代的平均大小大于老年代的剩余空间,那么就直接触发 Full GC。
283+
3.4 老年代空间不足以为大对象分配内存
284+
因为超过阀值(-XX:+PrintTenuringDistribution参数设置的大小时)的大对象,会直接分配到老年代,如果老年代空间不足,会触发Full GC。
285+
286+
255287
### 垃圾收集器有哪些?
256288

257289
一般老年代使用的就是标记-整理,或者标记-清除+标记-整理结合(例如CMS)
@@ -569,6 +601,48 @@ jmap -dump:format=b,file=/home/admin/logs/heap.hprof 6214
569601

570602

571603

604+
### 怎么排查CPU占用率过高的问题?
605+
1.首先使用`top`命令查看CPU占用率高的进程的pid。
606+
```
607+
top - 15:10:32 up 523 days, 3:47, 1 user, load average: 0.00, 0.01, 0.05
608+
Tasks: 95 total, 1 running, 94 sleeping, 0 stopped, 0 zombie
609+
%Cpu(s): 1.7 us, 0.5 sy, 0.0 ni, 95.7 id, 2.2 wa, 0.0 hi, 0.0 si, 0.0 st
610+
KiB Mem : 16267904 total, 6940648 free, 2025316 used, 7301940 buff/cache
611+
KiB Swap: 16777212 total, 16776604 free, 608 used. 13312484 avail Mem
612+
613+
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
614+
14103 hadoop 20 0 2832812 203724 18392 S 3.7 1.3 977:08.04 java
615+
14010 hadoop 20 0 2897344 285392 18660 S 0.3 1.8 513:30.49 java
616+
14284 hadoop 20 0 3052556 340436 18636 S 0.3 2.1 1584:47 java
617+
14393 hadoop 20 0 2912460 504112 18632 S 0.3 3.1 506:43.68 java
618+
1 root 20 0 190676 3404 2084 S 0.0 0.0 4:31.47 systemd
619+
2 root 20 0 0 0 0 S 0.0 0.0 0:04.77 kthreadd
620+
3 root 20 0 0 0 0 S 0.0 0.0 0:10.16 ksoftirqd/0
621+
```
622+
2.使用`top -Hp 进程id`获得该进程下各个线程的CPU占用情况,找到占用率最高的线程的pid2,
623+
使用`printf "%x\n" pid2`命令将pid2转换为16进制的数number。
624+
```
625+
top - 15:11:01 up 523 days, 3:48, 1 user, load average: 0.00, 0.01, 0.05
626+
Threads: 69 total, 0 running, 69 sleeping, 0 stopped, 0 zombie
627+
%Cpu(s): 12.8 us, 0.1 sy, 0.0 ni, 87.0 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
628+
KiB Mem : 16267904 total, 6941352 free, 2024612 used, 7301940 buff/cache
629+
KiB Swap: 16777212 total, 16776604 free, 608 used. 13313188 avail Mem
630+
631+
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
632+
14393 hadoop 20 0 2912460 504112 18632 S 0.0 3.1 0:00.01 java
633+
14411 hadoop 20 0 2912460 504112 18632 S 0.0 3.1 0:01.95 java
634+
14412 hadoop 20 0 2912460 504112 18632 S 0.0 3.1 0:16.18 java
635+
14413 hadoop 20 0 2912460 504112 18632 S 0.0 3.1 0:12.79 java
636+
14414 hadoop 20 0 2912460 504112 18632 S 0.0 3.1 8:09.10 java
637+
```
638+
3.使用`jstack pid`获得进程下各线程的堆栈信息,nid=0xnumber的线程即为占用率高的线程,查看它是在执行什么操作。(`jstack 5521 | grep -20 0x1596`可以获得堆栈信息中,会打印匹配到0x1596的上下20行的信息。)
639+
640+
例如这个线程是在执行垃圾回收:
641+
```
642+
"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007f338c01f000 nid=0x1593 runnable
643+
```
644+
645+
572646

573647
##### JVM相关的异常
574648

docs/JavaMultiThread.md

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@
1111
#### [3.Java中创建线程有哪些方式?](#Java中创建线程有哪些方式?)
1212

1313
#### [4.如何解决序列化时可以创建出单例对象的问题?](#如何解决序列化时可以创建出单例对象的问题?)
14+
#### [5.悲观锁和乐观锁是什么?](#悲观锁和乐观锁是什么?)
15+
16+
#### [6.volatile 关键字有什么用?怎么理解可见性,一般什么场景去用可见性?](#volatile 关键字有什么用)
17+
18+
1419

1520
### 进程与线程的区别是什么?
1621

@@ -435,9 +440,7 @@ public class Singleton implements java.io.Serializable {
435440

436441

437442

438-
# 锁相关的知识
439-
440-
#### 悲观锁和乐观锁
443+
### 悲观锁和乐观锁是什么?
441444

442445
##### 悲观锁
443446

@@ -532,16 +535,24 @@ public final int getAndAddInt(Object var1, long var2, int var4) {
532535
}
533536
```
534537

535-
####volatile 关键字有什么用?怎么理解可见性,一般什么场景去用可见性?
538+
### volatile 关键字有什么用?怎么理解可见性,一般什么场景去用可见性?
536539

537-
当线程进行一个volatile变量的写操作时,JIT编译器生成的汇编指令会在写操作的指令前在上一个“lock”前缀。“lock”有两个作用:
540+
当线程进行一个volatile变量的写操作时,JIT编译器生成的汇编指令会在写操作的指令后面加上一个“lock”指令。
541+
Java代码如下:
542+
```java
543+
instance = new Singleton(); // instance是volatile变量
544+
转变成汇编代码,如下。
545+
0x01a3de1d: movb $0×0,0×1104800(%esi);0x01a3de24: lock addl $0×0,(%esp);
546+
```
547+
“lock”有三个作用:
538548

539-
1.将当前CPU缓存行的数据会写回到主存
540-
2.这个写回内存的操作会引起在其他CPU中对这个变量的缓存失效
549+
1.将当前CPU缓存行的数据会写回到系统内存
550+
2.这个写回内存的操作会使得其他CPU里缓存了该内存地址的数据无效
541551

542552
3.确保指令重排序时,内存屏障前的指令不会排到后面去,内存屏障后的指令不会排到前面去。
543553

544-
可见性可以理解为一个线程的写操作可以立即被其他线程得知。
554+
可见性可以理解为一个线程的写操作可以立即被其他线程得知。为了提高CPU处理速度,CPU一般不直接与内存进行通信,而是将系统内存的数据读到内部缓存,再进行操作,对于普通的变量,修改完不知道何时会更新到系统内存。但是如果是对volatile修饰的变量进行写操作,JVM就会向处理器发送一条Lock前缀的指令,将这个变量所在的缓存行的数据立即写回到系统内存。但是即便写回到系统内存,其他CPU中的缓存行数据还是旧的,为了保证数据一致性,其他CPU会嗅探在总线上传播的数据来检查自己的缓存行的值是否过期,当CPU发现缓存行对应的内存地址被修改,那么就会将当前缓存行设置为无效,下次当CPU对这个缓存行上 的数据进行修改时,会重新从系统内存中把数据读到处理器缓存 里。
555+
545556

546557
##### 使用场景
547558

docs/MySQLNote.md

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,34 +3,33 @@
33

44
下面是主要是自己看了《高性能MySQL》及一些博客后,找了一些MySQL相关的面试题,通过翻书,查资料写的解答,之后会继续更新和完善这一部分内容。
55

6-
#### [一条MySQL更新语句的执行过程是什么样的?](#一条MySQL更新语句的执行过程是什么样的?)
7-
#### [脏页是什么?](#脏页是什么?)
8-
#### [Checkpoint是什么?](#Checkpoint是什么?)
9-
#### [undo log,redo log,bin log是什么?](#undolog,redolog,binlog是什么?)
10-
#### [MySQL中的事务是什么?](#MySQL中的事务是什么?)
11-
#### [MySQL的隔离级别是怎么样的?](#MySQL的隔离级别是怎么样的?)
12-
#### [MVCC的实现原理是怎么样的?](#MVCC的实现原理是怎么样的?)
13-
#### [MySQL中有哪些锁?](#MySQL中有哪些锁?)
14-
15-
#### [B树是什么?](#B树是什么?)
16-
17-
#### [B树与B+树的区别是什么?](#B树与B+树的区别是什么?)
18-
#### [索引是什么?](#索引是什么?)
19-
#### [字符串索引和数字类型索引的区别?](#字符串索引和数字类型索引的区别?)
20-
#### [union和union all的区别是什么?](#union和union)
21-
#### [Join的工作流程是怎么样的,怎么进行优化?](#Join的工作流程是怎么样的,怎么进行优化)
22-
#### [聚集索引是什么?](#聚集索引是什么?)
23-
#### [联合索引是什么?](#联合索引是什么?)
24-
#### [覆盖索引是什么?](#覆盖索引是什么?)
25-
#### [哪些情况不要建索引?](#哪些情况不要建索引?)
26-
#### [主键,唯一性索引,普通索引的区别是什么?](#主键,唯一性索引,普通索引的区别是什么?)
27-
#### [InnoDB和MyISAM的区别是什么?](#InnoDB和MyISAM的区别是什么?)
28-
#### [什么是分库分表?](#什么是分库分表?)
29-
#### [怎么实现跨库分页查询?](#怎么实现跨库分页查询?)
30-
#### [MySQL 主从复制的工作流程是什么样的?](#MySQL主从复制的工作流程是什么样的?)
31-
#### [ char类型与varchar类型的区别?](#char类型与varchar类型的区别)
32-
#### [ 如何优化MySQL慢查询?](# 如何优化MySQL慢查询)
33-
#### [SELECT Count(*)怎么优化?](SELECT Count(*)怎么优化)
6+
#### [1.一条MySQL更新语句的执行过程是什么样的?](#一条MySQL更新语句的执行过程是什么样的?)
7+
#### [2.脏页是什么?](#脏页是什么?)
8+
#### [3.Checkpoint是什么?](#Checkpoint是什么?)
9+
#### [4.undo log,redo log,bin log是什么?](#undolog,redolog,binlog是什么?)
10+
#### [5.MySQL中的事务是什么?](#MySQL中的事务是什么?)
11+
#### [6.MySQL的隔离级别是怎么样的?](#MySQL的隔离级别是怎么样的?)
12+
#### [7.MVCC的实现原理是怎么样的?](#MVCC的实现原理是怎么样的?)
13+
#### [8.MySQL是怎么解决幻读的问题的?](#MySQL是怎么解决幻读的问题的)
14+
#### [9.MySQL中有哪些锁?](#MySQL中有哪些锁?)
15+
#### [10.B树是什么?](#B树是什么?)
16+
#### [11.B树与B+树的区别是什么?](#B树与B+树的区别是什么?)
17+
#### [12.索引是什么?](#索引是什么?)
18+
#### [13.字符串索引和数字类型索引的区别?](#字符串索引和数字类型索引的区别?)
19+
#### [14.union和union all的区别是什么?](#union和union)
20+
#### [15.Join的工作流程是怎么样的,怎么进行优化?](#Join的工作流程是怎么样的,怎么进行优化)
21+
#### [16.聚集索引是什么?](#聚集索引是什么?)
22+
#### [17.联合索引是什么?](#联合索引是什么?)
23+
#### [18.覆盖索引是什么?](#覆盖索引是什么?)
24+
#### [19.哪些情况不要建索引?](#哪些情况不要建索引?)
25+
#### [20.主键,唯一性索引,普通索引的区别是什么?](#主键,唯一性索引,普通索引的区别是什么?)
26+
#### [21.InnoDB和MyISAM的区别是什么?](#InnoDB和MyISAM的区别是什么?)
27+
#### [22.什么是分库分表?](#什么是分库分表?)
28+
#### [23.怎么实现跨库分页查询?](#怎么实现跨库分页查询?)
29+
#### [24.MySQL主从复制的工作流程是什么样的?](#MySQL主从复制的工作流程是什么样的?)
30+
#### [25.char类型与varchar类型的区别?](#char类型与varchar类型的区别)
31+
#### [26.如何优化MySQL慢查询?](# 如何优化MySQL慢查询)
32+
#### [27.SELECT Count(*)怎么优化?](SELECT Count(*)怎么优化)
3433

3534
### 一条MySQL更新语句的执行过程是什么样的?
3635

@@ -277,7 +276,7 @@ SELECT *** FOR UPDATE 在查询时会先申请X锁
277276

278277
SELECT *** IN SHARE MODE 在查询时会先申请S锁
279278

280-
就是实时读,就是读取的是实时的数据,而不快照数据,读的时候会加Next-Key Lock锁住当前的记录,以及左右两个区间的间隙,这样在读的时候就不能玩我们的查询范围插入数据了
279+
就是实时读,就是读取的是实时的数据,而不快照数据,读的时候会加Next-Key Lock锁住当前的记录,以及左右两个区间的间隙,这样在读的时候就不能往我们的查询范围插入数据了
281280

282281

283282
### MySQL中有哪些锁?
14.2 KB
Loading

0 commit comments

Comments
 (0)