笔试题

笔试题

  • 如果线上某台虚机CPU Load过高,该如何快速排查原因?只介绍思路和涉及的Linux命令即可 。
造成cpu load过高的原因: Full gc次数的增大、代码中存在Bug(例如死循环、正则的不恰当使用等)都有可能造成cpu load 增高。
1. jps -v:查看java进程号
2. top -Hp [java进程号]:查看当前进程下最耗费CPU的线程
3. printf "%x\n" [步骤2中的线程号]:得到线程的16进制表示
4. jstack [java进程号] | grep -A100 [步骤3的结果]:查看线程堆栈,定位代码行。参考:如何使用JStack分析线程状态
  • 请简要描述MySQL数据库联合索引的命中规则,可举例说明
1) MySQL联合索引遵循最左前缀匹配规则,即从联合索引的最左列开始向右匹配,直到遇到匹配终止条件。例如联合索引(col1, col2, col3), where条件为col1=`a` AND col2=`b`可命中该联合索引的(col1,col2)前缀部分, where条件为col2=`b` AND col3=`c`不符合最左前缀匹配,不能命中该联合索引。

2) 匹配终止条件为范围操作符(>, <, between, like等)或函数等不能应用索引的情况。例如联合索引(col1, col2, col3), where条件为col1=`a` AND col2>1 AND col3=`c`, 在col2列上为范围查询,匹配即终止,只会匹配到col1,不能匹配到(col1, col2, col3).

3) where条件中的顺序不影响索引命中。例如联合索引(col1, col2, col3), where条件为col3=`c` AND col2=b AND col1=`a`, MySQL优化器会自行进行优化,可命中联合索引(col1, col2, col3).
  • 请描述https的请求过程。
1) 客户端向服务器发起HTTPS请求,连接到服务器的443端口;

2) 服务器端有一个密钥对,即公钥(即数字证书)和私钥,是用来进行非对称加密使用的,服务器端保存着私钥,不能将其泄露,公钥可以发送给任何人;

3) 服务器将自己的公钥发送给客户端;

4) 客户端收到服务器端的公钥之后,检查其合法性,如果发现发现公钥有问题,那么HTTPS传输就无法继续,如果公钥合格,则客户端会生成一个客户端密钥,然后用服务器的公钥对客户端密钥进行非对称加密成密文,至此,HTTPS中的第一次HTTP请求结束;

5) 客户端发起HTTPS中的第二个HTTP请求,将加密之后的客户端密钥发送给服务器;

6) 服务器接收到客户端发来的密文之后,会用自己的私钥对其进行非对称解密,解密之后的明文就是客户端密钥,然后用客户端密钥对数据进行对称加密,这样数据就变成了密文;

7) 然后服务器将加密后的密文发送给客户端;

8) 客户端收到服务器发送来的密文,用客户端密钥对其进行对称解密,得到服务器发送的数据。这样HTTPS中的第二个HTTP请求结束,整个HTTPS传输完成。
  • 什么是事务传播行为?你知道Spring事务中都有哪些传播类型吗?如何使用/指定传播类型?
1) 事务传播用于描述当一个由事务传播行为修饰的方法被嵌套入另外一个方法时,事务如何传播。常用于定义发生事务嵌套时,如何继续执行。

2) Spring 中共定义了7中事务传播类型,明细如下表, 需答出3~4种常见类型即可:

    a) PROPAGATION_REQUIRED: 当前没有事务时开启新事务,如果有则加入;

    b) PROPAGATION_REQUIRES_NEW: 强制开启新事务,挂起已有事务(如有);

    c) PROPAGATION_SUPPORTS: 当前有事务时加入, 没有则以非事务方式执行;

    d) PROPAGATION_NOT_SUPPORTED: 以非事务方式执行, 挂起当前事务(如有);

3) 可以在注解或者XML中指定传播类型, 如 "@Transactional(Propagation=xxx)"
  • final, finally, finalize的区别
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承 
finally是异常处理语句结构的一部分,表示总是执行 
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等
  • sleep() 和 wait() 有什么区别?
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
  • 请阐述数据库事务的几大特性,针对数据库事务,以mysql为例,该数据库有几种隔离级别,请阐述每种隔离级别所产生的效果。
