1、JVM加载class文件的原理机制?
JVM中类的加载由类加载器(ClassLoader)和它的子类来实现;类的加载是指把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象。类加载后进入连接阶段,包括验证、准备、解析三步。最后进行初始化,如果存在直接父类先初始化父类;如果类中存在初始化语句,执行初始化。
类的加载由类加载器完成,加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader的子类)。
2、char型变量能不能存储一个中文汉字,为什么?
可以,Java中使用的编码是Unicode,一个char类型占两个字节(16比特),存放一个中文没问题。
3、抽象类和接口的区别?
均不能够实例化;接口比抽象类更加抽象,因为抽象类中可以定义构造器、抽象方法、具体方法,接口中不能定义构造器而且方法全部为抽象;
抽象类中可以有private、default、protected、public;接口中全为public;
抽象类中可以定义成员变量,接口中定义的成员变量都是常量;
4、静态嵌套类和内部类的区别?
静态内部类可以不依赖外部类实例被实例化;通常的内部类需要外部类实例化后才能实例化;
5、Java中会存在内存泄漏吗?
理论上因为GC的存在不会存在内存泄漏的情况;实际开发中可能会存在无用但可达的对象,不能被GC回收,因此会导致内存泄漏。例如hibernate的Session中的对象属于持久态。
6、abstract是否可以与static或native或synchronized共存?
abstract需要被子类重写,static方法无法被重写,二者互相矛盾;
native方法是本地代码实现的方法,而抽象方法没有实现,互相矛盾;
synchronized和方法的实现细节有关,抽象方法不涉及实现细节,互相矛盾;
7、静态变量和实例变量的区别?
静态变量被static修饰的变量,又称类变量,属于类而不属于类的任何一个对象,静态变量在内存中有且仅有一个拷贝。静态变量可以多个对象共享;
实例变量必须依赖依存于某一实例,必须先创建好对象实例才能访问它。
8、能否从一个静态方法内部发出对非静态方法的调用?
不可以;静态方法只能访问静态成员,非静态方法的调用要先创建对象,在调用静态方法时可能对象并没有初始化。
9、如何实现对象克隆?
实现Cloneable接口并重写Object类中的clone()方法;
实现Serializable接口,通过对象的序列化和反序列化实现克隆,实现深度克隆。
10、GC是什么?为什么要有GC?
GC是垃圾收集的意思;GC可以对堆内存中已经死亡或者长时间没有被使用的对象进行清除和回收;
垃圾回收的机制:分代复制垃圾回收、标记垃圾回收、增量垃圾回收等;
Java对堆内存回收和再利用的基本算法成为标记和清除;
分代式垃圾回收:
伊甸园(Eden):对象诞生的区域,并且对于大多数对象而言,这里是它们唯一存在过的区域;
幸存者乐园(Survivor):存放从Eden幸存下来的对象;
终身颐养园(Tenured):足够老的幸存对象的归宿;年轻代收集过程不会触及这个地方;可能会牵扯到压缩,以便为大对象腾出足够的空间。
与垃圾回收相关的JVM参数:
-Xms/-Xmx:堆的初始大小/堆的最大值
-Xmn:堆中年轻代的大小