博客
关于我
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/

    你可能感兴趣的文章
    Openlayers:DMS-DD坐标形式互相转换
    查看>>
    openlayers:圆孔相机根据卫星经度、纬度、高度、半径比例推算绘制地面的拍摄的区域
    查看>>
    OpenLDAP(2.4.3x)服务器搭建及配置说明
    查看>>
    OpenLDAP编译安装及配置
    查看>>
    Openmax IL (二)Android多媒体编解码Component
    查看>>
    OpenMCU(一):STM32F407 FreeRTOS移植
    查看>>
    OpenMCU(三):STM32F103 FreeRTOS移植
    查看>>
    OpenMCU(三):STM32F103 FreeRTOS移植
    查看>>
    OpenMCU(二):GD32E23xx FreeRTOS移植
    查看>>
    OpenMCU(五):STM32F103时钟树初始化分析
    查看>>
    OpenMCU(四):STM32F103启动汇编代码分析
    查看>>
    OpenMetadata 命令执行漏洞复现(CVE-2024-28255)
    查看>>
    OpenMMLab | S4模型详解:应对长序列建模的有效方法
    查看>>
    OpenMMLab | 【全网首发】Llama 3 微调项目实践与教程(XTuner 版)
    查看>>
    OpenMMLab | 不是吧?这么好用的开源标注工具,竟然还有人不知道…
    查看>>
    OpenMMLab | 面向多样应用需求,书生·浦语2.5开源超轻量、高性能多种参数版本
    查看>>
    OpenMP 线程互斥锁
    查看>>
    OpenMV入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
    查看>>
    OpenObserve云原生可观测平台本地Docker部署与远程访问实战教程
    查看>>
    openoffice使用总结001---版本匹配问题unknown document format for file: E:\apache-tomcat-8.5.23\webapps\ZcnsDms\
    查看>>