一、Java 基础 1.JDK 和 JRE 有什么区别? JDK用于开发,是给开发人员用的,JRE是java程序的运行环境。 简单来说JDK就是用于开发,JRE就是用于运行。 2.== 和 equals 的区别是什么? ==比较的是地址,equals比较的是内容 3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗? 不一定,如果hashCode的算法改变了特定的一种情况,及时hashCode相同,equals也不一定相同。 例如 我们改写下hashCode()的算法为:num%3 ; 当num=1时,余数为1; 当num=4时,余数也为1; 这时他们的hashCode()是相同的,但equals()却是不同的。 4.final 在 java 中有什么作用? final可以用在三个地方 类:用在类上面该类不能被继承 方法:用在方法上面该方法不能被重写 变量:用在变量上面是常量 5.java 中的 Math.round(-1.5) 等于多少? -1 口诀:四舍六入无考虑,五后非零就进一,五后皆零看奇偶,五前为偶应舍去,五前为奇要进一! 6.String 属于基础的数据类型吗? 不属于,它是一个类 7.java 中操作字符串都有哪些类?它们之间有什么区别? String,StringBuffer,StringBuilder String每次对字符串的操作都会产生一个新的对象 StringBuffer,和StringBuilder操作字符串都不会产生新的对象 StringBuffer线程安全效率低,StringBuilder效率高线程不安全,对字符串有频繁操作的建议使用StringBuilder 8.String str="i"与 String str=new String(“i”)一样吗? 不一样,前面的写法是将字符串存储在常量池中,后面是放在堆内容中, 常量池中没有重复的数据, 9.如何将字符串反转? 可以使用StringBuilder或StringBuffer的reverse()方法 或自定义,原理:使用循环从字符串最后字符跟首字符一次调换 10.String 类的常用方法都有那些? blog.csdn.net/qq_25406669… length():获取字符串长度 charAt(int index):获取字符串某一位置字符 substring(int beginIndex):截取字符串 indexof():查找指定字符串索引 public int compareTo(String str) //该方法是对字符串内容按字典顺序进行大小比较, //通过返回的整数值指明当前字符串与参数字符串的大小关系。 //若当前对象比参数大则返回正整数,反之返回负整数,相等返回0。
public int compareToIgnoreCase (String str) //与compareTo方法相似,但忽略大小写。
public boolean equals(Object obj) //比较当前字符串和参数字符串,在两个字符串相等的时候返回true,否则返回false。
public boolean equalsIgnoreCase(String str) //与equals方法相似,但忽略大小写。 String[] split(String str) split(String str):字符串分割 public String replace(char oldChar, charnewChar):字符串替换 11.抽象类必须要有抽象方法吗? 不一定,也可以有普通方法 12.普通类和抽象类有哪些区别? 普通类中不能有抽象方法,抽象类可以 抽象类用abstract修饰 普通类可以实例化,抽象类必须指向实现所有抽象方法的子类 13.抽象类能使用 final 修饰吗? 不能,因为抽象类就是要给子类继承的重写方法的 14.接口和抽象类有什么区别? www.jianshu.com/p/846ac4d75… 修饰符关键字不同 抽象类里可以有普通方法和抽象方法,接口中都是抽象方法(jdk1.8后可以有私有静态方法) 接口中的变量都是公共静态常量,抽象类中可以有普通变量 接口可以多继承,类只能单继承 15.java 中 IO 流分为几种? 按照流的流向分,可以分为输入流和输出流; 按照操作单元划分,可以划分为字节流和字符流; 按照流的角色划分为节点流和处理流。 16.BIO、NIO、AIO 有什么区别? BIO:同步阻塞I/O模式,NIO:同时支持阻塞与非阻塞模式,AIO:异步非阻塞I/O模型 17.Files的常用方法都有哪些? Files.exists():检测文件路径是否存在。 Files.createFile():创建文件。 Files.createDirectory():创建文件夹。 Files.delete():删除一个文件或目录。 Files.copy():复制文件。 Files.move():移动文件。 Files.size():查看文件个数。 Files.read():读取文件。 Files.write():写入文件。 二、容器 18.java 容器都有哪些? Collection:子接口有List,set,List有Arraylist,Linkedlist,voctor实现类 set有hashset,treeset实现类,linkedHashset实现类 Map接口:Hashmap,Hashtable,TreeMap,LinkedHashMap,Propeties 19.Collection 和 Collections 有什么区别? Collection是集合接口,Collections是操作集合的工具类,类似于Array和Arrays的关系 20.List、Set、Map 之间的区别是什么? List集合是有序可重复的, Set是无序不可重复的, List和set是单列集合 Map是双列集合,以键值对的关系存储数据 21.HashMap 和 Hashtable 有什么区别? HashMap线程不安全,效率高 可以存储null的key和value ,Hashtable线程安全,效率低 不可以存储null的key和value 22.如何决定使用 HashMap 还是 TreeMap? 存储同一种类型数据的时候用TreeMap, 反之用Hashmap 23.说一下 HashMap 的实现原理? Hashmap底层是以数组+链表+红黑树(jdk1.8)方式存储,创建后默认长度是16, 添加元素规则,首先调用key所在类的hashcode()方法通过某种算法计算得到哈希值, 可能已经执行过多次put map.put(key1,value1); 首先,调用key1所在类的hashCode()计算key1哈希值,次哈希值经过某算法计算以后,得到Entry数组中的存放位置 如果该位置为空,则直接添加, 如果不为空,再去比较此要添加位置的哈希值,如果哈希值不同则添加 如果哈希值还相同,则调用equals()方法,比较返回false 则添加 返回true 则替换 24.说一下 HashSet 的实现原理? HashSet 的父类接口是Set集合 HashSet 是以Hash表结构存储 HashSet 多线程不安全 HashMap 可以存null值, HashSet的底层是用HashMap实现的,将HashMap 值的那一列隐藏,就是HashSet (存在键的那一列) 一般子类需要用到HashCode方法,并且进行重写。
25.ArrayList 和 LinkedList 的区别是什么? ArayList采用动态数组的方式存储数据,查询效率高 LinkedList采用双向链表的方式存储数据,对于频繁插入删除效率比ArrayList快 26.如何实现数组和 List 之间的转换? 数组→List:使用Arrays.aslist()方法 List→数组: 使用toArray()方法 注意该方法返回值是Object[]数组类型注意类型转换 27.ArrayList 和 Vector 的区别是什么? ArrayList线程不安全底层 扩容是原来的1.5倍 ,Vector线程安全(这是古老的实现类),扩容是2倍 28.Array 和 ArrayList 有何区别? Array是数组,ArrayList是集合,最大区别是存储方式不同 29.在 Queue 中 poll()和 remove()有什么区别? 30.哪些集合类是线程安全的? Vector ,HashTable,baiStringBuffer 31.迭代器 Iterator 是什么? 用来遍历集合的一个接口 32.Iterator 怎么使用?有什么特点? 使用主要三个方法 iterrator() hasnext() next() 33.Iterator 和 ListIterator 有什么区别?
- ListIterator有add()方法,bai可以向List中添加对象,而Iterator不能
- ListIterator和duIterator都有hasNext()和next()方法,可以实现顺序向zhi后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。
- ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
- 都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iierator仅能遍历,不能修改。 34.怎么确保一个集合不能被修改? Collections. unmodifiableCollection(Collection c) 方法来创建一个只读集合,这样改变集合的任何操作都会抛出 Java.lang.UnsupportedOperationException 异常。 三、多线程 35.并行和并发有什么区别? 并行:多个cpu同时执行多个任务。比如多个人做不同的事 并发:一个Cpu同时执行多个任务。比如 秒杀,多个人做同一个事 36.线程和进程的区别? 线程是一个任务的执行路径 进程是一个程序的一次执行过程,或是正再运行的一个程序 37.守护线程是什么? 守护线程在虚拟机中,当所有线程只有守护线程的时候将退出虚拟机。例如当我程序退出了,要使程序当中的任务都结束,我们就可以设置为守护线程。也尽量不要用在有数据操作的线程上。 使用线程对象.setdaemon()方法 参数 true或false true就是守护线程 38.创建线程有哪几种方式? 四种方式 1)继承Thread类创建线程 2)实现Runnable接口创建线程 3)使用Callable和Future创建线程 4)使用线程池例如用Executor框架 39.说一下 runnable 和 callable 有什么区别? callable重写的是call()方法,比runnable更强大 使用callable可以有返回值 方法可以抛出异常高 支持泛型的返回值 需要借助FutureTask类比如获取返回结果
40.线程有哪些状态? 创建状态→就绪状态→运行状态→阻塞状态→死亡状态 其中运行状态后可能会阻塞也可能不会阻塞直接死亡 41.sleep() 和 wait() 有什么区别? sleep()是Thread()类的方法,wait()是Object类的方法 调用sleep()方法不会释放锁,等时间到了自动恢复 调用wait()会释放锁进入等待队列,待调用notify()/notifyAll()唤醒指定的线程或者所有线程,才进入对象锁定池准备获得对象锁进入运行状态。 3、wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)。 4、sleep()方法必须捕获异常InterruptedException,而wait()\notify()以及notifyAll()不需要捕获异常。 42.notify()和 notifyAll()有什么区别? notify()唤醒一个线程,notifyAll()唤醒所有线程 该方法和wati()方法都必须是同步代码快或同步方法的同步监视器。 43.线程的 run()和 start()有什么区别? run()方法只是一个普通方法,不能启动多线程,只是主线程调用而已,start()才是启动线程 44.创建线程池有哪几种方式? blog.csdn.net/ITzhanghao/… /**
-
使用线程池创建线程
-
@author lzc
-
@create 2020-08-05 16:56 */ public class ThreadPool {
public static void main(String[] args) { //1提供指定线程数量的线程池 ExecutorService executorService1= Executors.newFixedThreadPool(10);
//设置线程池的属性 ThreadPoolExecutor executorService= (ThreadPoolExecutor) executorService1; executorService.setCorePoolSize(15); //2执行指定的线程的操作。需要提供实现Runnable接口或Callable接口实现类的对象 executorService.submit(new Mythread());//适合使用于Runnable //executorService.execute();//适合使用于Callable //3关闭连接池 executorService.shutdown();//关闭线程池}
}
class Mythread implements Runnable{
@Override
public void run() {
for (int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+"ss"+i);
}
}
} 45.线程池都有哪些状态? www.cnblogs.com/ConstXiong/… 46.线程池中 submit()和 execute()方法有什么区别? submit()适合使用于Runnable execute()适合使用于Callable 返回值是Futuretask,还可以获取返回值 47.在 java 程序中怎么保证多线程的运行安全? synchronized 使用同步代码块或同步方法 ReentranLock 48.多线程锁的升级原理是什么?
49.什么是死锁? 不同线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的资源,就形成了线程的死锁。 50.怎么防止死锁? 专门的算法,原则 少用同步资源的定义 减少同步资源的嵌套 51.ThreadLocal 是什么?有哪些使用场景? ThreadLocal 是线程本地存储,在每个线程中都创建了一个 ThreadLocalMap 对象,每个线程可以访问自己内部 ThreadLocalMap 对象内的 value。 经典应用就是为每个线程分配一个JDBC连接,这样就不会因为关闭了A连接B连接就使用不了。 主要有三个方法 set() 作用: 首先获取当前线程,并根据当前线程获取一个Map 如果获取的Map不为空,则将参数设置到Map中(当前ThreadLocal的应用作为key) 如果Map为空,则给该线程创建Map,并设置初始值 get():
remove()
51.ThreadLocal 与synchronized 的区别?
52.说一下 synchronized 底层实现原理? 53.synchronized 和 volatile 的区别是什么? (1)、volatile只能作用于变量,使用范围较小。synchronized可以用在变量、方法、类、同步代码块等,使用范围比较广。 (2)、volatile只能保证可见性和有序性,不能保证原子性。而可见性、有序性、原子性synchronized都可以包证。 (3)、volatile不会造成线程阻塞。synchronized可能会造成线程阻塞。 54.synchronized 和 Lock 有什么区别? synchronized自动释放锁,lock手动释放锁 55.synchronized 和 ReentrantLock 区别是什么? synchronized自动释放锁,ReentrantLock 是Lock接口的实现类手动释放锁 实际情况中主要用synchronized,也可以用lock lock更灵活 56.说一下 atomic 的原理? JDK Atomic开头的类,是通过 CAS 原理解决并发情况下原子性问题。 CAS 包含 3 个参数,CAS(V, E, N)。V 表示需要更新的变量,E 表示变量当前期望值,N 表示更新为的值。只有当变量 V 的值等于 E 时,变量 V 的值才会被更新为 N。如果变量 V 的值不等于 E ,说明变量 V 的值已经被更新过,当前线程什么也不做,返回更新失败。 当多个线程同时使用 CAS 更新一个变量时,只有一个线程可以更新成功,其他都失败。失败的线程不会被挂起,可以继续重试 CAS,也可以放弃操作。 CAS 操作的原子性是通过 CPU 单条指令完成而保障的。JDK 中是通过 Unsafe 类中的 API 完成的。 在并发量很高的情况,会有大量 CAS 更新失败,所以需要慎用。
四、反射 57.什么是反射?
官方:JAVA中反射bai是动态获取信息以及动态调用对象方法的一种反射du机制。
Java反射就是在运行zhi状态中,对于任意一个类,dao都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。而这也是Java被视为动态语言的一个关键性质。
Java反射的功能是在运行时判断任意一个对象所属的类,在运行时构造任意一个类的对象,在运行时判断任意一个类所具有的成员变量和方法,在运行时调用任意一个对象的方法,生成动态代理。 自己的理解:获取运行时类class,动态的获取运行的具体类的信息。 58.什么是 java 序列化?什么情况下需要序列化? 把java中的对象信息保存到文件中,不同应用之间需要传递数据时,并且这个数据是一个对象的话,需要序列化。 要序列化需要实现Serializable接口可以把对象转化为字节数据,再通过流的方式存储到文件中。 59.动态代理是什么?有哪些应用? 就是在某个方法上面想额外加一些处理,比如日志,事务等等,就可以创建一个新的类,叫代理类,该类不仅有原来的方法,还有额外的一些新类。该类不是自己创建的,是动态生成的。 60.怎么实现动态代理? 动态代理实现:首先必须定义一个接口,还要有一个InvocationHandler(将实现接口的类的对象传递给它)处理类。再有一个工具类Proxy(习惯性将其称为代理类,因为调用他的newInstance()可以产生代理对象,其实他只是一个产生代理对象的工具类)。利用到InvocationHandler,拼接代理类源码,将其编译生成代理类的二进制码,利用加载器加载,并将其实例化产生代理对象,最后返回。 动态代理的应用:Spring的AOP,加事务,加权限,加日志。 五、对象拷贝 61.为什么要使用克隆? 原型模式设计模式,可以提高效率 Java 自带的原型模式基于内存二进制流的复制,在性能上比直接 new 一个对象更加优良。 可以使用深克隆方式保存对象的状态,使用原型模式将对象复制一份,并将其状态保存起来,简化了创建对象的过程,以便在需要的时候使用(例如恢复到历史某一状态),可辅助实现撤销操作。 62.如何实现对象克隆? 需要拷贝的对象实现Cloneable接口,重写Object类的clone()方法 63.深拷贝和浅拷贝区别是什么? 若克隆对象中存在引用类型的属性,深克隆会将此属性完全拷贝一份,而浅克隆仅仅是拷贝一份此属性的引用。 六、Java Web 64.jsp 和 servlet 有什么区别? 简单理解:jsp页面上可以写java代码和页面的代码,可以说是servlet的扩展。 servlet只是用来处理服务器和客户端之间业务逻辑的一个中间层。 65.jsp 有哪些内置对象?作用分别是什么? request 用户端请求,此请求会包含来自GET/POST请求的参数 response 网页传回用户端的回应 pageContext 网页的属性是在这里管理 session 与请求有关的会话期 application servlet 正在执行的内容 out 用来传送回应的输出 config servlet的构架部件 page JSP网页本身 exception 针对错误网页,未捕捉的例外 66.说一下 jsp 的 4 种作用域? JSP四大作用域分别为: page,:在当前页面有效 request :在一次请求中有效 session,:在整个浏览器页面有效,关闭浏览器就没效了,也可以自定义关闭时间,也可以通setMaxInactiveInterval(int)方法进行设置,或是通过invalidate()方法强制结束当前会话。 application :在整个程序中有效,不停止程序就一直有效. 67.session 和 cookie 有什么区别? www.cnblogs.com/mark5/p/116… 68.说一下 session 的工作原理? 当客户端访问服务器,服务器会设置一个session,并给一个sessionid发给客户端浏览器,浏览器把这个id保存在内存中,当浏览器关闭这个sessionid就结束。 69.如果客户端禁止 cookie 能实现 session 还能用吗? 当然--------不能用了 因为服务端是根据session的id来确定当前对话所对应的的服务器,而session id 是通过cookie来传递的,禁用cookie相当于失去了sessionID,也就得不到session了。 70.spring mvc 和 struts 的区别是什么? 71.如何避免 sql 注入? PreparedStatement对象,预编译 严格限制 Web 应用的数据库的操作权限,给连接数据库的用户提供满足需要的最低权限,最大限度的减少注入攻击对数据库的危害 校验参数的数据格式是否合法(可以使用正则或特殊字符的判断) 对进入数据库的特殊字符进行转义处理,或编码转换 预编译 SQL(Java 中使用 PreparedStatement),参数化查询方式,避免 SQL 拼接 发布前,利用工具进行 SQL 注入检测 报错信息不要包含 SQL 信息输出到 Web 页面 72.什么是 XSS 攻击,如何避免? 73.什么是 CSRF 攻击,如何避免? 七、异常 74.throw 和 throws 的区别? throw抛出异常 throws声明异常 75.final、finally、finalize 有什么区别? final是修饰符 finally用与处理异常的 finalize是一个方法 76.try-catch-finally 中哪个部分可以省略? catch块或finally块 77.try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗? 会 78.常见的异常类有哪些? (1)NullPointerException 当应用程序试图访问空对象时,则抛出该异常。 (2)SQLException 提供关于数据库访问错误或其他错误信息的异常。 (3)IndexOutOfBoundsException指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。 (4)NumberFormatException当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。 (5)FileNotFoundException当试图打开指定路径名表示的文件失败时,抛出此异常。 (6)IOException当发生某种I/O异常时,抛出此异常。此类是失败或中断的I/O操作生成的异常的通用类。 (7)ClassCastException当试图将对象强制转换为不是实例的子类时,抛出该异常。 (8)ArrayStoreException试图将错误类型的对象存储到一个对象数组时抛出的异常。 (9)IllegalArgumentException 抛出的异常表明向方法传递了一个不合法或不正确的参数。 (10)ArithmeticException当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例。 (11)NegativeArraySizeException如果应用程序试图创建大小为负的数组,则抛出该异常。 (12)NoSuchMethodException无法找到某一特定方法时,抛出该异常。 (13)SecurityException由安全管理器抛出的异常,指示存在安全侵犯。 (14)UnsupportedOperationException当不支持请求的操作时,抛出该异常。 (15)RuntimeExceptionRuntimeException 是那些可能在Java虚拟机正常运行期间抛出的异常的超类。 springboot处理异常
八、网络 79.http 响应码 301 和 302 代表的是什么?有什么区别? 301 表示被请求 url 永久转移到新的 url;302 表示被请求 url 临时转移到新的 url。 301 搜索引擎会索引新 url 和新 url 页面的内容;302 搜索引擎可能会索引旧 url 和 新 url 的页面内容。 80.forward 和 redirect 的区别? 转发地址栏url不会变,redirect会变, 转发是一次请求,重定向是两次请求 81.简述 tcp 和 udp的区别? TCP:可靠的数据传输,三次握手,发送大数据效率低 UCP:不可靠,只管发数据,以数据报形式发数据,数据报限定为64k,效率高 82.tcp 为什么要三次握手,两次不行吗?为什么? 这样大大提高数据传输的有效性 83.说一下 tcp 粘包是怎么产生的? 84.OSI 的七层模型都有哪些? 物理层(PH)、数据链路层(DL)、网络层(N)、传输层(T)、会话层(S)、表示层(P)、应用层(A) 85.get 和 post 请求有哪些区别? get: 1请求参数在请求行中,在url后 2请求的url长度有限制的 3不太安全 post: 1请求参数在请求体中, 2请求的url长度没有限制 3安全 86.如何实现跨域? 87.说一下 JSONP 实现原理? 九、设计模式 88.说一下你熟悉的设计模式? 单例模式,
懒汉式,顾名思义就是实例在用到的时候才去创建,“比较懒”,用的时候才去检查有没有实例,如果有则返回,没有则新建。有线程安全和线程不安全两种写法,区别就是synchronized关键字。
饿汉式,从名字上也很好理解,就是“比较勤”,实例在初始化的时候就已经建好了,不管你有没有用到,都先建好了再说。好处是没有线程安全的问题,坏处是浪费内存空间。
双检锁,又叫双重校验锁,综合了懒汉式和饿汉式两者的优缺点整合而成。看上面代码实现中,特点是在synchronized关键字内外都加了一层 if 条件判断,这样既保证了线程安全,又比直接上锁提高了执行效率,还节省了内存空间。
静态内部类的方式效果类似双检锁,但实现更简单。但这种方式只适用于静态域的情况,双检锁方式可在实例域需要延迟初始化时使用。
枚举的方式是比较少见的一种实现方式,但是看上面的代码实现,却更简洁清晰。并且她还自动支持序列化机制,绝对防止多次实例化。 原型模式: 用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节 简单工厂模式: 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中,定义一个简单工厂类,根据不同种类产品生产出不同产品。这满足创建型模式中所要求的“创建与使用相分离”的特点。 工厂方法模式: 对简单工厂模式的升级,定义与结构:工厂用来生产产品,工厂有一个抽象工厂,和具体工厂,产品也是有抽象产品,和他的具体产品,通过工厂的具体工厂来创建对应的具体产品一一对应。 抽象工厂模式 对工厂方法模式的升级:原先是一个工厂生产一个产品,现在可以一个工厂生产具体多个产品。 代理模式: 在代码中,一般代理会被理解为代码增强,实际上就是在原代码逻辑前后增加一些代码逻辑,而使调用者无感知。 根据代理的创建时期,代理模式分为静态代理和动态代理。 静态:由程序员创建代理类或特定工具自动生成源代码再对其编译,在程序运行前代理类的 .class 文件就已经存在了。 动态:在程序运行时,运用反射机制动态创建而成 89.简单工厂和抽象工厂有什么区别?
89.什么是建造者模式? 建造者模式唯一区别于工厂模式的是针对复杂对象的创建。也就是说,如果创建简单对象,通常都是使用工厂模式进行创建,而如果创建复杂对象,就可以考虑使用建造者模式。 指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的 有四个身份:产品,抽象建造者,指挥者,建造者 先说下每个身份做的事情: 产品:就是我们最终要得到的东西 抽象建造者:就是要得到这个产品所需要做的事情,产品有非常多类,定义为抽象的具体是什么产品由建造者实现。 建造者:就是来制造产品。 指挥者:就是来调用具体的建造者来制造产品。 这个模式最终的目的也是解耦 十、Spring/Spring MVC 90.为什么要使用 spring? 1.方便解耦,便于开发(Spring就是一个大工厂,可以将所有对象的创建和依赖关系维护都交给spring管理) 2.spring支持aop编程(spring提供面向切面编程,可以很方便的实现对程序进行权限拦截和运行监控等功能) 3.声明式事务的支持(通过配置就完成对事务的支持,不需要手动编程) 4.方便程序的测试,spring 对junit4支持,可以通过注解方便的测试spring 程序 5.方便集成各种优秀的框架() 6.降低javaEE API的使用难度(Spring 对javaEE开发中非常难用的一些API 例如JDBC,javaMail,远程调用等,都提供了封装,是这些API应用难度大大降低) 91.解释一下什么是 aop? 面向切面编程,简单来说就是把要执行的重复代码抽取出来,然后利用动态代理的方式在不改变源码的情况下,对我们已有的方法进行增强。典型的就是事务的控制。 92.解释一下什么是 ioc? 用来解决程序间的依赖关系,解耦合,叫做控制反转,相当于我们传统的创对象都是new的,使用它就是把这个事交给工厂创建。 93.spring 有哪些主要模块? Spring有七大功能模块,分别是Spring Core,AOP,ORM,DAO,MVC,WEB,Context。 1,Spring Core Core模块是Spring的核心类库,Spring的所有功能都依赖于该类库,Core主要实现IOC功能,Sprign的所有功能都是借助IOC实现的。 2,AOP AOP模块是Spring的AOP库,提供了AOP(拦截器)机制,并提供常用的拦截器,供用户自定义和配置。 3,ORM Spring 的ORM模块提供对常用的ORM框架的管理和辅助支持,Spring支持常用的Hibernate,ibtas,jdao等框架的支持,Spring本身并不对ORM进行实现,仅对常见的ORM框架进行封装,并对其进行管理 4,DAO模块 Spring 提供对JDBC的支持,对JDBC进行封装,允许JDBC使用Spring资源,并能统一管理JDBC事物,并不对JDBC进行实现。(执行sql语句) 5,WEB模块 WEB模块提供对常见框架如Struts1,WEBWORK(Struts 2),JSF的支持,Spring能够管理这些框架,将Spring的资源注入给框架,也能在这些框架的前后插入拦截器。 6,Context模块 Context模块提供框架式的Bean访问方式,其他程序可以通过Context访问Spring的Bean资源,相当于资源注入。 7,MVC模块 WEB MVC模块为Spring提供了一套轻量级的MVC实现,在Spring的开发中,我们既可以用Struts也可以用Spring自己的MVC框架,相对于Struts,Spring自己的MVC框架更加简洁和方便。 94.spring 常用的注入方式有哪些? 构造注入,set注入 95.spring 中的 bean 是线程安全的吗? 默认不是线程安全的,因为默认bean是单例模式,不过可以设置为多例模式。 96.spring 支持几种 bean 的作用域? singleton:单例模式 prototype:多例模式 request:作用于一次web请求 session:作用于一次回话 global-session:作用于集群环境的回话,不是集群就是一次回话 97.spring 自动装配 bean 有哪些方式? no - 这是默认设置,表示没有自动装配。应使用显式 Bean 引用进行装配。 byName - 它根据 Bean 的名称注入对象依赖项。它匹配并装配其属性与 XML 文件中由相同名称定义的 Bean 。 【最常用】byType - 它根据类型注入对象依赖项。如果属性的类型与 XML 文件中的一个 Bean 类型匹配,则匹配并装配属性。 构造函数 - 它通过调用类的构造函数来注入依赖项。它有大量的参数。 autodetect - 首先容器尝试通过构造函数使用 autowire 装配,如果不能,则尝试通过 byType 自动装配。 98.spring 事务实现方式有哪些? xml配置。注解,编程式 99.说一下 spring 的事务隔离? ISOLATION_DEFAULT:用底层数据库的设置隔离级别,数据库设置的是什么我就用什么; ISOLATIONREADUNCOMMITTED:未提交读,最低隔离级别、事务未提交前,就可被其他事务读取(会出现幻读、脏读、不可重复读); ISOLATIONREADCOMMITTED:提交读,一个事务提交后才能被其他事务读取到(会造成幻读、不可重复读),SQL server 的默认级别; ISOLATIONREPEATABLEREAD:可重复读,保证多次读取同一个数据时,其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交的数据(会造成幻读),MySQL 的默认级别; ISOLATION_SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读、不可重复读、幻读。 脏读 :表示一个事务能够读取另一个事务中还未提交的数据。比如,某个事务尝试插入记录 A,此时该事务还未提交,然后另一个事务尝试读取到了记录 A。 不可重复读 :是指在一个事务内,多次读同一数据。 幻读 :指同一个事务内多次查询返回的结果集不一样。比如同一个事务 A 第一次查询时候有 n 条记录,但是第二次同等条件下查询却有 n+1 条记录,这就好像产生了幻觉。发生幻读的原因也是另外一个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数据行的记录就变多或者变少了。 100.说一下 spring mvc 运行流程? 1、 用户向服务端发送一次请求,这个请求会先到前端控制器DispatcherServlet(也叫中央控制器)。 2、DispatcherServlet接收到请求后会调用HandlerMapping处理器映射器。由此得知,该请求该由哪个Controller来处理(并未调用Controller,只是得知) 3、DispatcherServlet调用HandlerAdapter处理器适配器,告诉处理器适配器应该要去执行哪个Controller 4、HandlerAdapter处理器适配器去执行Controller并得到ModelAndView(数据和视图),并层层返回给DispatcherServlet 5、DispatcherServlet将ModelAndView交给ViewReslover视图解析器解析,然后返回真正的视图。 6、DispatcherServlet将模型数据填充到视图中 7、DispatcherServlet将结果响应给用户
101.spring mvc 有哪些组件? DispatcherServlet:前端控制器,也称为中央控制器,它是整个请求响应的控制中心,组件的调用由它统一调度。 HandlerMapping:处理器映射器,它根据用户访问的 URL 映射到对应的后端处理器 Handler。也就是说它知道处理用户请求的后端处理器,但是它并不执行后端处理器,而是将处理器告诉给中央处理器。 HandlerAdapter:处理器适配器,它调用后端处理器中的方法,返回逻辑视图 ModelAndView 对象。 ViewResolver:视图解析器,将 ModelAndView 逻辑视图解析为具体的视图(如 JSP)。 Handler:后端处理器,对用户具体请求进行处理,也就是我们编写的 Controller 类。 102.@RequestMapping 的作用是什么? 用于建立请求 URL 和处理请求方法之间的对应关系。 103.@Autowired 的作用是什么? 从容器中寻找相同于标记着该注解的变量的类型的组件,把该组件赋值到该变量当中去。 十一、Spring Boot/Spring Cloud 104.什么是 spring boot?
springboot就是Spring开源框架下的子项目,是Spring的一站式解决方案,主要是简化了spring的使用难度,降低了对配置文件的要求,使得开发人员能够更容易得上手。 105.为什么要用 spring boot? SpringBoot有很多得优点 提供自动配置,搭建spring应用的脚手架 简化了Spring配置文件, 没有代码和XML文件的生成 内置TomCat 能够独立运行 简化监控 106.spring boot 核心配置文件是什么? application.properties||application.yml 107.spring boot 配置文件有哪几种类型?它们有什么区别? yml,properties 108.spring boot 有哪些方式可以实现热部署? spring-boot-devtools依赖 109.jpa 和 hibernate 有什么区别? 110.什么是 spring cloud?
是分布式微服务架构下的一站式解决方法,是各个微服务架构落地技术的集合体,俗称微服务全家桶
微服务架构,就是本来之前开发都是单体引用,所有的模块都是放在一个项目中,这样的缺点就是有并发访问的时候会出现问题,这个时候就可以使用微服务架构把每一个模块进行拆分管理,也就是单一应用拆分成一个个的服务,甚至每一个功能拆分管理在自己独立的进程当中执行,之后每一个服务之间相互调用,相互配合从而也得到一个更好的项目
微服务是一个一个的个体,微服务架构是由所有微服务组成的一个整体架构, 111.spring cloud 断路器的作用是什么? 在分布式架构中,断路器模式的作用也是类似的,当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个错误响应,而不是长时间的等待。这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延。 112.spring cloud 的核心组件有哪些? ribbin是基于Netflix Ribbon实现的一台客户端 负载均衡工具 1.eureka集成了 2@LoadBalanced:开启负载均衡 feign(ribbon hystrix)服务调用 hystrix 服务熔断:不在发送请求不能请求 服务降级:检查每次请求,是否请求超时,超时进行提示 eureka注册中心 zuul网关 微服务之间是如何独立通讯的
springcloud和Dubbo有哪些区别? dubbo是rpc 远程过程调用,cloud是Restful api Springboot和Springcloud,请你谈谈对他们的理解 简单来说就是springboot快速开发单个微服务个体,springcloud关注全局的治理框架。
什么是服务熔断?什么是服务降级
熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务降级,进而熔断该节点微服务的调用,快速返回“错误”的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。 在SpringCloud框架里熔断机制通过Hystrix实现,Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内调用20次,如果失败,就会启动熔断机制。熔断机制的注解是@HystrixCommand。 服务降级,一般是从整体负荷考虑。就是当某个服务熔断之后,服务器将不再被调用,此时客户端可以自己准备一个本地的fallback回调,返回一个缺省值。这样做,虽然水平下降,但好歹可用,比直接挂掉强。 微服务的优缺点是什么? 每个服务足够内聚,足够小,代码容易理解这样能聚焦一个指定的业务功能或业务需求 开发简单,开发效率提高,一个服务可能就是专一的只干一件事。、 微服务能够被小团队单独开发,这个小团队是2道5人的开发人员组成 微服务是松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是相互独立的 微服务能适用不同的语言开发 微服务只是业务逻辑的代码,不会和HTML,css或其他页面组件混合 每个微服务有自己独立的存储能力,可以有自己的数据库,也可以有统一的数据库
你所知道的微服务技术又哪些?
springcloud和dubbo区别
十二、Hibernate 113.为什么要使用 hibernate? 114.什么是 ORM 框架? 115.hibernate 中如何在控制台查看打印的 sql 语句? 116.hibernate 有几种查询方式? 117.hibernate 实体类可以被定义为 final 吗? 118.在 hibernate 中使用 Integer 和 int 做映射有什么区别? 119.hibernate 是如何工作的? 120.get()和 load()的区别? 121.说一下 hibernate 的缓存机制? 122.hibernate 对象有哪些状态? 123.在 hibernate 中 getCurrentSession 和 openSession 的区别是什么? 124.hibernate 实体类必须要有无参构造函数吗?为什么? 十三、Mybatis 125.mybatis 中 #{}和 {}的区别是什么? 这是 #{} 和 {} 我们能看到的主要的区别,除此之外,还有以下区别: #方式能够很大程度防止sql注入。 方式一般用于传入数据库对象,例如传入表名. 一般能用#的就别用$. 126.mybatis 有几种分页方式? blog.csdn.net/u010667011/… 127.RowBounds 是一次性查询全部结果吗?为什么? RowBounds 表面是在“所有”数据中检索数据,其实并非是一次性查询出所有数据,因为 MyBatis 是对 jdbc 的封装,在 jdbc 驱动中有一个 Fetch Size 的配置,它规定了每次最多从数据库查询多少条数据,假如你要查询更多数据,它会在你执行 next()的时候,去查询更多的数据。就好比你去自动取款机取 10000 元,但取款机每次最多能取 2500 元,所以你要取 4 次才能把钱取完。只是对于 jdbc 来说,当你调用 next()的时候会自动帮你完成查询工作。这样做的好处可以有效的防止内存溢出。 128.mybatis 逻辑分页和物理分页的区别是什么? 逻辑分页是一次性查询很多数据,然后再在结果中检索分页的数据。这样做弊端是需要消耗大量的内存、有内存溢出的风险、对数据库压力较大。 物理分页是从数据库查询指定条数的数据,弥补了一次性全部查出的所有数据的种种缺点,比如需要大量的内存,对数据库查询压力较大等问题。 129.mybatis 是否支持延迟加载?延迟加载的原理是什么? 延迟加载就是在真正使用数据的时候才发起查询,不用的时候不查询,按需查询。 立即加载就是不管用不用只要一调用方法马上发起查询。 130.说一下 mybatis 的一级缓存和二级缓存? 一级缓存:基于 PerpetualCache 的 HashMap 本地缓存,它的声明周期是和 SQLSession 一致的,有多个 SQLSession 或者分布式的环境中数据库操作,可能会出现脏数据。当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认一级缓存是开启的。 二级缓存:也是基于 PerpetualCache 的 HashMap 本地缓存,不同在于其存储作用域为 Mapper 级别的,如果多个SQLSession之间需要共享缓存,则需要使用到二级缓存,并且二级缓存可自定义存储源,如 Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现 Serializable 序列化接口(可用来保存对象的状态)。 开启二级缓存数据查询流程:二级缓存 -> 一级缓存 -> 数据库。 缓存更新机制:当某一个作用域(一级缓存 Session/二级缓存 Mapper)进行了C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear。 131.mybatis 和 hibernate 的区别有哪些? 132.mybatis 有哪些执行器(Executor)? 133.mybatis 分页插件的实现原理是什么? 134.mybatis 如何编写一个自定义插件?
实现Interceptor接口,重写三个方法,并在该类上面指定要拦截的那个环节的类中的方法,下面重写方法即可自定义拦截插件,最后不要忘了在mybatis配置文件中进行配置哦
十四、RabbitMQ 135.rabbitmq 的使用场景有哪些?
- 解耦,比如说系统A会交给系统B去处理一些事情,通过将A,B中间加入消息队列,A将要处理的事情交给消息队列 ,B的输入来源于与消息队列 2.有序性。先来先处理,比如一个系统处理某件事需要很长一段时间,但是在处理这件事情时候,有其他人也发出了请求,可以把请求放在消息队里,一个一个来处理 3.消息路由:按照不同的规则,将队列中消息发送到不同的其他队列中 4.异步处理: 处理一件事情,需要 甲先做A , 然后做乙丙丁分别处理B C D ,B C D这三件事情在A之后,但是相互之间没有关联。此时甲处理A1之后,把事件发送到消息队列里边,乙丙丁接受到事件之后 分别处理B1 C1 D1。 在甲处理能力比较大,BCD处理能力比较小的时候,这样做,对于A的提升能力比较大
136.rabbitmq 有哪些重要的角色? 生产者和消费着 137.rabbitmq 有哪些重要的组件? Server:Broker,接受client连接,实现AMQP实体服务
Connection:应用程序和Broker的网络连接
Channel:网络信道,读写都是在Channel中进行(NIO的概念),包括对MQ进行的一些操作(例如clear queue等)都是在Channel中进行,
客户端可建立多个Channel,每个Channel代表一个会话任务
Message:由properties(有消息优先级、延迟等特性)和Body(消息内容)组成
Virtual host:用于消息隔离(类似Redis 16个db这种概念),最上层的消息路由,一个包含若干Exchange和Queue,同一个里面Exchange
和Queue的名称不能存在相同的。
Exchange:Routing and Filter
Binding:把Exchange和Queue进行Binding
Routing key:路由规则
Queue:物理上存储消息 138.rabbitmq 中 vhost 的作用是什么? 虚拟主机 相当于是一个新的rabbitmq 类似于centos7虚拟机 139.rabbitmq 的消息是怎么发送的? 生产者把生产的消息通过channel发送到Exchange上,Exchange通过绑定的router key来选择Queue,消费者监听到Queue上有新的消息,就消费调此消息; 140.rabbitmq 怎么保证消息的稳定性? 1.消息持久化 2.ACK确认机制 3.设置集群镜像模式 4.消息补偿机制 141.rabbitmq 怎么避免消息丢失? 持久化,或者ack手动确认消息 142.要保证消息持久化成功的条件有哪些? 143.rabbitmq 持久化有什么缺点? 144.rabbitmq 有几种广播类型? direct(默认方式):最基础最简单的模式,发送方把消息发送给订阅方,如果有多个订阅者,默认采取轮询的方式进行消息发送。 headers:与 direct 类似,只是性能很差,此类型几乎用不到。 fanout:分发模式,把消费分发给所有订阅者。 topic:匹配订阅模式,使用正则匹配到消息队列,能匹配到的都能接收到。 145.rabbitmq 怎么实现延迟消息队列? 死信队列 146.rabbitmq 集群有什么用? 147.rabbitmq 节点的类型有哪些? 148.rabbitmq 集群搭建需要注意哪些问题? 149.rabbitmq 每个节点是其他节点的完整拷贝吗?为什么? 150.rabbitmq 集群中唯一一个磁盘节点崩溃了会发生什么情况? 151.rabbitmq 对集群节点停止顺序有要求吗? 十五、Kafka 152.kafka 可以脱离 zookeeper 单独使用吗?为什么? 153.kafka 有几种数据保留的策略? 154.kafka 同时设置了 7 天和 10G 清除数据,到第五天的时候消息达到了 10G,这个时候 kafka 将如何处理? 155.什么情况会导致 kafka 运行变慢? 156.使用 kafka 集群需要注意什么? 十六、Zookeeper 157.zookeeper 是什么? 158.zookeeper 都有哪些功能? 159.zookeeper 有几种部署模式? 160.zookeeper 怎么保证主从节点的状态同步? 161.集群中为什么要有主节点? 162.集群中有 3 台服务器,其中一个节点宕机,这个时候 zookeeper 还可以使用吗? 163.说一下 zookeeper 的通知机制? 十七、MySql 164.数据库的三范式是什么? 第一范式: 1)、每一列属性都是不可再分的属性值,确保每一列的原子性 2)、两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据 第二范式: 每一行的数据只能与其中一列相关,即一行数据只做一件事。只要数据列中出现数据重复,就要把表拆分开来。
一个人同时买几件商品,就会出来一个订单号多条数据,这样子客户都是重复的,就会造成数据冗余。我们应该把他拆开来。 第三范式: 数据不能存在传递关系,即没个属性都跟主键有直接关系而不是间接关系。像:a-->b-->c 属性之间含有这样的关系,是不符合第三范式的。 165.一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几? 8 166.如何获取当前数据库版本? www.maomao365.com/?p=8761 select version()最直接 167.说一下 ACID 是什么? ACID: A——原子性: 事务十一个不可分割工作单位,要么都发生,要么都不发生 C——一致性 使数据库从一个一致性状态变为另外一种状态 I——隔离性 事务执行不能被其他事务干扰,即一个事务内部的操作及使用数据对并发其他事务是隔离的,并发执行的各个事务之间不能互相干扰 D——持久性 事务一旦提交,对数据库中数据改变就是永久性,接下来其他操作和数据库故障不应该对其有任何影响 168.char 和 varchar 的区别是什么? 1.都是用来存储字符串的,只是他们的bai保存方式不du一样。
2.char有固定的长度,而varchar属于可变zhi长的字符类型。
char是一种固定长度的类型,varchar则是一种可变长度的类型,它们的区别是:
char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足.在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节)。 169.float 和 double 的区别是什么? 它们都代表浮点数。阿FLOAT用于单精度,而DOUBLE是双精度数字。 170.mysql 的内连接、左连接、右连接有什么区别? 1.内连接,显示两个表中有联系的所有数据; 2.左链接,以左表为参照,显示所有数据,右表中没有则以null显示 3.右链接,以右表为参照显示数据,,左表中没有则以null显示 171.mysql 索引是怎么实现的? www.cnblogs.com/wlwl/p/9465… 172.怎么验证 mysql 的索引是否满足需求? explain可以检查你的sql索引命中情况,实际上线后,最好配合监控来看下接口的RT 173.说一下数据库的事务隔离? Read uncommitted (读未提交):最低级别,以上问题均无法解决。 Read committed (读已提交):读已提交,可避免脏读情况发生。 Repeatable Read(可重复读):确保事务可以多次从一个字段中读取相同的值,在此事务持续期间,禁止其他事务对此字段的更新,可以避免脏读和不可重复读,仍会出现幻读问题。 Serializable (串行化):最严格的事务隔离级别,要求所有事务被串行执行,不能并发执行,可避免脏读、不可重复读、幻读情况的发生 174.说一下 mysql 常用的引擎? blog.csdn.net/ademoa/arti… 175.说一下 mysql 的行锁和表锁? MyISAM 只支持表锁,InnoDB 支持表锁和行锁,默认为行锁。 表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最高,并发量最低。 行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并发度最高。 176.说一下乐观锁和悲观锁? 悲观锁:就是把操作锁住,保证这一次操作执行完毕之前不会有其他第三方的操作干扰。例如更新一条数据 把这条数据锁住,只有当我更新完毕了 ,别的操作事务才能操作这条数据,悲观锁的前提还要是不能自动提交事务,示例:锁住select * from user where id=1 id为1的数据就被锁住了 乐观锁:是认为数据不会被冲突,在真正更新的时候才去做检测,发现有问题就报错,实现乐观锁的方式增加一个version的字段,每次更新一次就+1,这样后面要再更新操作的话就会根据这个字段比较,比较一样就可以操作,否则不可以 177.mysql 问题排查都有哪些手段? 使用 show processlist 命令查看当前所有连接信息。 使用 explain 命令查询 SQL 语句执行计划。 开启慢查询日志,查看慢查询的 SQL。 178.如何做 mysql 的性能优化? 使用索引,并且避免索引失效
【优化总结口诀】 全值匹配我最爱,最左前缀要遵守; 带头大哥不能死,中间兄弟不能断; 索引列上少计算,范围之后全失效; Like百分写最右,覆盖索引不写星; 不等空值还有or,索引失效要少用; VAR引号不可丢,SQL高级也不难 十八、Redis 179.redis 是什么?都有哪些使用场景? nosql数据库,缓存数据库,秒杀,排行榜,收藏,订阅,浏览数等 180.redis 有哪些功能? 181.redis 和 memecache 有什么区别? 182.redis 为什么是单线程的? redis本身就是作用在内存中的 183.什么是缓存穿透?怎么解决? 缓存穿透 一般的缓存系统,都是按照 key 去缓存查询,如果不存在对应的 value,就应该去后端系统查找(比如DB)。一些恶意的请求会故意查询不存在的 key,请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。 如何避免? 1:对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该 key 对应的数据 insert 了之后清理缓存。 2:对一定不存在的 key 进行过滤。可以把所有的可能存在的 key 放到一个大的 Bitmap 中,查询时通过该 bitmap 过滤。
缓存雪崩 当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,会给后端系统带来很大压力。导致系统崩溃。 如何避免? 1:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个 key 只允许一个线程查询数据和写缓存,其他线程等待。 2:做二级缓存,A1 为原始缓存,A2 为拷贝缓存,A1 失效时,可以访问 A2,A1 缓存失效时间设置为短期,A2 设置为长期 3:不同的 key,设置不同的过期时间,让缓存失效的时间点尽量均匀
缓存击穿,是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。 小编在做电商项目的时候,把这货就成为“爆款”。 其实,大多数情况下这种爆款很难对数据库服务器造成压垮性的压力。达到这个级别的公司没有几家的。所以,务实主义的小编,对主打商品都是早早的做好了准备,让缓存永不过期。即便某些商品自己发酵成了爆款,也是直接设为永不过期就好了。 大道至简,mutex key互斥锁真心用不上。 184.redis 支持的数据类型有哪些? list hash set zset 185.redis 支持的 java 客户端都有哪些? Redisson、Jedis、lettuce 等等,官方推荐使用 Redisson 186.jedis 和 redisson 有哪些区别? Jedis 和 Redisson 都是Java中对Redis操作的封装。Jedis 只是简单的封装了 Redis 的API库,可以看作是Redis客户端,它的方法和Redis 的命令很类似。Redisson 不仅封装了 redis ,还封装了对更多数据结构的支持,以及锁等功能,相比于Jedis 更加大。但Jedis相比于Redisson 更原生一些,更灵活。 187.怎么保证缓存和数据库数据的一致性? 延时双删策略 在写库前后都进行redis.del(key)操作,并且设定合理的超时时间。具体步骤是: 1)先删除缓存 2)再写数据库 3)休眠500毫秒(根据具体的业务时间来定) 4)再次删除缓存。 消息最终一致性 更新数据库之后,发送要删除的缓存的key到消息队列,后面接收消息消费。
188.redis 持久化有几种方式? RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。 AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。 189.redis 怎么实现分布式锁? 190.redis 分布式锁有什么缺陷? 191.redis 如何做内存优化? 192.redis 淘汰策略有哪些? 193.redis 常见的性能问题有哪些?该如何解决? 十九、JVM 谈谈对Jvm的理解?java8前后有什么变化? jvm的体系结构:
类加载器 作用:加载Class文件 举例: new Student() 使用类加载器加载Student类,引用是在栈里面,实例是在堆里面 类加载器分为应用程序加载,扩展加载器,根加载器,虚拟机自带的加载器。 执行顺序:先使用应用程序加载器加载,没有的话往上一级,层层递进。
什么是OOM,什么是StackOverFlowError?怎么分析?
oom:堆内存溢出,StackOverFlowError:栈内存溢出。
堆内存溢出
1.程序中出现了死循环
2.程序占用内存太多,超过了JVM堆设置的最大值。
栈内存溢出可能是有出现递归调用,或循环引用导致。
JVM的常用调优参数有哪些?
通常情况下,初始空间(即-Xms)默认值是物理内存的1/64,最大空间是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置
内存快照如何抓取,怎么分析Dump文件?知道吗?
谈谈JVM中,类加载器你的认识? 类加载器负责加载class文件,加载进入到运行数据区,类加载器分为应用程序加载,扩展加载器,根加载器,虚拟机自带的加载器。 执行顺序:先使用应用程序加载器加载,没有的话往上一级,层层递进。 194.说一下 jvm 的主要组成部分?及其作用? JVM包括类加载子系统、堆、方法区、栈、本地方法栈、程序计数器、直接内存、垃圾回收器、执行引擎。 1、类加载子系统 类加载子系统负责加载class信息,加载的类信息存放于方法区中。 2、直接内存 直接内存是在Java堆外的、直接向系统申请的内存空间。访问直接内存的速度会由于Java堆。出于性能的考虑,读写频繁的场合可能会考虑使用直接内存。 3、垃圾回收器 垃圾回收器可以对堆、方法区、直接内存进行回收。 4、执行引擎 执行引擎负责执行虚拟机的字节码,虚拟机会使用即时编译技术将方法编译成机器码后再执行。 195.说一下 jvm 运行时数据区? 分为 方法区:和堆一样所有线程共享,主要用于存储已被jvm加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 虚拟机栈:存放对象的引用,编译期可知的各种基本类型数据(boolean、byte、char、short、int、float、long、double)、对象引用、returnAddress类型(指向了一条字节码指令的地址)。 如果线程请求的栈深度大于虚拟机所允许的深度,将会抛出Stack OverflowError异常;如果虚拟机栈可以动态扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。 本地方法栈:在虚拟机规范中对本地方法栈中方法使用的语言、使用方式与数据结构并没有强制规定,因此具体的虚拟机可以自由实现它。甚至有的虚拟机直接把本地方法栈和虚拟机栈合二为一,与虚拟机栈一样也会抛出Stack OverflowError异常和OutOfMemoryError异常。 堆:存放对象的实例,也是gc回收部分,所以Java堆还可以细分为:新生代和老年代;再细致一点的有Eden空间,From Survivor空间,To Survivor空间等。从内存分配的角度来看,线程共享的Java堆中可能划分出多个线程私有的分配缓冲区。不过无论如何划分,都与存放内容无关,无论哪个区域,存储的都仍然是对象实例,进一步划分的目的是为了更好的回收内存,或者更快的分配内存。(如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。) 程序计数器:由于jvm的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器都只会执行一条线程中的指令。因此未来线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,我们成这类内存区域为“线程私有”的内存。 196.说一下堆栈的区别? 堆存放的是对象的实例,栈存放的是对象的引用,堆是垃圾回收区域 197.队列和栈是什么?有什么区别? 都是数据结构,队列是先进先出的,栈是先进后出的 198.什么是双亲委派模型? 当需要加载一个类的时候,子类加载器并不会马上去加载,而是依次去请求父类加载器加载,一直往上请求到最高类加载器:启动类加载器。当启动类加载器加载不了的时候,依次往下让子类加载器进行加载。当达到最底下的时候,如果还是加载不到该类,就会出现ClassNotFound的情况。 好处:保证了程序的安全性。例子:比如我们重新写了一个String类,加载的时候并不会去加载到我们自己写的String类,因为当请求上到最高层的时候,启动类加载器发现自己能够加载String类,因此就不会加载到我们自己写的String类了。 199.说一下类加载的执行过程? 编译→运行→加载→链接→初始化 200.怎么判断对象是否可以被回收?
201.java 中都有哪些引用类型? 强引用,软引用,弱引用,虚引用 202.说一下 jvm 有哪些垃圾回收算法? 1.Mark-Sweep(标记-清除)算法 这是最基础的垃圾回收算法,之所以说它是最基础的是因为它最容易实现,思bai想也是最简单的。标记-清除算法分为两个阶段:标记阶段和清除阶段。标记阶段的任务是标记出所有需要被回收的对象,清除阶段就是回收被标记的对象所占用的空间。 2.Copying(复制)算法 为了解决Mark-Sweep算法的缺陷,Copying算法就被提了出来。它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用的内存空间一次清理掉,这样一来就不容易出现内存碎片的问题。 3.Mark-Compact(标记-整理)算法(压缩法) 为了解决Copying算法的缺陷,充分利用内存空间,提出了Mark-Compact算法。该算法标记阶段和Mark-Sweep一样,但是在完成标记之后,它不是直接清理可回收对象,而是将存活对象都向一端移动,然后清理掉端边界以外的内存。 4.Generational Collection(分代收集)算法 分代收集算法是目前大部分JVM的垃圾收集器采用的算法。它的核心思想是根据对象存活的生命周期将内存划分为若干个不同的区域。一般情况下将堆区划分为老年代(Tenured Generation)和新生代(Young Generation),老年代的特点是每次垃圾收集时只有少量对象需要被回收,而新生代的特点是每次垃圾回收时都有大量的对象需要被回收,那么就可以根据不同代的特点采取最适合的收集算法。 203.说一下 jvm 有哪些垃圾回收器? 204.详细介绍一下 CMS 垃圾回收器? 205.新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别? 206.简述分代垃圾回收器是怎么工作的? 207.说一下 jvm 调优的工具?