Skip to content

Commit 8169d38

Browse files
committed
华为面试题
1 parent 0f8b749 commit 8169d38

File tree

8 files changed

+286
-36
lines changed

8 files changed

+286
-36
lines changed

docs/jvm/view-tools.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ VisualVM(All-in-One Java Troubleshooting Tool)一款功能强大的运行监
175175

176176
集成了多个 JDK 命令行工具的功能,提供了一个友好的图形界面,非常适用于开发和生产环境。
177177

178-
## VisualVM 安装插件
178+
### VisualVM 安装插件
179179

180180
VisualVM 的安装非常简单,下载地址:[https://visualvm.github.io](https://visualvm.github.io)
181181

@@ -224,7 +224,7 @@ VisualVM 中`概述`、`监视`、`线程`与 JConsole 差别不大,这里就
224224

225225
## Java Mission Control
226226

227-
JMV 最初是 JRockit VM 中的诊断工具,但在 Oracle JDK7 Update 40 以后,就绑定到了 HotSpot VM 中。不过后来又被 Oracle 开源出来作为一个单独的产品。
227+
JMC 最初是 JRockit VM 中的诊断工具,但在 Oracle JDK7 Update 40 以后,就绑定到了 HotSpot VM 中。不过后来又被 Oracle 开源出来作为一个单独的产品。
228228

229229
>GitHub 地址:[https://github.com/openjdk/jmc](https://github.com/openjdk/jmc)
230230

docs/sidebar/sanfene/javase.md

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,19 @@ Java 语言有很多优秀(可吹)的特点,以下几个是比较突出的
3838

3939
### 3.JVM、JDK 和 JRE 有什么区别?
4040

41-
**JVM**:Java Virtual Machine,Java 虚拟机,Java 程序运行在 Java 虚拟机上。针对不同系统的实现(Windows,Linux,macOS)不同的 JVM,因此 Java 语言可以实现跨平台
41+
**JVM**:Java Virtual Machine,也就是 Java 虚拟机,Java 实现跨平台的关键所在,针对不同的操作系统,有不同的 JVM 实现。JVM 负责将 Java 字节码转换为特定平台的机器码,并执行
4242

43-
**JRE** Java 运⾏时环境。它是运⾏已编译 Java 程序所需的所有内容的集合,包括 Java 虚拟机(JVM),Java 类库,Java 命令和其他的⼀些基础构件。但是,它不能⽤于创建新程序
43+
**JRE**Java Runtime Environment,也就是 Java 运行时环境,包含了运行 Java 程序所必需的库,以及 Java 虚拟机(JVM)。
4444

45-
**JDK**: Java Development Kit,它是功能⻬全的 Java SDK。它拥有 JRE 所拥有的⼀切,还有编译器(javac)和⼯具(如 javadoc 和 jdb)。它能够创建和编译程序
45+
**JDK**Java Development Kit,是一套完整的 Java SDK(软件开发工具包),包括了 JRE 以及编译器(javac)、Java 文档生成工具(Javadoc)、Java 调试器等开发工具。为开发者提供了开发、编译、调试 Java 程序的一整套环境
4646

4747
简单来说,JDK 包含 JRE,JRE 包含 JVM。
4848

49-
![JDK、JRE、JVM关系](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/sidebar/sanfene/javase-3.png)
49+
![三分恶面渣逆袭:JDK、JRE、JVM关系](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/sidebar/sanfene/javase-3.png)
50+
51+
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的华为面经同学 9 Java 通用软件开发一面面试原题:JRE与JDK的区别,JDK多了哪些东西,既安装了JRE又安装了JDK,可以利用JDK做什么事情?
52+
53+
5054

5155
### 4.说说什么是跨平台性?原理是什么
5256

@@ -1417,7 +1421,51 @@ Java IO 流的划分可以根据多个维度进行,包括数据流的方向(
14171421

14181422
![Java IO流用到装饰器模式](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/sidebar/sanfene/javase-25.png)
14191423

1424+
#### Java缓冲区溢出,如何预防
1425+
1426+
Java缓冲区溢出主要是由于向缓冲区写入的数据超过其能够存储的数据量。可以采用这些措施来避免:
1427+
1428+
①、**合理设置缓冲区大小**:在创建缓冲区时,应根据实际需求合理设置缓冲区的大小,避免创建过大或过小的缓冲区。
1429+
1430+
②、**控制写入数据量**:在向缓冲区写入数据时,应该控制写入的数据量,确保不会超过缓冲区的容量。Java 的ByteBuffer 类提供了`remaining()`方法,可以获取缓冲区中剩余的可写入数据量。
1431+
1432+
```java
1433+
import java.nio.ByteBuffer;
1434+
1435+
public class ByteBufferExample {
1436+
1437+
public static void main(String[] args) {
1438+
// 模拟接收到的数据
1439+
byte[] receivedData = {1, 2, 3, 4, 5};
1440+
int bufferSize = 1024; // 设置一个合理的缓冲区大小
1441+
1442+
// 创建ByteBuffer
1443+
ByteBuffer buffer = ByteBuffer.allocate(bufferSize);
1444+
1445+
// 写入数据之前检查容量是否足够
1446+
if (buffer.remaining() >= receivedData.length) {
1447+
buffer.put(receivedData);
1448+
} else {
1449+
System.out.println("Not enough space in buffer to write data.");
1450+
}
1451+
1452+
// 准备读取数据:将limit设置为当前位置,position设回0
1453+
buffer.flip();
1454+
1455+
// 读取数据
1456+
while (buffer.hasRemaining()) {
1457+
byte data = buffer.get();
1458+
System.out.println("Read data: " + data);
1459+
}
1460+
1461+
// 清空缓冲区以便再次使用
1462+
buffer.clear();
1463+
}
1464+
}
1465+
```
1466+
14201467
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的美团面经同学 2 Java 后端技术一面面试原题:Java IO 流 如何划分?
1468+
> 2. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的华为面经同学 9 Java 通用软件开发一面面试原题:Java缓冲区溢出,如何预防
14211469
14221470
### 43.既然有了字节流,为什么还要有字符流?
14231471

docs/sidebar/sanfene/javathread.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ class CompletableFutureExample {
108108
> 3. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的字节跳动面经同学 1 Java 后端技术一面面试原题:线程和进程有什么区别?
109109
> 4. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的华为 OD 面经同学 1 一面面试原题:对于多线程编程的了解?
110110
> 5. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的美团面经同学 2 Java 后端技术一面面试原题:进程和线程的区别?
111+
> 6. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的华为面经同学 9 Java 通用软件开发一面面试原题:进程和线程的区别
111112
112113
### 3.说说线程有几种创建方式?
113114

docs/sidebar/sanfene/jvm.md

Lines changed: 32 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1045,45 +1045,43 @@ GitHub 上标星 10000+ 的开源知识库《[二哥的 Java 进阶之路](https
10451045

10461046
### 33.了解哪些可视化的性能监控和故障处理工具?
10471047

1048-
以下是一些 JDK 自带的可视化性能监控和故障处理工具
1048+
我自己用过的可视化工具主要有
10491049

1050-
- JConsole
1050+
①、JConsole:JDK 自带的监控工具,可以用来监视 Java 应用程序的运行状态,包括内存使用、线程状态、类加载、GC 等,还可以进行一些基本的性能分析。
10511051

1052-
![JConsole概览](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/sidebar/sanfene/jvm-39.png)
1052+
![三分恶面渣逆袭:JConsole概览](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/sidebar/sanfene/jvm-39.png)
10531053

1054-
- VisualVM
1054+
②、VisualVM:VisualVM 是一个基于 NetBeans 平台的可视化工具,在很长一段时间内,VisualVM 都是 Oracle 官方主推的故障处理工具。集成了多个 JDK 命令行工具的功能,提供了一个友好的图形界面,非常适用于开发和生产环境。
10551055

1056-
![VisualVM安装插件](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/sidebar/sanfene/jvm-40.png)
1056+
![三分恶面渣逆袭:VisualVM安装插件](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/sidebar/sanfene/jvm-40.png)
10571057

1058-
- Java Mission Control
1058+
③、Java Mission Control:JMC 最初是 JRockit VM 中的诊断工具,但在 Oracle JDK7 Update 40 以后,就绑定到了 HotSpot VM 中。不过后来又被 Oracle 开源出来作为一个单独的产品。
10591059

1060-
![JMC主要界面](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/sidebar/sanfene/jvm-41.png)
1060+
![三分恶面渣逆袭:JMC主要界面](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/sidebar/sanfene/jvm-41.png)
10611061

1062-
除此之外,还有一些第三方的工具:
1062+
还有一些第三方的工具:
10631063

1064-
- **MAT**
1064+
①、**MAT**
10651065

1066-
Java 堆内存分析工具。
1066+
- Java 堆内存分析工具,主要用于分析和查找Java堆中的内存泄漏和内存消耗问题。
1067+
- 可以从Java堆转储文件中分析内存使用情况,并提供丰富的报告,如内存泄漏疑点、最大对象和GC根信息。
1068+
- 支持通过图形界面查询对象,以及检查对象间的引用关系。
10671069

1068-
- **GChisto**
1070+
②、**GChisto**:GC 日志分析工具,帮助开发者优化垃圾收集行为和调整GC性能。
10691071

1070-
GC 日志分析工具
1072+
③、**GCViewer**:类似于GChisto,也是用来分析GC日志,帮助开发者优化Java应用的垃圾回收过程
10711073

1072-
- **GCViewer**
1074+
④、**JProfiler**:一个全功能的商业Java性能分析工具,提供CPU、 内存和线程的实时分析。
10731075

1074-
`GC` 日志分析工具。
1076+
⑤、**arthas**
10751077

1076-
- **JProfiler**
1078+
- 阿里巴巴开源的Java诊断工具,主要用于线上的应用诊断。
1079+
- 支持在不停机的情况下进行Java应用的诊断。
1080+
- 包括JVM信息查看、监控、Trace命令、反编译等。
10771081

1078-
商用的性能分析利器
1082+
⑥、**async-profiler**:一个低开销的性能分析工具,支持生成火焰图,适用于复杂性能问题的分析
10791083

1080-
- **arthas**
1081-
1082-
阿里开源诊断工具。
1083-
1084-
- **async-profiler**
1085-
1086-
Java 应用性能分析工具,开源、火焰图、跨平台。
1084+
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的华为面经同学 9 Java 通用软件开发一面面试原题:如何查看当前Java程序里哪些对象正在使用,哪些对象已经被释放
10871085
10881086
### 34.JVM 的常见参数配置知道哪些?
10891087

@@ -1134,7 +1132,7 @@ JVM 调优是一个复杂的过程,主要包括对堆内存、垃圾收集器
11341132

11351133
之后,就要进行代码优化了,比如说减少大对象的创建、优化数据结构的使用方式、减少不必要的对象持有等。
11361134

1137-
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的华为面经同学 8 技术二面面试原题:说说你对 JVM 调优的了解
1135+
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的华为面经同学 6 Java 通用软件开发一面面试原题:说说你对JVM调优的了解
11381136
11391137
### 36.线上服务 CPU 占用过高怎么排查?
11401138

@@ -1293,9 +1291,17 @@ Heap dump file created
12931291
12941292
### 41.有没有处理过内存溢出问题?
12951293

1296-
内存泄漏和内存溢出二者关系非常密切,内存溢出可能会有很多原因导致,内存泄漏最可能的罪魁祸首之一。
1294+
内存溢出(Out of Memory,俗称 OOM)是指当程序请求分配内存时,由于没有足够的内存空间满足其需求,从而触发的错误。
1295+
1296+
首先,我会通过异常信息和日志确定OOM的类型。Java的OOM错误通常有几种类型,如堆内存溢出、Metaspace溢出或直接内存溢出。比如,如果日志中显示“java.lang.OutOfMemoryError: Java heap space”,那就说明是堆内存溢出。
1297+
1298+
一旦确定了是堆内存溢出,我会使用 JConsole 实时监控JVM的内存使用情况,特别是那些占用大量内存的对象和类。
1299+
1300+
找到可能的内存泄漏源后,我会回到代码中去,查找和修复具体的问题。
1301+
1302+
之后,我会在本地进行压力测试,模拟高负载情况下的内存表现,确保修改有效,且没有引入新的问题。
12971303

1298-
排查过程和排查内存泄漏过程类似。
1304+
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的华为面经同学 9 Java 通用软件开发一面面试原题:如何排查OOM?
12991305
13001306
GitHub 上标星 10000+ 的开源知识库《[二哥的 Java 进阶之路](https://github.com/itwanger/toBeBetterJavaer)》第一版 PDF 终于来了!包括 Java 基础语法、数组&字符串、OOP、集合框架、Java IO、异常处理、Java 新特性、网络编程、NIO、并发编程、JVM 等等,共计 32 万余字,500+张手绘图,可以说是通俗易懂、风趣幽默……详情戳:[太赞了,GitHub 上标星 10000+ 的 Java 教程](https://javabetter.cn/overview/)
13011307

docs/sidebar/sanfene/mysql.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -966,9 +966,9 @@ SQL 执行过程中,优化器通过成本计算预估出执行效率最高的
966966
- **慢查询日志**:开启 MySQL 慢查询日志,再通过一些工具比如 mysqldumpslow 去分析对应的慢查询日志,找出问题的根源。
967967
- **服务监控**:可以在业务的基建中加入对慢 SQL 的监控,常见的方案有字节码插桩、连接池扩展、ORM 框架过程,对服务运行中的慢 SQL 进行监控和告警。
968968

969-
### 25.有哪些方式优化慢 SQL?
969+
### 25.有哪些方式优化 SQL?
970970

971-
我在进行慢 SQL 优化的时候,主要通过以下几个方面进行优化:
971+
我在进行 SQL 优化的时候,主要通过以下几个方面进行优化:
972972

973973
![沉默王二:SQL 优化](https://cdn.tobebetterjavaer.com/stutymore/mysql-20240327104050.png)
974974

@@ -1208,6 +1208,7 @@ SELECT * FROM B WHERE id = 1;
12081208

12091209
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的腾讯面经同学 22 暑期实习一面面试原题:查询优化、联合索引、覆盖索引
12101210
> 2. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的华为面经同学 8 技术二面面试原题:说说 SQL 该如何优化
1211+
> 3. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的华为面经同学 6 Java 通用软件开发一面面试原题:说说 SQL 该如何优化
12111212
12121213
### 26.怎么看执行计划 explain,如何理解其中各个字段的含义?
12131214

0 commit comments

Comments
 (0)