从今天起计划每天把学到的java方面的面试问题和答案用适合和面试官谈论的方式写一遍,以记录找工作历程
持续更新中~~~~~勿喷
(1)java垃圾回收机制
答: 要想说清楚垃圾回收机制,首先应该明白的是垃圾回收机制中主要的两个问题:
一个是什么样的对象是垃圾回收对象;一个是对这些垃圾回收对象该怎样进行回收;
判断一个对象是否存活之前均是采用引用计数法来判断,但是这个方法不能解决对象间循环引用的问题,后来采用了可达性分析算法,通过将一系列的"GC Roots"对象作为起点来进行搜索,如果说在"GC Roots"和对象间没有可达的路径,则该对象被认为是不可达的,但是不可达并不意味着是需要回收的,被判断为是不可达的对象要想成为被回收的对象至少要经历两次标记过程,如果这两次标记过程都没有逃脱成为可回收对象的话,那么就真成了回收对象了;
JVM将内存划分为5个区,分别是虚拟机栈、本地方法栈、堆、程序计数器、方法区,对于虚拟机栈和本地方法栈以及程序计数器来说,是线程所独享的,因此会随着线程的产生和销毁而产生和销毁,我们并不用关心这一部分区域对象的回收操作;方法区主要用来存放类加载信息、static常量、final类型常量(当然JDK1.7之后将字符串常量池移到了堆中,注意这里仅仅移出的是字符串常量池,对于其他8中基本类型的常量来说并没有移出),他是逻辑上属于堆的,在Hotspot虚拟机上又称为永久代;堆是所有线程所共享的,所有创建的实例对象都是在这个区域上面分配内存的,此区域是垃圾收集器管理的主要区域;
java虚拟机将堆区划分为新生代和老年代,并且采用分代收集算法来进行垃圾回收操作,新生代的GC操作称为Minor GC,老年代的GC操作称为Major GC,两者合起来统称为Full GC,新生代采用复制算法进行收集,老年代采用标记--整理算法进行收集,Minor GC发生的频率是远远超过Major GC的频率,Hotspot虚拟机将新生代又按照8:1:1的比例划分成三部分,分别取名为Eden区、From Survivor、To Survivor,因为堆区是线程共享的,可能有多个线程同时分配大量的对象,因此又将伊甸区划分为一个或者多个线程本地缓冲(TLAB),每个线程占用其中之一,新生代中的两个Survivor至少会有一个处于空闲状态,比如最开始整个新生代均处于空闲状态,当我们new实例对象时,会将该对象放到伊甸区,此时处于空闲状态的是To Survivor和To Survivor,当伊甸区已满或者所剩空间不足以存放当前想要创建对象实例的时候,会进行一次Minor GC操作,通过可达性分析算法判断这个区域中还存活着的对象,将这些对象存放到From Survivor如果此时From Survivor区域存放不下这些还存活的对象的话,则直接存放到老年代中,同时清空伊甸区,此时的To Survivor是处于空闲状态的,在第二次new实例对象的时候,同样也会将其放入伊甸区,当伊甸区已满或者所剩空间不足以存放当前想要创建对象实例的时候,会再次进行一次Minor GC操作,将伊甸区和From Survivor中还存活着的对象存放到To Survivor区中,如果To Survivor已满的话,则将其内容移到老年代,同时清空伊甸区和From Survivor区,当然如果在To Survivor中的对象在进行了15次Minor GC操作后仍然处于存活状态的话,则会将这些对象直接移到老年代,同时清空To Survivor区;
老年代的Major GC操作的话就相对简单了,他采用标记--整理的算法,将所有存活的对象移动到一边,然后直接清理掉边界以外的内存;
还有注意的一点就是GC操作会出现stop-the-world现象,这点在android中是最需要注意的;
(2)Cookie和Session的区别:
答:(1)Cookie存放在服务器端,Session存放在客户端;
(2)Cookie是不安全的,因为可以通过分析存放在本地的Cookie来进行Cookie欺骗;
(3)当服务器端访问过多的时候,Session会影响服务器的性能;
(4)单个Cookie保存的数据不能超过4K,很多浏览器设置一个站点最多保存20个Cookie;