一、线程
进程与线程的区别:
- 根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位
- 在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。
- 所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)
- 内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。
- 包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
进程间通信方式:
进程间通信方式有很多,网上一说有十几种。面试的时候说上以下几种差不多:
- ①管道:半双工的通信方式,数据只能单向流动,且只能在有亲缘关系(父子进程或兄弟进程)的进程间使用;
- ②命名管道:FIFO,半双工的通信方式,但允许在无亲缘关系的进程间通信;
- ③消息队列:消息的链表,存放在内核中,并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点;
- ④信号量:是一个计数器,用于控制多个进程间对共享资源的访问;
- ⑤共享内存:映射一段能被其他进程访问的内存,这段内存由一个进程创建,但多个进程都可以访问;
- ⑥套接字
线程间通信方式:
多个线程在处理同一个资源,并且任务不同时,需要线程通信来帮助解决线程之间对同一个变量的使用或操作。就是多个线程在操作同一份数据时, 避免对同一共享变量的争夺。
- ①机制:包括互斥锁、条件变量、读写锁
(互斥锁提供了以排他方式防止数据结构被并发修改的方法。 读写锁允许多个线程同时读共享数据,而对写操作是互斥的。)
条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。
- ②信号量机制(Semaphore):包括无名线程信号量和命名线程信号量
- ③信号机制(Signal):类似进程间的信号处理
线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。
实现多线程的方式?
图一:
线程的状态转换图及常见执行状态
图二:
启动个线程是run()还是start() ?它们的区别?
- start () ;
- run() :封装了被线程执行的代码,直接调用仅仅是普通方法的调用
- start() :启动线程,并由JVM自动调用run()方法
sleep()和wait()方法的区别
- sleep() :必须指时间;不释放锁a
- wait() :可以不指定时间,也可以指定时间;释放锁。
为什么wait() ,notify() ,notifyAll()等方法都定义在0bject类中
- 因为这些方法的调用,是依赖于锁对象的,而同步代码块的锁对象是任意锁
- 而object代码任意的对象,所以,定义在这里面。
二、数据库
数据库三大范式,可以自己搜索看看
导致SQL执行慢的原因
- 先观察,开启慢查询日志,设置相应的阈值(比如超过3秒就是慢SQL),在生产环境跑上个一天过后,看看哪些SQL比较慢。
- Explain和慢SQL分析。比如SQL语句写的烂,索引没有或失效,关联查询太多(有时候是设计缺陷或者不得以的需求)等等。
- Show Profile是比Explain更近一步的执行细节,可以查询到执行每一个SQL都干了什么事,这些事分别花了多少秒。
- 找DBA或者运维对MySQL进行服务器的参数调优。
索引是什么?
索引是对数据库表中一列或多列的值进行排序的一种结构(B树),使用索引可快速访问数据库表中的特定信息。
为什么要使用索引?
就是提高查询性能。
有哪些索引?
主要分为聚集索引(CLUSTERED INDEX)和非聚集索引(NONCLUSTERED INDEX)两种,聚集索引指的是一列或多列的物理顺序和逻辑顺序是一致的,一个数据库表只能有一个聚集索引,我们通常将主键(一般为自增int型)设为聚集索引。而非聚集索引则可以有多个,而且非聚集索引并不会改变数据库表的物理结构。
数据库优化
- 详细的MySQL优化步骤如下:
- 检查数据表结构,改善不完善设计
- 跑一遍主要业务,收集常用的数据库查询SQL
- 分析查询SQL,适当拆分,添加索引等优化查询
- 优化SQL的同时,优化代码逻辑
- 添加本地缓存和redis缓存
SQL语句性能优化 :
- 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
- 应尽量避免在 where 子句中对字段进行 null 值判断,创建表时NULL是默认值,但大多数时候应该使用NOT NULL,或者使用一个特殊的值,如0,-1作为默 认值。
- 应尽量避免在 where 子句中使用!=或<>操作符, MySQL只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE。
索引优化
- 索引并不是越多越好,索引固然可 以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有 必要。
- 应尽可能的避免更新 clustered 索引数据列,因为 clustered 索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新 clustered 索引数据列,那么需要考虑是否应将该索引建为 clustered 索引。
- 并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。
Mysql 中 MyISAM 和 InnoDB 的区别有哪些?
区别:
InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;
InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;
InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高;
如何选择:
- 是否要支持事务,如果要请选择innodb,如果不需要可以考虑MyISAM;
- 如果表中绝大多数都只是读查询,可以考虑MyISAM,如果既有读写也挺频繁,请使用InnoDB。
- 系统奔溃后,MyISAM恢复起来更困难,能否接受;
- MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM),说明其优势是有目共睹的,如果你不知道用什么,那就用InnoDB,至少不会差。
三、java web
MVC及三层架构
图三:
三层组成:
表示层(USL, User Show Layer ;视图层)
- -前台:对应于MVC中的View,用于和用户交互、界面的显示.
- jsp. Js html css jquery 等web前端技术
- 代码位置:
- -后台: 对用于MVC中Controller, 用于控制跳转、 调用业务逻辑层
- Servlet (SpringMVC Struts2) , 位于xxx. servlet包中
业务逻辑层(BLL,Business Logic Layer ;Service层)
- --接收表示层的请求调用
- --组装数据访问层,逻辑性的操作(增删改查,删:查+删)
- 一般位于xxx. service包( 也可以成为:xxx. manager , xx. b1l)
数据访问层(DAL, Data Access Layer; Dao层)
- -直接访问数据库的操作,原子性的操作( 增删改查)
- --般位于:XXX.dao包
三层间的关系:
上层 将请求传递给下层,下层处理后返回给上层
Servlet生命周期简述
(1)加载和实例化
当Servlet容器启动或客户端发送一个请求时,Servlet容器会查找内存中是否存在该Servlet实例,若存在,则直接读取该实例响应请求;如果不存在,就创建一个Servlet实例。
(2) 初始化
实例化后,Servlet容器将调用Servlet的init()方法进行初始化(一些准备工作或资源预加载工作)。
(3)服务
初始化后,Servlet处于能响应请求的就绪状态。当接收到客户端请求时,调用service()的方法处理客户端请求,HttpServlet的service()方法会根据不同的请求 转调不同的doXxx()方法。
(4)销毁
当Servlet容器关闭时,Servlet实例也随时销毁。其间,Servlet容器会调用Servlet 的destroy()方法去判断该Servlet是否应当被释放(或回收资源)。
Tomcat
学习Servlet技术,就需要有一个Servlet运行环境,也就是需要有一个Servlet容器,本文用的是Tomcat。
Tomcat服务器接受客户请求并做出响应的过程如下:
- 客户端(通常都是浏览器)访问Web服务器,发送HTTP请求。
- Web服务器接收到请求后,传递给Servlet容器。
- Servlet容器加载Servlet,产生Servlet实例后,向其传递表示请求和响应的对象。
- Servlet实例使用请求对象得到客户端的请求信息,然后进行相应的处理。
- Servlet实例将处理结果通过响应对象发送回客户端,容器负责确保响应正确送出,同时将控制返回给Web服务器。
什么是session、cookie,它们之间有什么区别?
session是一种识具体用户的机制,它可以代表服务器与浏览器的一次会话过程,指从一个浏览器窗口打开到关闭的这个期间.
Cookie 是由 Web服务器保存在用户浏览器(客户端)上的小文本文件(内容通常经过加密),它可以包含有关用户的信息。
- cookie数据存放再浏览器中,session储存再服务器中。
- cookie安全性不高,别人可以分析存放在本地的cookie并进行cookie欺骗。
- session访问增多,会比较占用服务器的性能。
- 单个cookie保存的数据不会超过4k。
- 可以考虑将登陆信息等重要信息存放为session,其他信息需要保留,可以存放在cookie中。
jsp之九大内置对象与四大域对象,可以自己去看看
https和http的主要区别:
- https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
- http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
- http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
- http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
四、jvm
就推荐java垃圾回收器(算法),面试的时候,问的也比较多