博客
关于我
Java最新面试题2024,Java八股文204
阅读量:634 次
发布时间:2019-03-14

本文共 1817 字,大约阅读时间需要 6 分钟。

Java面试核心笔记

一、多线程基础

1. 进程与线程的区别
  • 进程是程序运行的基本单位,拥有独立的内存空间。
  • 线程是比进程更小的执行单元,共享进程内存,开销更低。
2. 并发与并行的区别
  • 并发:同一时间处理多个任务,线程轮流执行。
  • 并行:同一时间处理多个任务,多核CPU同时执行。
3. 创建线程方式
  • 继承Thread类:new Thread(new Runnable() { ... })
  • 实现Runnable接口:new Thread(runnable)
  • 实现Callable接口:new Thread(new Callable<V>() { ... }).start()
  • 使用线程池:executorService.submit(runnable)
  • 4. Runnable与Callable的区别
    • Runnablerun方法无返回值,适合不需要返回结果的任务。
    • Callablecall方法有返回值,适合需要结果的任务。
    5. run与start的区别
    • start方法启动线程,线程运行run方法。
    • run方法可以在多次调用。
    6. 线程状态

    新建、可执行、阻塞、等待、计时等待、死亡。

    7. 线程同步
    • synchronized:互斥锁,基于 Monitor机制。
    • lock:可重入锁,提供更多同步选项,如公平锁、可中断等待。
    8. CAS原理
    • 原子操作:确保多线程环境下操作的原子性。
    • 优点:高效,但存在ABA问题和循环开销。

    二、JVM基础

    1. JVM主要组成部分
    • 类加载器:加载.class文件。
    • 运行时数据区:堆、方法区、程序计数器、虚拟机栈、本地方法栈。
    • 执行引擎:字节码到机器码的翻译。
    • 本地方法接口:与C/C++接口沟通。
    2. 运行时数据区组成
    • 方法区:存储类信息、常量、静态变量。
    • :存储对象实例、数组。
    • 程序计数器:记录当前线程执行位置。
    • 虚拟机栈:存储局部变量、方法参数。
    • 本地方法栈:支持本地方法。
    3. 垃圾回收
    • 是垃圾回收的主要区域。
    • 中的对象一般在方法结束时被回收。
    4. 栈内存管理
    • 栈溢出:方法调用深度过大或内存不足。
    • 默认栈内存大小:1MB。

    三、并发编程

    1. 线程池核心参数
    • 核心线程数(corePoolSize):控制核心线程数量。
    • 最大线程数(maximumPoolSize):核心线程+救急线程最大数量。
    • 队列(workQueue):默认使用LinkedBlockingQueue。
    • 夜间线程存活时间(keepAliveTime):默认为无限。
    2. 线程池创建方式
  • 固定线程池:核心线程数固定,适合已知任务总量。
  • 单例线程池:核心线程数为1,适合按顺序执行任务。
  • 可缓存线程池:核心线程数为0,适合任务密集型场景。
  • 定时执行线程池:执行定期任务。
  • 3. 线程池拒绝策略
    • 直接拒绝:默认策略。
    • 抛弃策略:丢弃任务记录。
    • 抢占策略:强制终止任务。
    • 重新路线:重试执行任务。

    四、ThreadLocal内存泄漏

    1. ThreadLocal原理
    • 每个线程维护一个ThreadLocalMap存储变量。
    • 内存泄漏:未及时清除ThreadLocal中的变量。
    2. 解决方法
    • 及时调用ThreadLocal.remove()清除变量。
    • 避免使用ThreadLocal存储大型对象。

    五、JVM性能调优

    1. 堆大小设置
    • 默认初始堆大小为XMB,最小堆大小为XMB。
    • 增大堆大小:优化内存使用,但增加GC开销。
    2. 课程主类设置
    • -Xms:初始堆大小。
    • -Xmx:最大堆大小。
    • -Xmn:年轻代大小。
    3. GC优化
    • 使用-XX:+UseParallelGC优化吞吐量。
    • 调整-XX:ParallelGCThreads控制并行收集线程数。
    4. 内存分配优化
    • 使用-XX:+UseTLAB减少TLAB分配时间。

    六、其他技术要点

    1. ThreadLocal与线程安全
    • ThreadLocal确保线程隔离,但需谨慎使用。
    2. 线程池与异步调用
    • 使用@EnableAsync注释启动类,定义自定义线程池。
    3. 任务调度
    • 使用CountDownLatch实现任务顺序执行。
    4. 线程间通信
    • 使用Object类的wait/notify方法。
    • 使用LockCondition实现更高级锁机制。

    七、总结

    Java多线程和并发编程是核心技能,理解线程池、锁机制、内存管理至关重要。

    转载地址:http://orxoz.baihongyu.com/

    你可能感兴趣的文章
    pandas 读取excel数据,以字典形式输出
    查看>>
    Pandas 读取具有浮点值的 csv 文件会导致奇怪的舍入和小数位数
    查看>>
    pandas 适用,但仅适用于满足条件的行
    查看>>
    pandas 重新采样到每月的特定工作日
    查看>>
    pandas :我如何对堆叠的条形图进行分组?
    查看>>
    pandas :按移位分组和累加和(GroupBy Shift And Cumulative Sum)
    查看>>
    pandas :检测一个DF和另一个DF之间缺失的列
    查看>>
    Pandas-从具有嵌套列表列表的现有列创建动态列时出错
    查看>>
    Pandas-通过对列和索引的值求和来合并两个数据框
    查看>>
    pandas.columns、get_dummies等用法
    查看>>
    pandas.DataFrame.copy(deep=True) 实际上并不创建深拷贝
    查看>>
    pandas.read_csv()的详解-ChatGPT4o作答
    查看>>
    PANDAS.READ_EXCEL()输出‘;溢出错误:日期值超出范围‘;而不存在日期列
    查看>>
    pandas100个骚操作:再见 for 循环!速度提升315倍!
    查看>>
    Pandas:如何根据其他列值的条件对列进行求和?
    查看>>
    Pandas:对给定列求和 DataFrame 行
    查看>>
    Pandas、Matplotlib、Pyecharts数据分析实践
    查看>>
    Pandas中文官档~基础用法2
    查看>>
    Pandas中文官档~基础用法5
    查看>>
    Pandas中文官档~基础用法6
    查看>>