事务的四大特性(ACID):
(1)原子性(Atomicity)   原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。 
(2) 一致性(Consistency)   一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。   拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。
(3)隔离性(Isolation)   隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。   即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。   关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到。 
(4) 持久性(Durability)   持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。 例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。 
隔离级别:   
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。  
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。   
③ Read committed (读已提交):可避免脏读的发生。   
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
  • 关于 TCP 协议网络端口的描述
网络端口号范围大小受限于TCP 协议
  • 什么是进程(Process)?什么是线程(Thread)?有何区别?
含义:
进程是具有一定独立功能的的程序,进程是系统进行资源分配和调度的一个独立单元。
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源

区别:
一个程序至少有一个进程,一个进程至少有一个线程
线程的划分尺度小于进程,使得多线程程序的并发性高。
进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。
攻击者使用无效IP地址,利用TCP连接的三次握手过程,连续发送会话请求,使受害主机处于开放会话的请求之中,直至连接超时,最终因耗尽资源而停止响应。
  • SYN Flooding攻击
  • 重放攻击
  • A,B两台机器都正常工作,B机器未监听任何端口.如果A机器向B机器80端口发送SYN包,会收到何种类型的回包?
RST包
RST包用来强制关闭TCP链接。 什么时候发送RST包      
1. 建立连接的SYN到达某端口,但是该端口上没有正在 监听的服务。       
2. TCP收到了一个根本不存在的连接上的分节。       
3. 请求超时。 使用setsockopt的SO_RCVTIMEO选项设置recv的超时时间。接收数据超时时,会发送RST包。
  • 在 bash shell 环境下,当一命令正在执行时,按下 control-Z 会:
ctrl-c:发送 SIGINT 信号给前台进程组中的所有进程。常用于终止正在运行的程序;
ctrl-z:发送 SIGTSTP信号给前台进程组中的所有进程,常用于挂起一个进程;
ctrl-d:不是发送信号,而是表示一个特殊的二进制值,表示 EOF,作用相当于在终端中输入exit后回车;
ctrl-\:发送 SIGQUIT 信号给前台进程组中的所有进程,终止前台进程并生成 core 文件;
ctrl-s:中断控制台输出;
ctrl-q:恢复控制台输出;
ctrl-l:清屏
  • 文件目录data当前权限为rwx — ---,只需要增加用户组可读权限,但不允许写操作,具体方法为:
使用chomd命令改变文件权限。
Linux文件基本权限有9个,owner,group,others三种身份对应各自read,write,execute三种权限。
文件权限字符:“-rwxrwxrwx”三个一组。数字化r:4 w:2 x:1
增加用户组可读,但不可写,第一组和第三组默认为0,只在第二组中添加r-x即可 chomd +050
  • 执行以下shell语句,可以生成/test文件的是(假定执行前没有/test文件):
1. touch /test
2. a=`touch /test`
3. >/test
  • 以下语句可以用来获取shell脚本参数的是
    在这里插入图片描述
  • JVM内存不包含如下哪个部分( )
    java好像只有栈帧 没有堆帧 pc寄存器 就是 程序计数器
    程序计数器是一个以线程私有的一块较小的内存空间,用于记录所属线程所执行的字节码的行号指示器;字节码解释器工作时,通过改变程序计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳准、异常处理、线程恢复等基础功能都需要依赖程序计数器来完成
    在这里插入图片描述
  • 下述代码返回结果为:
Integer a = 1;
Integer b = 1;
Integer c = 500;
Integer d = 500;
System.out.print(a == b);
System.out.print(c == d);

Integer类型在-128–>127范围之间是被缓存了的,也就是每个对象的内存地址是相同的,赋值就直接从缓存中取,不会有新的对象产生,而大于这个范围,将会重新创建一个Integer对象,也就是new一个对象出来,当然地址就不同了,也就!=;

  • 以下输出
