0%

下面记录的是我面腾讯TEG事业群的经历

腾讯一面 2019年03月13日

  1. 自我介绍:我主要的是介绍我的项目,因为是很突然的接到电话,当时也没准备自我介绍,就直接将简历上面的项目介绍了一遍。但是自我的感觉介绍不是太好,因为我自己都觉得讲的不是很清楚。所以如果你要参加面试前,最好先写一个简单的自我介绍,如果是项目介绍,最好先介绍下背景,然后在介绍整个项目。这样面试官相对好理解写。不过最好不要把项目介绍的太仔细,要留下一些点让面试官自己来提问。这个度需要自己把握,。

  2. tcp三次握手:就是简单的问了一下这个问题,面试官没有问为什么需要三次握手。可能是我在回答这个问题的时候讲了自己遇到的一个”connection by peer reset“异常,然后描述了一下自己是怎么解决这个问题的。

  3. java 垃圾回:这个几乎只要是面java的都会问,所以需要好好整理

  4. java中的锁:这个主要问的是Synchronize和lock的区别,以及怎么的选择。

  5. 限流:我主要说了一个根据访问的量来进行限流,后面面试官说可以通过信号量来限流。

  6. raft:这个主要是考分布式相关的问题,然后我说只记得一点,把自己记得的讲了出来。

  7. mapreduce:这个也是在问分布式相关的问题,但是还是忘记了,然后把自己记得的讲了出来。

后面就是面试官问我还有什么想问他的,问了一下具体部门,他们是做中间件和大数据相关的组。

一面总结

  1. 面试官主要对我的一个项目比较感兴趣,主要也在问我这个项目。不过其中有一些点没有讲的很好,比如我在项目中用到了负载均衡,但是我没有仔细的看过负载均衡实现的方法,就简单的回答了一下。所以你写在简历上的项目一点要仔细的整理。

  2. 以前自己看过很多的论文,但是都没有仔细整理,这次面试也凸显出来,所以自己看过的知识点一定要好好整理。知道不代表懂。

  3. 尽量不要紧张,因为这是我第一次面大公司所以比较紧张。不过这个也没有什么好办法,尽量多面点就不会紧张。

  4. 和面试管尽量不要保持他问你答的状态,最好是处于一种聊天的状态。这次面试前面就是因为他问我搭所以比较紧张,在面试一会之后就转入了一种在聊天的状态,紧张感也就没有了。

腾讯二面 2019年03月27日

  1. 项目介绍:和上面一样

  2. 自定义协议:如和自定义协议,也是项目中的一个问题,我当时回答的是:协议定义是非常难的一个问题,要考虑很多的方面,比如完整性和尽量减少跟数据无关的协议头的长度。然后我只是简单的将自己在项目中使用了自定义协议,主要是因为我发现在这个项目里面数据传输几乎都是一样的,所以就自定义了一个协议,但是这个自定义的协议非常的粗糙。如果不是比赛的话,我不会这样做,因为要提升性能才这样做的。但是在真正的生产环境中要考虑适配和兼容性这些问题,最好还是使用通用性协议

  3. 线程,线程是如何调度,Java线程是如何调度

  4. 你觉得你项目有什么难点

  5. 快速排序:这个问题当时没回答好,因为我吧快排和希尔排序弄混,所以就和面试官分别介绍了这俩个排序,然后总结了一下为什么快排相对来说比较好。主要胜在平均性能。

二面总结

其实问题不是太难,但是自己在回答的过程中思路不是太清晰,所以自我感觉回答的不是太好。另外一些基础的问题没有弄好。所以下来需要整理。

这个面试完了之后,也是在周五下午,进行了最后一轮的HR面试。至此我的腾讯实习面试之路走完。另外我的二面其实在前一周也可以结束,但是因为自己手机调整成了静音,没有接到电话,所以空等了一周,拖到了这周面试。所以在面试过程中手机千万不要调成静音。

cache简介

CPU缓存(Cache Memory)是位于CPU与内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存要快得多。高速缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾,因为CPU运算速度要比内存读写速度快很多,这样会使CPU花费很长时间等待数据到来或把数据写入内存。在缓存中的数据是内存中的一小部分,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就可避开内存直接从缓存中调用,从而加快读取速度。

