一、一面(基础+项目)
1)说下JVM
Java Virtual Machine(Java虚拟机)的缩写,包括字节码指令集、寄存器、栈、垃圾回收堆和存储方法域,不同操作系统环境对应各自JVM虚拟机,屏蔽具体平台差异性,从而实现“一次编译,到处运行”。
2)说下JVM的分代回收以及具体算法
年轻代、年老点和持久代,新对象在年轻代回收,生命周期最短,年轻代的Eden区和Survivor区都满,但是对象还存活(被线程引用),该对象被移至年老区,该区生命周期较长,持@b@@b@久代存放静态文件,如今Java类、方法。GC有两种类型:Scavenge GC和Full GC - Full GC因为需对整个堆回收,比ScavengeGC慢,因此尽可能减少Full GC的次数
3)说一下JVM的垃圾收集器,G1和CMS有啥区别?
CMS(ConcurrentMarkSweep)收集器CMS收集器是获取最短回收停顿时间为目标的收集器,适用于B/S系统的服务端,执行步骤:初始标记>并发标记>重新标记>并发清除。@b@@b@G1(Garbage First)垃圾收集器最小时延的垃圾回收器,也同样适合大尺寸堆内存的垃圾收集,官方也推荐使用G1来代替选择CMS。G1最大的特点是引入分区的思路,@b@弱化了分代的概念,合理利用垃圾收集各个周期的资源,解决了其他收集器甚至CMS的众多缺陷执行步骤初始标记>并发标记>最终标记>筛选回收。
4)说下变量从产生到结束所经历的过程,如字符串常量的过程?
静态变量产生于类加载初始化,随jvm停止释放,成员变量(属性变量)声明周期伴随着对象的创建和结束GC释放、局部变量所在方法被调用时,调用结束后被释放。字符串常量在被用于在方法区进行存储,伴随着jvm停止释放。
5)线程安全问题产生的原因?
存在两个或者两个以上的线程对象共享同一个资源,多线程操作共享资源代码有多个语句。
6)乐观锁和悲观锁
乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人@b@@b@ 有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。@b@@b@悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据@b@ @b@ 就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
7)乐观锁是怎么保证一致性的?
version方式和CAS操作方式
8) Integer和int有啥区别,integer中有哪些特殊的函数?
区别如下@b@(1)Integer是int的包装类;int是基本数据类型; @b@@b@(2)Integer变量必须实例化后才能使用;int变量不需要; @b@@b@(3)Integer实际是对象的引用,指向此new的Integer对象;int是直接存储数据值 ;@b@ @b@(4)Integer的默认值是null;int的默认值是0。@b@@b@特殊函数@b@ public static int parseInt(String s, int radix)throws NumberFormatException@b@ public static int parseInt(String s) throws NumberFormatException@b@ @b@ public static Integer valueOf(int i) @b@ public static Integer valueOf(String s, int radix) throws NumberFormatException@b@ public static Integer valueOf(String s) throws NumberFormatException@b@ @b@ Integer a = new Integer(3);@b@ a.intValue();@b@ @b@ System.out.println(Integer.toBinaryString(-7));@b@ 1111111111111111111111111111100
9)讲一下数据库的隔离等级
1.READ UNCIMMITTED(未提交读) - 这就是事务还没提交,而别的事务可以看到他其中修改的数据的后果,也就是脏读。@b@@b@2.READ COMMITTED(提交读) - 这就是小华的事务执行到一半,而小明看不到他执行的操作,所以看到的是旧数据,也就是无效的数据@b@@b@3.REPEATABLE READ(可重复读) - 总结:虽然读取同一条数据可以保证一致性,但是却不能保证没有插入新的数据@b@@b@4.SERIALIZABLE(可串行化)- SERIALIZABLE是最高的隔离级别,它通过强制事务串行执行(注意是串行),避免了前面的幻读情况,@b@@b@由于他大量加上锁,导致大量的请求超时,因此性能会比较底下,再特别需要数据一致性且并发量不需要那么大的时候才可能考虑这个隔离级别
10)说一下MVCC
Multi-Version Concurrency Control 多版本并发控制,MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问阶段进行控制,@b@MVCC只工作在REPEATABLE READ和READ COMMITED隔离级别下,在数据库里也有表和行级别的锁定机制, 用于给那些无法轻松接受 MVCC 行为的应用。 不过,恰当地使用 MVCC 总会提供比锁更好地性能。
11)说一聚簇索引和非聚簇索引的有什么不同
最通俗的解释是:聚簇索引的顺序就是数据的物理存储顺序,而对非聚簇索引的索引顺序与数据物理排列顺序无关。@b@@b@举例来说,你翻到新华字典的汉字“爬”那一页就是P开头的部分,这就是物理存储顺序(聚簇索引);而不用你到目录,找到汉字“爬”所在的页码,然后根据页码找到这个字(非聚簇索引)。