大话java面试-java基础-4

1、序列化和反序列化的底层实现

序列化是指把对象转化成字节流,反序列化是指把字节流转化成对象。

实现了Serializable或Externalizable接口的才能序列化,static和transient类型的成员数据不能被序列化。

自己实现序列化,需要定义readObject(ObjectInputStream in)和writeObject(ObjectOutputSteam out)方法,底层是通过调用这两个方法来实现的。序列化和反序列化实现原理

2、jvm程序计数器

程序计数器是一块较小的内存空间,他的作用可以看做是当前线程所执行的字节码的行号指示器。如果线程正在执行一个java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Native方法,这个计数器为空(undefined)。

3、CMS垃圾回收机制

初始标记:stw,标记老年代中gc roots可达的和在新生代中引用的对象。可以设置并行标记的线程数。

并发标记:不stw,标记初始中标记的对象引用的对象,在运行期间会发生新生代的对象晋升到老年代、或者是直接在老年代分配对象、或者更新老年代对象的引用关系等等,该阶段会把上述对象所在的Card标识为Dirty。

并发预清理:不stw。标记Card标识为Dirty的对象和他们引用的对象。

重新标记:stw。对对象进行重新扫描并标记。(此阶段没明白,有时间查下书)。

并发清除:清除标记的对象。

并发重置:重新设置CMS算法内部的数据结构,准备下一个CMS生命周期的使用。

参考 《图解 CMS 垃圾回收机制》和《CMS回收分析》

4、String的hashcode如何实现

public int hashCode() {

    int h = hash;

    if (h == 0 && value.length > 0) {

        char val[] = value;

        for (int i = 0; i < value.length; i++) {

            h = 31 * h + val[i];

        }

        hash = h;

    }

    return h;

}

如果有三位:=(第一位的ascii值*31+第二位的ascii值)*31+第三位的ascii值

《为什么选择数字31作为乘子》

5、对象的回收过程

首先第一次这个对象被判定为有必要执行finalize()方法,那么这个对象会被放置在一个叫做F-Queue的队列之后,之后会被一个低优先级的小线程执行。finalize()方法是对象逃脱死亡命运的最后一次机会,稍后GC将会对F-queue中的对象进行第二次标记,如果对象要在finalize()中拯救自己需要重新与引用链上的任何一个对象建立关联,如果在第二次标记前,这个对象还没有移除即将回收的集合,那么它基本上就要被回收了。finalize()简单来说就是当垃圾回收器认为一个对象没有存在意义时,会调用该对象的这个方法,释放该对象在堆中占用的内存。此方法继承于始祖Object。

6、面向对象三大特征以及实现机制

封装:隐藏类的内部实现机制。

继承:重用父类的代码。

多态:指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。

《多态的实现机制》

7、基本数据类型在jvm中保存位置

方法中的基本数据类型保存在虚拟机栈中,类中的基本数据类型保存在堆中。

你可能感兴趣的:(大话java面试-java基础-4)