1.介绍下你的项目,sql常用的优化技巧(结构优化,索引优化,sql优化)
(1)不要在建立的索引的数据列上进行下列操作:
避免对索引字段进行计算操作
避免在索引字段上使用not,<>,!=
避免在索引列上使用IS NULL和IS NOT NULL
避免在索引列上出现数据类型转换
避免在索引字段上使用函数
避免建立索引的列中使用空值
(2)SELECT子句中避免使用’*’
(3)使用表的别名(Alias)
(4)ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾
2.谈谈你对分布式和cluster的理解
所谓分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果。
簇(cluster),我们知道磁盘是由一个一个扇区组成的,若干个扇区合为一个簇,文件存取是以簇为单位的,哪怕这个文件只有1个字节。每个簇在文件分配表中都有对应的表项,簇号即为表项号,每个表项占1.5个字节(磁盘空间在10MB以下)或2个字节(磁盘空间在10MB以上)。
3.介绍jvm内存模型和垃圾回收机制(栈帧,堆,方法区,分代回收机制)
JVM内存模型
*1. 栈*
Java栈是与每个线程关联的, JVM在创建每一个线程的时候, 会分配一定的栈空间给线程. 存储局部变量, 引用, 方法, 返回值等.
StackOverflowError: 如果在线程执行的过程中, 栈空间不够用, 那么JVM就会抛出此异常, 这种情况一般是死递归造成的.
*2. 堆*
JVM堆一般分为三个部分:
(1). Young: 年轻代
Young区被分为三个部分, Eden区和两个大小严格相同的Survivor区,其中Survivor区间中, 某一时刻只有其中一个是被使用的,另外一个留做垃圾收集时复制对象用, 在Young区间变满的时候, minor GC就会将存活的对象一到空闲的Survivor区间中, 根据JVM的策略, 在经过几次垃圾收集后, 仍然存活于Suvivor的对象被移动到Tenured区间.
(2) Tenured: 老年代
Tenured区主要保存生命周期长的对象, 一般是一些老的对象, 当一些对象在Young复制转移一定的次数以后, 对象就会被转移到Tenured区,一般如果系统中用了application级别的缓存, 缓存中的对象往往会被转移到这一区间.
(3) Perm 持久代:
Perm代主要保存class, method, filed等对象, 这部分空间一般不会溢出.
Java.lang.OutofMemoryError: PermGen space的错误, 造成这个错误的很大原因就是可能每次都重新部署,但重新部署后, 类的class没有被卸载掉, 这样就造成了大量class对象保存在了perm中, 这种情况下, 一般重新启动应用服务器可以解决问题.
*3. 堆的大小*
-Xmx:指定JVM堆得最大内存,在JVM启动以后,会分配-Xmx参数指定大小的内存给JVM,但是不一定全部使用,JVM会根据-Xms参数来调节真正用于JVM的内存
-Xms :指定了JVM初始启动以后初始化内存
-Xmx -Xms之差就是三个Virtual空间的总大小(年轻代、年老代、持久代)
JVM垃圾回收机制
分代垃圾回收
不同的对象生命周期不同, 与业务信息有关的对象生命周期较长,如Http请求中的Session对象, 线程, socket连接. 程序运行过程中的临时变量生命周期较短,如String对象.
把不同生命周期的对象放在不同代上,不同代上采用最合适它的垃圾回收方式进行回收。JVM中共划分为三个代:年轻代、年老代和持久代,其中持久代主要存放Java类的类信息,与垃圾收集要收集的Java对象关系不大,年轻代和年老代的划分是对垃圾收集影响较大的。
年轻代: 存放所有新生的对象
年老代: 在年轻代中经历了N次垃圾回收仍然存活的对象,将被放到年老代中,故都是一些生命周期较长的对象;
持久代: 用于存放静态文件, 如Java类, 方法等, (持久代对垃圾回收没有显著影响, 但是有些应用可能动态生成或者调用一些class,例如Hibernate等, 在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类)
新生代的垃圾收集器命名为"minor GC", l老生代的GC命名为"full GC" 或 “Major GC”, 其中用System.gc()强制执行的是Full GC.
4.对CMS回收了解吗
CMS(Concurrent Mark-Sweep)是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。在启动JVM参数加上-XX:+UseConcMarkSweepGC ,这个参数表示对于老年代的回收采用CMS。CMS采用的基础算法是:标记—清除。
5.String的引用在哪里,对象在哪里
在java中引用也是对象。
(1)堆栈:一般存储引用和基本类型变量,堆栈主要是通过堆栈指针上下移动来对内存进行分配和释放。
基本类型变量并不适应于new进行创建,因为其所占的内存较小。
(2)堆:用于存储java对象,当程序执行new的时候,堆就会分配一个空间给这个对象,记住堆进行内存的分配和释放是比堆栈进行存储和释放内存消耗更多的时间,这就是基本类型变量要存在堆栈中了,因为基本类型变量是用的最频繁的,频繁的存储和释放内存,在消耗更多的时候,性能可想而知的
6.说说redis的数据类型
(1)全局key操作
(2)String(字符串)
(3)Hashes类型:(map)
(4)List类型
(5)set类型
(6)Sorted-Sets类型
7.为什么要使用缓存
缓存离客户端更近,因此,从缓存请求内容比从源服务器所用时间更少,呈现速度更快,网站就显得更灵敏。
8.在实际项目中如何解决并发问题,并发和并行的区别
大型网站,比如门户网站,在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。HTML静态化、图片服务器分离、数据库集群、库表散列、缓存、镜像、负载均衡、CDN加速技术。
并发与并行是两个既相似而又不相同的概念:并发性,又称共行性,是指能处理多个同时性活动的能力;并行是指同时发生的两个并发事件,具有并发的含义,而并发则不一定并行,也亦是说并发事件之间不一定要同一时刻发生。
并发的实质是一个物理CPU(也可以多个物理CPU) 在若干道程序之间多路复用,并发性是对有限物理资源强制行使多用户共享以提高效率。
并行性指两个或两个以上事件或活动在同一时刻发生。在多道程序环境下,并行性使多个程序同一时刻可在不同CPU上同时执行。
9.运行时异常和一般异常有何异同
Java提供了两类主要的异常:运行时异常runtime exception和一般异常checked exception。checked 异常。对于后者这种异常,JAVA要求程序员对其进行catch。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。
运行时异常我们可以不处理。这样的异常由虚拟机接管。出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。
10.Jdk1.6 1.7 1.8 版本之间有何不同
(1)jdk1.8广义上来说,可以说是1.7的增强版,即1.8的功能更加强大,如:1.8中Switch语句支持string类型 、 Try-with-resource语句 、5 数字类型的下划线表示 更友好的表示方式、在可变参数方法中传递非具体化参数,改进编译警告和错误 ;这个太多了,
(2) 需要注意的是,你用1.8版本开发的程序如果换到其余的1.7版本下可能会报错,即无法运行,而1.7版本下开发的程序,在1.8版本下应该可以正常的运行。
因为版本是自上而下兼容,而自下而上,可能会出问题
(3)所以建议在真正的开发过程中建议使用1.6或1.7版本(1.8还不是很普遍)