String str = "";
System.out.print(str.split(",").length);
1
    /**
     * String split 这个方法默认返回一个数组,
     * 如果没有找到分隔符,
     * 会把整个字符串当成一个长度为1的字符串数组  * 返回到结果, 所以此处结果就是1  
     *
     */
    private static void testSpringSpilte(){
        String str = "12,3";
        String str2 = "123";
        System.out.print(str.split(",").length);
        System.out.print(str2.split(",").length);
    }
}
结果  2  1
  • synchronized关键字和volatile关键字比较:
volatile关键字是线程同步的轻量级实现,所以volatile性能肯定比synchronized关键字要好。但是volatile关键字只能用于变量而synchronized关键字可以修饰方法以及代码块。synchronized关键字在JavaSE1.6之后进行了主要包括为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁以及其它各种优化之后执行效率有了显著提升,实际开发中使用 synchronized 关键字的场景还是更多一些。
多线程访问volatile关键字不会发生阻塞,而synchronized关键字可能会发生阻塞
volatile关键字能保证数据的可见性,但不能保证数据的原子性。synchronized关键字两者都能保证。
volatile关键字主要用于解决变量在多个线程之间的可见性,而 synchronized关键字解决的是多个线程之间访问资源的同步性。
  • 某打车公司将驾驶里程(drivedistanced)超过5000里的司机信息转移到一张称为seniordrivers 的表中,他们的详细情况被记录在表drivers 中,正确的sql为(D
A. insert into seniordrivers
drivedistanced>=5000 from drivers where
B. insert seniordrivers (drivedistanced) values from drivers where drivedistanced>=5000
C. insert into seniordrivers
(drivedistanced)values>=5000 from drivers where
D. select * into seniordrivers from drivers where drivedistanced >=5000

SQL SELECT INTO 语句可用于创建表的备份复件。
SELECT INTO 语句
SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。
SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档。
SQL SELECT INTO 语法
您可以把所有的列插入新表:
SELECT * INTO new_table_name [IN externaldatabase] FROM old_tablename
或者只把希望的列插入新表:
SELECT column_name(s) INTO new_table_name [IN externaldatabase] FROM old_tablename
SQL SELECT INTO 实例 - 制作备份复件
下面的例子会制作 “Persons” 表的备份复件:
SELECT * INTO Persons_backup FROM Persons
IN 子句可用于向另一个数据库中拷贝表:
SELECT * INTO Persons IN ‘Backup.mdb’ FROM Persons
如果我们希望拷贝某些域,可以在 SELECT 语句后列出这些域:
SELECT LastName,FirstName
INTO Persons_backup
FROM Persons

  • 32位处理器是指处理器的(数据总线)是32位的
1、CPU中的位指的是一个时钟周期可以处理的数据数量。8位为一个字节,32位就是一次可以处理4个字节,64位是一次可以处理8个字节
232位CPU是指数据总线有32位,寄存器是暂存数据和中间结果的单元,因此寄存器的位数指的也是处理数据的长度肯定是和数据总线的根数相同,否则寄存器和CPU内其他单元之间将无法通信,交换数据。
因此32位CPU的32位是包含了寄存器是32位的意思,但其实定义是数据总线的宽度和根数。
A. 如果X→→Y,Y→→Z,则X→→Z
B. 如果X→→Y,Y→→Z,则X→→YZ
C. 如果X→→Y,Y→→Z,则X→→Y Z
D. 如果X→→Y,Y→→Z,则X→→Z-Y
  • 关于SpringMVC,以下说法错误的是?(D
A. SpringMVC的核心入口是DispatcherServlet
B. @RequestMapping注解既可以用在类上也可以用在方法上
C. @PathVariable作用是取出url中的模板变量作为参数
D. controller默认是单例,通过@Scope(“prototype”)注解改为多例,成员变量共享

单例模式下会共享普通成员变量和静态成员变量,多例模式下普通成员变量不共享,静态成员共享.
在开发中,springMVC优先使用单例模式,而且尽量不要在controller中设定成员变量.
如果要定义成员变量并为成员变量赋值可以配置source.properties,通过读取配置文件为成员变量初始化.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值