java面试-总结

自己因为面试碰壁,决定继续学习半个月再找工作

本文就用来记录自己学习的过程吧

资料: [java面经]干货整理,Java面试题

 

线程死锁:多个线程,互相等待对方释放对象锁  

解决办法:等待锁顺序一致

 

并发和同步的问题: 锁机制

资料:Java高并发、如何解决

java代码层面的对象锁、数据库层面的数据锁

悲观锁:锁定修改的数据 例如 oracle的 for update;

乐观锁:optimistic-lock:version  对数据库记录,增加版本控制,提交版本必须大于记 录当前版本才能执行更新

 最后复制一些在高并发下面需要常常需要处理的内容:

  • 尽量使用缓存,包括用户缓存,信息缓存等,多花点内存来做缓存,可以大量减少与数据库的交互,提高性能。

  • 用jprofiler等工具找出性能瓶颈,减少额外的开销。

  • 优化数据库查询语句,减少直接使用hibernate等工具的直接生成语句(仅耗时较长的查询做优化)。

  • 优化数据库结构,多做索引,提高查询效率。

  • 统计的功能尽量做缓存,或按每天一统计或定时统计相关报表,避免需要时进行统计的功能。

  • 能使用静态页面的地方尽量使用,减少容器的解析(尽量将动态内容生成静态html来显示)。

  • 解决以上问题后,使用服务器集群来解决单台的瓶颈问题。

高并发的解决方法有俩种:

一种是使用缓存、另一种是使用生成静态页面;还有就是从最基础的地方优化我们写代码减少不必要的资源浪费:(

1.不要频繁的new对象,对于在整个应用中只需要存在一个实例的类使用单例模式.对于String的连接操作,使用StringBuffer或者StringBuilder.对于utility类型的类通过静态方法来访问。

2. 避免使用错误的方式,如Exception可以控制方法推出,但是Exception要保留stacktrace消耗性能,除非必要不要使用 instanceof做条件判断,尽量使用比的条件判断方式.使用JAVA中效率高的类,比如ArrayList比Vector性能好。)

 

垃圾回收算法:垃圾收集算法-Generational Collection

 

ClassLoader:深度解析Java的ClassLoader机制

 

 Forward和Redirect的区别::间接请求转发-重定向(Redirect)  :直接请求转发(Forward)

 

数据库相关

隔离级别    可脏读、不可脏读不可重复读、可重复读可幻读、不可幻读

传播行为:

1. 有当前事务就加入,没有就新建

2. 有当前事务就加入,没有就抛异常

3. 无论有没有都新建

4. 有事务就加入,没有就以非事务执行

5.非事务执行,有事务挂起当前事务

6. 非事务执行,有事务抛出异常

7. 有事务就嵌套事务执行,没有事务就创建新事务

 

MYSQL 存储引擎:

1. MyISAM存储引擎:不支持事务、也不支持外键,优势是访问速度快,对事务完整性没有 要求或者以select,insert为主的应用基本上可以用这个引擎来创建表

2. InnoDB存储引擎*  该存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM引擎,写的处理效率会差一些,并且会占用更多的磁盘空间以保留数据和索引。  InnoDB存储引擎的特点:支持自动增长列,支持外键约束

3. MEMORY存储引擎  存在内存中,支持BTREE索引或者HASH索引

4. Merge存储引擎是一组MyISAM表的组合,这些MyISAM表必须结构完全相同,merge表本身并没有数据,对merge类型的表可以进行查询,更新,删除操作,这些操作实际上是对内部的MyISAM表进行的。

 

MYSQL 主从读写分离:

master:负责增删改-事务性查询

salve:负责select查询  由于只需要负责查询,可以使用MyISAM存储引擎提高查询性能

1、主从只负责各自的读和写,极大程度缓解X锁和S锁争用。  

2、slave可以配置MyISAM引擎,提升查询性能以及节约系统开销。  

3、master直接写是并发的,slave通过主库发送来的binlog恢复数据是异步的。  

4、slave可以单独设置一些参数来提升其读的性能。  

5、增加冗余,提高可用性。  实现主从分离可以使用MySQL中间件如:Atlas

 

分库分表:

水平拆分-分表

垂直拆分-分库

 

索引:索引以及索引的实现

 

B+/-Tree :B+/-Tree原理

 

设计模式

程序之间的低耦合和高聚合

 

网络协议

 

资料:

TCP/IP、HTTP、HTTPS、HTTP2.0

TCP协议的三次握手/四次挥手

三次握手:

喂你能听到吗?

我能听到,你能听到吗?

我也能听到!

三次即可确认连接

四次挥手:

C:我关了

S:关吧

S:我也关了

C:关吧

为什么建立连接是三次,断开连接是四次?

  这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

 

 HTTPS 连接

 

分布式事务

 1. 两阶段提交 :事务处理者分别执行,但不提交, 由协调者 汇总执行结果,然后通知各方,同时提交或同时回滚

缺点:处理过程中,各方会一直锁定资源, 资源占用太高.

2. 补偿性事务: 各处理各的, 如果其中一个失败,则将成功的部分,执行反操作,补偿事务

3. 最终一致性: 基于可靠的消息服务,先处理先行事务,然后将后续事务放入消息队列, 只需要保证最终消息队列中的任务执行成功,即最终一致性

4. 阿里GTS 全局事务服务:需要使用阿里数据库,非开源

 

大数据相关:

资料:

绝对干货,教你四分钟插入1000万条数据到mysql数据库表

10万,提交一次。  然后将max_allowed_packet参数设置更大一些 入100m

 

Dubbo、ZooKeeper

资料:

5分钟让你了解ZooKeeper的功能和原理

ZooKeeper学习总结 第一篇:ZooKeeper快速入门

Dubbo实战入门,良心详解制作

光看看不懂, 周末回家自己搭了再回来补

 

 

Hash算法

HASH 即散列散发,  通过压缩文件,将任意长度的内容,压缩为固定长度的摘要,通过对比摘要来对比文件是否相同

资料: Hash算法总结

 

 

大数据处理

资料:面试题---大数据处理

 

posted @ 2018-10-22 15:05  我是小明呀嘿  阅读(164)  评论(0编辑  收藏  举报