阅读全文 »

在Mysql中连接主要有内连接和外连接,本篇文章主要讲解这俩种连接。
表的定义和数据如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
create table student(
id int auto_increment primary key,
stuname varchar(128) not null
);
insert into student value (1,"张三");
insert into student value (2,"李四");
insert into student value (3,"王wu");
insert into student value (4,"任六");
insert into student value (5,"赵七");


create table course(
id int auto_increment primary key ,
course_name varchar(128),
stuid int
);
insert into course value( 1,"python编程",1);
insert into course value (2,"sql编程",2);
insert into course value (3,"java编程",3);
insert into course value (4,"php编程",4);
insert into course value (5,"test编程",10);

内连接

内连接就是讲俩个表中都存在的数据显示来,下面俩个sql语句的作用是一样的:

1
2
select * from course inner join student on course.stuid=student.id;
select * from course,student where course.stuid=student.id;

Xnip2019-03-28_20-24-55

外连接

左连接

是以左表为基准,将a.stuid = b.stuid的数据进行连接,然后将左表没有的对应项显示,右表的列为NULL

1
select *from course as a left join student as b on a.stuid=b.id;

Xnip2019-03-28_20-27-01

右连接

是以右表为基准,将a.stuid = b.stuid的数据进行连接,然以将右表没有的对应项显示,左表的列为NULL

1
select *from course as a right join student as b on a.stuid=b.id;

Xnip2019-03-28_20-28-30

全连接

完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
相当于一个笛卡尔乘积。在mysql中是不支持的。

补充

自然连接

自然连接(Natural join)是一种特殊的等值连接,要求两个关系表中进行比较的属性组必须是名称相同的属性组,并且在结果中把重复的属性列去掉(即:留下名称相同的属性组中的其中一组)。

在看《高性能mysql》这本书的时候,经常看到explain这个命令。所以希望总结一下这个命令的一些知识点。此外,我们为了能够在数据库运行过程中去优化,就会开启慢查询日志,而慢查询日志记录一些执行时间比较久的SQL语句,但是找出这些SQL语句并不意味着完事了。我们需要分析为什么这条sql执行的慢,也就是找出具体的原因。这时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain命令来查看。所以我们深入了解MySQL的基于开销的优化器,还可以获得很多可能被优化器考虑到的访问策略的细节,以及当运行SQL语句时哪种策略预计会被优化器采用。(QEP:sql生成一个执行计划query Execution plan)

首先我们看看这个命令输出的具体格式,然后分别的解释其中每列代表的意思,如果执行这条sql语句explain select * from film,输出的内容如下:

id select_type table type possible_keys key key_len ref rows filtered Extras
1 SIMPLE film ALL NULL NULL NULL NULL 1000 100 NULL

以上就是explain命令打印出来的信息,先对这些字段进行一个简介,有个整体的感知,然后在分别详细介绍每一个字段

列名 描述
id 在一个大的查询语句中,每个SELECT关键字都对应一个唯一的id
select_type SELECT关键字对应的查询的类型
table 表名
partitions 匹配的分区信息
type 针对单表的访问方法
possible_keys 可能使用到的索引
key 实际使用的索引
key_len 实时使用的索引长度
ref 当使用索引列等值查询时,与索引列进行等值匹配的对象信息
rows 预估的需要读取的记录条数
filtered 针对预估的需要读取的记录,经过搜索条件过滤后剩余记录条数的百分比
extra 一些额外信息
阅读全文 »

Servlet简介

如果你打开Java EE官方文档,你就会看看Servlet其实就是一个接口,只不过这个接口是由Java委员会预先定义好的,如果你想使用java开发web程序,就必须遵守这个约定。按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java程序,称之为Servlet。所以Servlet没什么神秘的,你可以简单的把它当做一个普通的类,只不过这个类实现了Servlet接口。

本文会按照如下思路来进行讲解,首先写一个Servlet版的Hello World,然后介绍servlet的运行流程以及生命周期,为后面文章打下基础。

阅读全文 »

