Java面试必备:线程状态、内存管理与模块化解析

需积分: 0 3 下载量 105 浏览量 更新于2024-08-04 收藏 11KB MD 举报
"Java面试题大汇总,涵盖了Java基础、线程、内存管理、单元测试、并发、网络等多方面知识,旨在帮助求职者准备2023年的Java面试。" ## Java面试知识点详解 ### 1. 守护线程和本地线程的区别 - **守护线程(Daemon Thread)**:Java中,守护线程主要用于提供后台服务,如垃圾收集器。当所有非守护线程(用户线程)结束时,即使还有守护线程在运行,JVM也会退出。可以通过`Thread.setDaemon(true)`设置线程为守护线程。 - **本地线程(Native Thread)**:本地线程是指运行在操作系统的原生线程上的Java线程。Java通过JNI(Java Native Interface)与本地代码交互时会使用本地线程。 ### 2. CMS(Concurrent Mark Sweep)收集器的阶段 CMS是一款并行的低暂停时间垃圾收集器,主要分为以下几个阶段: - **初始标记(Initial Mark)**:快速扫描GC Roots,标记直接可达的对象。 - **并发标记(Concurrent Marking)**:与应用程序线程并发执行,扫描整个堆,标记可达对象。 - **重新标记(ReMark)**:为了修正并发标记期间因用户线程继续运行导致的标记变动,这是一个短暂的停顿阶段。 - **并发清除(Concurrent Sweeping)**:再次与应用程序线程并发,清理无用对象并压缩内存。 ### 3. 抽象的关键字 在Java中,`abstract`关键字用于定义抽象类和抽象方法。抽象类不能实例化,只能作为其他类的基类。抽象方法没有实现体,需要子类来具体实现。 ### 4. 判断对象可以被回收的条件 对象满足以下两个条件之一,即可被垃圾收集器回收: - **引用计数为0**:没有任何引用指向该对象。 - **可达性分析**:通过一系列GC Roots(如静态变量、本地方法栈中的引用等)无法找到路径到达该对象。 ### 5. 反射调用对象方法 通过`java.lang.reflect.Method`类的`invoke(Object obj, Object... args)`方法可以实现反射调用对象的方法。首先需要获取到目标方法的`Method`对象,然后传入目标对象和参数进行调用。 ### 6. 单元测试 单元测试是对软件中的最小可测试单元进行检查和验证,如Java中的方法。通常使用JUnit框架编写单元测试,确保代码的正确性和稳定性。 ### 7. 栈内存溢出 当线程的局部变量表(存储局部变量)所需的空间超过了栈的大小时,就会发生栈内存溢出。这通常发生在递归深度过大、局部变量过多或大量匿名内部类的情况下。 ### 8. Hash算法 哈希算法是一种将任意长度的输入映射为固定长度输出的函数,通常用于快速查找和数据去重。Java中的`hashCode()`方法返回的就是对象的哈希值,`HashMap`等数据结构就是基于哈希算法实现的。 ### 9. 上下文切换 上下文切换是指操作系统在执行线程时,保存一个线程的状态并恢复另一个线程的状态的过程。这发生在线程被打断或让出CPU时,如在调度、线程同步和中断操作中。上下文切换有一定的开销,过多的上下文切换会影响系统性能。 ### 10. 打破双亲委派机制 Java的类加载器体系采用双亲委派模型,但有些情况需要打破这种机制,例如: - 实现自己的ClassLoader子类,直接加载自定义类,不委托给父类加载。 - 使用`Class.forName("全限定类名", true, ClassLoader)`, 指定特定的类加载器加载。 - 自定义SPI(Service Provider Interface)实现时,通过`java.util.ServiceLoader`加载服务,它允许自定义加载顺序。 打破双亲委派机制主要是为了实现类加载的隔离、版本控制或安全策略等目的。