面试问题整理
- JS合并的优化:
在引用JS和CSS文件的时候,一次引用多个文件(此处文件为压缩文件),使用逗号隔开,这叫静态资源打包,因为浏览器下载静态文件的时候是有线程数限制的,同一时间针对同一域名下的请求有一定数量的限制,超过限制的请求会被阻塞,为了提高性能,服务端会把 css/js文件合并成一个文件(因为都是文本文件,可以直接一次性向用户输出,使得页面更加快速的展现,用户的等待时间变少.
以下为各个浏览器的并发个数限制(查询之后补充):
使用的亚索静态资源的软件:webpack,gulp,grunt;
- sql优化:
- 去掉多余查询字段
- 添加索引,并定期重构,Orcle使用了一个复杂的自平衡B-Tree结构,索引是需要空间存储的,每当表中的记录被修改时,索引夜会被修改,会增加磁盘的I/O,索引需要定期重构;
- 使用exists代替连续and和in,反之 not exists代替not in
- 将记录最少的表写在from字句的最后,将最大过滤条件写在where的最后
- 使用exists替换distinct:
- SQL语句使用大写代替小写,在Java代码中尽量不要使用+连接字符串
- 避免在索引列上使用NOT(扫描全表)和计算
- 使用>=代替>
DBMS在识别>=4的时候回直接跳到4,而>的时候会先跳到3,然后再去寻找大于3的记录
l)不要在索引上使用is null或者is not null,需要经常使用索引的第一列,只有索引的第一列被添加在Where条件之后,Orcle解析查询语句才会经过索引
J)使用Union-all代替Union,因为Union会将Union-all得到的结果排序
K)使用Where代替Orderby,OrderBy语句使用索引的条件很苛刻
L)优化Groupby,避免使用消耗资源的操作,”!=”将不使用索引,”||”和”+”等函数都会停止索引的引用!
- 正向代理和反向代理;
代理服务器:提供代理服务的电脑系统或者其他类型的网络终端,代理网络代替用户去取得信息;
使用代理服务器的理由:提高访问的速度,会缓存请求过的内容到代理服务器;在访问程序前要访问代理服务器,算是多出的一道防火墙,突破了访问限制;
正向代理:位于客户端和原始服务器之间的代理服务器,客户端发送请求给代理服务器,代理服务器向原始服务器发送请求,并将响应返回客户端;一般建设在客户端和原始服务器之间;
反向代理:以代理服务器接受请求,并转发到内部网络,拿到响应返回给客户端,在此过程中,原始服务器的角色是隐藏的;一般建设在服务端
- Zookeeper:分布式的,开源的分布式应用程序协调服务,原本是Hadoop、HBase的一个重要组件,为分布式提供配置维修,域名服务,分布式同步和组服务;
- Dubbo框架使用ZK作为注册中心,服务消费者和提供者都会向ZK注册中心注册自己的URL,同时消费者能拿到需要调用的URL;
- Paxos算法和ZK使用的ZAB协议(Zookeeper原子广播),二者有相同的地方,比如都有一个Leader,用来协调N各Follower的运行,必须有超过半数的Follower正确反馈之后,Leader才能进行提案,这是一般选举算法的基本准则;二者都有一个值来代表Leader的周期;
不同的地方:
ZAB用来构建高可用的分布式数据主备系统,Paxos用来构建分布式一致性状态机系统;
C)Zookeeper的选举算法:FastLeader
ServerID:配置服务器节点的时候给定的ID
Zxid:服务器运行时产生数据的ID,ID越大表示数据越新
Epoch:选举的轮数,随着选举++
Server的状态:Looking,F;;owing,observing,leading
D)几种几点类型:
持久:创建之后一直存在,除非有删除操作,创建节点的客户端失效也不会影响该节点,持久顺序:父节点在创建子节点的时候,会记录子节点创建的顺序,会给每个子节点名字加上一个后缀
临时:创建之后,如果创建客户端会话失效(并不是连接断开),就会消失;
E)ZK对节点的Whtch监听通知不是永久的,是一次性的;只能得到一次变动通知,如果不在继续设置,则不会监听;
F)半数存活即可,单机集群两种方式,集群>=3台机器,必须保持基数来保证选举算法的执行;
G)水平扩容:全部或者单个重启;
H)分布式锁:
1.客户端连接ZK之后在根节点下创建一个临时节点,并Whatch,
2.获取根节点下的子节点列表,判断自己创建的节点是不是最小序号的节点,如果是,则获得锁,否则监听自己前一节点的状态,直至为最小序号节点,获得锁,执行完业务代码之后,删除节点,释放锁;
5.Windows根据端口号杀死进程的方式
Netstat -ano |findStr 端口号
Taskkill -F -PID id;
- 重新理解AOP
是面向对象编程OOP的补充和完善,OOP利用继承和封装和多态的概念定义从上往下的关系,但是不能定义横向的关系;AOP利用一种切面的技术,解剖封装对象内部,将公共部分提取出来,封装到一个可重复利用的模块,成为Aspect;
一种采用动态代理,利用截取消息的方式对该消息进行封装,以取代原有对象的执行;第二种是采用静态织入的方式,引入特定的语法创建方面,使得编译器将内容织入代码;
7.如何让Eclipse打印GC日志
在Eclipse.ini文件中加入以下参数;
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-verbose:gc
-Xloggc:gc.log
8.GC垃圾回收:
-新生代GC(Minor GC):从年轻代空间(包括Eden和Survivor区域)回收内存,非常频繁,一般回收速度很快;
-当JVM无法为一个新的对象分配空间的时候出发,
-内存池被填满的时候,内容会被赋值,指针会从0开始跟踪空闲内存.Eden和Survivor区进行了标记和复制操作,所以不会存在内存片段,写入内存的指针总是停留在所使用的内存池顶部;
-不会影响到永久代,从永久代到年轻代的引用会被当成GC roots,从年轻代到用就嗲的引用在标记阶段被忽略
-Minor GC 会触发"全世界都暂停(Stop thie world)",停止应用线程,时间可以忽略不计.
每次 Minor GC 会清理年轻代的内存。
-老年代GC(Major GC/Full GC):发生在老年代的GC,一般出现Major GC,经常会伴随至少一次的Minor GC(但不是绝对的),MajorGC的速度一般会比Minor GC慢10倍以上;
-Major GC 是清理永久代,在年轻代内存占满时会触发Minor GC;
-Full GC是清理整个堆空间,包括年轻代和永久代
-执行部分收集时,从GC堆的非收集部分(minor GC 只收集年轻代的垃圾,则年轻代属于收集部分,老年代属于非收集部分,从老年代指向年轻代的引用就必须作为Minor GC的GC roots的一部分)指向收集部分的引用,也必须作为GC roots的一部分;
关注点应该放在是会停止应用线程,还是会与应用线程并发处理
9.分布式系统理论:
设计分布式的方法主要有:远程过程调用(rpc)—分布式计算环境(dce)的基础标准成分之一;对象事物监控(otm)-基于corba的面向对象工业标准与事务处理(tp)监控技术的组合;消息队列(messagequeue)-构造分布式应用松耦合的方法;
rpc是dce的成分,是一个由开放软件基金会(osf)发布的应用集成的软件标准。
为什么说rpc模仿自程序的调用/返回结构,它仅提供了client(调用程序)和server(被调用过程)之间的同步数据交换.
中间件是独立程序,为开发者提供了公用于所有环境的应用程序接口,比如dubbo,mq和redis’等中间件,当程序中嵌入其函数调用,便可以利用其运行的特定的操作系统和网络环境功能进行通信;
不同操作系统或主机之间网络通信和同一主机内利用消息队列或者管道进行通信;
消息队列简化了应用之间的数据传输,屏蔽了底层异构操作系统和网络平台,提供了一致的通讯标准和应用开发,确保了分布式计算网络下可靠的跨平台的消息传输和数据交换。它基于消息队列的存储和转发机制,并提供特有的异步传输机制,能够基于消息传输和异步事务处理实现应用整合与数据交换。
10.switch中能否使用string做参数
在1.7之前,switch只能支持byte,short,char,int或者枚举,1.7之后开始支持String
11.Stirng 的intern()方法;
intern()方法会首先从常量池中查找是否存在该常量值,如果常量池中不存在则现在常量池中创建,如果已经存在则直接返回。
比如
String s1=”aa”;
String s2=s1.intern();
System.out.print(s1==s2);//返回true
12.运算符+=会强制将计算后的结果转换为左边的数据类型;
13.Watch的乐观锁的特性?
Redis中的watch命令,可以提供CAS(check and set)的功能,在获取要改动的值之前,首先使用watch命令监控该键,如果其他客户端有修改,那么Redis的事务提交失败;
14.Dns是域名系统(domain name system)由解析器和域名服务器组成,域名服务器是指保存了该网络中所有主机的域名对应的地址,并具有将域名转换为ip的功能的服务器,域名必须对应一个IP,IP不一定有域名。
Tcp/ip协议 三次握手和四次挥手及其状态的迁越,socket的close wait()状态;