对于JVM运行时区域有了一定了解以后,本文将更进一步介绍虚拟机内存中存储数据的细节信息,虚拟机(Hotspot)最大的一块内存是堆,在堆中存储的主要内容是对象,文章将探讨对象的创建、布局以及如何访问。

对象的创建

在java中对象的创建主要由以下几种:

创建方式 是否调用构造函数
new
使用Class的newInstance
使用Construct类的newInstance
使用clone方法
使用反序列化

下面new关键字为例,讲述JVM堆中对象实例的创建过程如下:

阅读全文 »

本文主要介绍JVM各个内存区域的作用和特性,同时分别阐述各个区域发生内存溢出的可能性和异常类型。

JVM内存区域

Java虚拟机执行Java程序的过程中,会把所管理的内存划分为若干个不同的数据区域。这些内存区域各有各的用途,以及创建和销毁时间。有的区域随着虚拟机进程的启动而存在,有的区域伴随着线程的启动和结束而创建和销毁。

JVM内存区域也成为Java运行时数据区域。其中包括:程序计数器、虚拟机栈、本地方法栈、堆和方法区。

upload successful

上图中,方法区和堆是线程共享,虚拟机栈、程序计数器和本地方法栈是线程私有。大概的结构如下图:

upload successful

下面对每部分进行详细的介绍

阅读全文 »

Java内存模型的主要目标就是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存中和从内存中取出变量这样的细节。此处的变量与java编程中所说的变量有所区别,它包括了实例字段、静态字段和构成数组对象的元素,但不包括局部变量与方法参数,因为这些是线程私有的,不会被共享自然也就不存在竞争问题。

每个线程中有自己的工作内存,线程的工作内存中保存了被该线程所使用到的变量(这些变量是从主内存中拷贝而来)。线程对变量的所有操作(读取,赋值)都必须在工作内存中进行。不同线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成。

阅读全文 »

IO类库的基本架构

I/O 问题是任何编程语言都无法回避的问题,可以说 I/O 问题是整个人机交互的核心问题,因为 I/O 是机器获取和交换信息的主要渠道。在当今这个数据大爆炸时代,I/O 问题尤其突出,很容易成为一个性能瓶颈。正因如此,所以 Java 在 I/O 上也一直在做持续的优化,如从 1.4 开始引入了 NIO,提升了 I/O 的性能。关于 NIO 我们将在后面详细介绍。

Java 的 I/O 操作类在包 java.io 下,大概有将近 80 个类,但是这些类大概可以分成四组,分别是:

  1. 基于字节操作的 I/O 接口:InputStream 和 OutputStream
  2. 基于字符操作的 I/O 接口:Writer 和 Reader
  3. 基于磁盘操作的 I/O 接口:File
  4. 基于网络操作的 I/O 接口:Socket

前两组主要是根据传输数据的数据格式,后两组主要是根据传输数据的方式,虽然 Socket 类并不在 java.io 包下,但是仍然把它们划分在一起,因为 I/O 的核心问题要么是数据格式影响 I/O 操作,要么是传输方式影响 I/O 操作,也就是将什么样的数据写到什么地方的问题,I/O 只是人与机器或者机器与机器交互的手段,除了在它们能够完成这个交互功能外,我们关注的就是如何提高它的运行效率了,而数据格式和传输方式是影响效率最关键的因素了。后面的分析也是基于这两个因素来展开的。

阅读全文 »

概述

在Unix系统中,主要有以下5种IO模型:

  • 阻塞式IO
  • 非阻塞式IO
  • IO复用
  • 信号量式驱动IO
  • 异步IO

本篇文章主要是想弄明白阻塞和非阻塞、同步与异步之间的区别,因此信号量式驱动IO本篇文章不会涉及,如果以后我用到的话,会在来补充。

对于一个network IO (这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的process (or thread),另一个就是系统内核(kernel)。当一个read操作发生时,它会经历两个阶段:

  1. 等待数据准备 (Waiting for the data to be ready)
  2. 将数据从内核拷贝到进程中 (Copying the data from the kernel
    to the process)

记住这两点很重要,因为这些IO Model的区别就是在两个阶段上各有不同的情况。下面首先介绍每种IO模型,然后在来总结他们之间的区别。

阅读全文 »