携程java高级社招面经
1. 描述一下JVM 加载Class 文件的原理机制?
2. 什么是类加载器?
类加载器是一个用来加载类文件的类。Java 源代码通过 javac 编译器编译成类
文件。然后JVM 来执行类文件中的字节码来执行程序。类加载器负责加载文件
系统、网络或其他来源的类文件。
3. 类加载器有哪些?
4. 什么是 tomcat 类加载机制?
5、类加载器双亲委派模型机制?
什么是双亲委派模型(Parent-Delegation Model)?为什么使用双亲委派模型?
JVM 中加载类机制采用的是双亲委派模型,顾名思义,在该模型中,子类加载器
收到的加载请求,不会先去处理,而是先把请求委派给父类加载器处理,当父类
加载器处理不了时再返回给子类加载器加载;
为什么使用双亲委派模型?
因为安全。使用双亲委派模型来组织类加载器间的关系,能够使类的加载也具有
层次关系,这样能够保证核心基础的Java 类会被根加载器加载,而不会去加载
用户自定义的和基础类库相同名字的类,从而保证系统的有序、安全。
6. Java 内存分配?
7. Java 堆的结构是什么样子的?
8. 简述各个版本内存区域的变化?
9. 说说各个区域的作用?
10. Java 中会存在内存泄漏吗,简述一下?
理论上Java因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是Java被广泛使用于
服务器端编程的一个重要原因);然而在实际开发中,可能会存在无用但可达的对象,这些
对象不能被GC回收,因此也会导致内存泄露的发生。例如Hibernate的Session(一级缓存)
中的对象属于持久态,垃圾回收器是不会回收这些对象的,然而这些对象中可能存在无用的
垃圾对象,如果不及时关闭(close)或清空(flush)一级缓存就可能导致内存泄露。
11. Java 类加载过程?
在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和
初始化,其中链接又可以分成校验、准备、解析
装载:查找和导入类或接口的二进制数据;
链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;
校验:检查导入类或接口的二进制数据的正确性;
准备:给类的静态变量分配并初始化存储空间;
解析:将符号引用转成直接引用;
初始化:激活类的静态变量,初始化Java代码和静态Java代码块
12. 什么是GC? 为什么要有GC?
13. 简述一下Java 垃圾回收机制?
14. 如何判断一个对象是否存活?
15. 垃圾回收的优点和原理,并考虑2 种回收机制?
基本原理是什么?
Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的
问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃
圾回收机制,Java中的对象不再有"作用域"的概念,只有对象的引用才有"作用域"。垃圾
回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个
单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用
的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃
圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。
16. 深拷贝和浅拷贝?
浅拷贝被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍
然指向原来的对象。即对象的浅拷贝会对“主”对象进行拷贝,但不会复制主对象里面的对
象。”里面的对象“会在原来的对象和它的副本之间共享。
简而言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。
深拷贝深拷贝是一个整个独立的对象拷贝,深拷贝会拷贝所有的属性,并拷贝属性指向的动
态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速
度较慢并且花销较大。
简而言之,深拷贝把要复制的对象所引用的对象都复制了一遍。
17. 什么是分布式垃圾回收(DGC)?它是如何工作
的?
RMI子系统实现基于引用计数的“分布式垃圾回收”(DGC),以便为远程服务器对象提供自动
内存管理设施。
当客户机创建(序列化)远程引用时,会在服务器端DGC上调用dirty()。当客户机完成远
程引用后,它会调用对应的clean()方法。
针对远程对象的引用由持有该引用的客户机租用一段时间。租期从收到dirty()调用开始。
在此类租约到期之前,客户机必须通过对远程引用额外调用dirty()来更新租约。如果客户
机不在租约到期前进行续签,那么分布式垃圾收集器会假设客户机不再引用远程对象。
#携程##java工程师##社招##面经#