盒子
盒子
文章目录
  1. 1. java虚拟机内存模型
  2. 2. 内存溢出一般发生在哪个区?永久代会不会导致内存溢出
  3. 3. 动态加载类的框架了解哪些
  4. 4. 动态代理一般有哪几种实现方式?动态代理的应用场景有哪些
  5. 5. 栈会不会溢出?栈溢出一般抛什么异常?jvm在哪里设置栈的大小?设置的参数是什么?
  6. 6. 用过哪些命令查看jvm的状态、堆栈信息?
  7. 7. jvm的垃圾回收机制
  8. 8. java类加载机制?如何实现自定义类加载器?findClass与loadClass的区别?
  9. 8. String、StringBuffer、StringBuilder的区别?对应的使用场景?
  10. 9. 如何实现不可变的类
  11. 10. 浅复制和深复制?怎样实现深复制?
  12. 11. HashMap、HashTable、ConcurrentHashMap的区别?
  13. 12. CAS是一种什么样的同步机制
  14. 13. NIO的原理,包括哪几个组件
  15. 14. 简单介绍一下java的反射机制?反射在哪些地方有应用场景?
  16. 15. spring加载bean的流程
  17. 16. java线程池?线程池构造函数的几个参数含义?keepAliveTime解释一下?
  18. 17. 一个接口,要去调用另外5个接口,每一个接口都会返回数据给这个调用接口,调用接口要对数据进行合并并返回给上层。这样一种场景可能用到并发包下的哪些类?你会怎么去实现这样的业务场景
  19. 18. CountDownLatch和CyclicBarrier的区别
  20. 19. 线程加锁有哪些方式?synchronized和lock的区别
  21. 20. volatile关键字的作用?为什么使用AtomicLong而不使用Long?AtomicLong的底层是怎么实现的?
  22. 21. mysql的存储引擎有哪几种
  • 22. sql优化有哪些着手点?组合索引的最左前缀原则的含义
    1. 23. springmvc处理请求的流程
    2. 24. spring的事务怎么使用?事务回滚?自定义异常?
    3. 24. 检查型异常非检查型异常
    4. 25. 脏读?幻读?
    5. 26. DOCTYPE作用(太保面试题)
  • 美团面试篇

    1. java虚拟机内存模型

    java内存模型

    2. 内存溢出一般发生在哪个区?永久代会不会导致内存溢出

    堆内存溢出、栈内存溢出。永久代是JDK1.7中方法区的一种实现,会导致内存溢出,最常见的是大量JSP文件导致永久代溢出

    3. 动态加载类的框架了解哪些

    JDK动态代理、CGLIB框架 proxy

    4. 动态代理一般有哪几种实现方式?动态代理的应用场景有哪些

    JDK动态代理、CGLIB框架 proxy

    应用场景:

    • 统计每个API的请求耗时
    • 统一的日志输出
    • 检验被调用的API是否已经登录和权限鉴定
    • 事务处理

    5. 栈会不会溢出?栈溢出一般抛什么异常?jvm在哪里设置栈的大小?设置的参数是什么?

    会。StackOverflowError -Xss256K

    6. 用过哪些命令查看jvm的状态、堆栈信息?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 
    top # 列出消耗CPU靠前的进程
    top + H # 列出消耗CPU靠前的线程
    jstack [进程]|grep -A 10 [线程的16进制] # jstack查找这个线程的信息 -A 10表示查找到所在行的后10行

    # 频繁GC问题或内存溢出问题
    jps # 线程PID查看
    jstat -gc 3331 250 20 # 查看GC情况
    jstat -gccause # 额外输出上次GC原因
    jmap -dump:format=b,file=heapDump # 3331生成堆转储文件

    # 死锁问题
    jps # 线程PID查看
    jstack 1159 > /opt/temp/dump1 # 转储查看线程情况

    详细参考

    7. jvm的垃圾回收机制

    垃圾收集算法: 复制算法、标记-清除算法、标记-整理算法、分代收集算法
    垃圾回收算法的实现原理
    几种垃圾收集器

    8. java类加载机制?如何实现自定义类加载器?findClass与loadClass的区别?

    类加载机制

    实现自定义类加载器
    继承自ClassLoader,并重写findClass()与loadClass()

    区别
    findClass()用于写类加载逻辑,loadClass()里的逻辑里如果父类加载器加载失败则会调用自己的findClass()来完成,保证了双亲委派原则
    如果不想破坏双亲委派模型,只需要重写findClass();如果想打破双亲委派模型,则重写loadClass()

    8. String、StringBuffer、StringBuilder的区别?对应的使用场景?

    item ‘+’区别 多线程 性能 使用场景 优化
    String 不可变类,重新创建字符串 不安全 操作少量数据,字符串不变时
    StringBuilder 可变类,原字符串基础上生成字符串 不安全 性能最好(比StringBuffer高10%~15%) 单线程用于操作大量数据(方法内部,用完回收) 尽可能指定容量(默认16,不超过16字符不用指定),不指定显著降低性能
    StringBuffer 可变类,原字符串基础上生成字符串 安全 性能好 主要用在全局变量中,多线程下安全 同StringBuilder

    9. 如何实现不可变的类

    • class声明为final,不可以被继承
    • field都是private final,不能提供它们的setter方法
    • 使用私有的构造器通过深拷贝初始化成员变量
    • 在getter方法中不能返回对象本身,返回对象的拷贝
    • 使用建造者模型创建不可变类

    10. 浅复制和深复制?怎样实现深复制?

    item 值类型拷贝 引用类型拷贝
    浅拷贝 独立副本 拷贝引用
    深拷贝 独立副本 拷贝引用对象及其子对象

    11. HashMap、HashTable、ConcurrentHashMap的区别?

    ConcurrentHashMap与HashMap等的区别

    12. CAS是一种什么样的同步机制

    使用循环CAS来实现原子操作

    13. NIO的原理,包括哪几个组件

    1) Channel

    实现

    • FileChannel: 读写文件
    • DatagramChannel: UDP协议网络通信
    • SocketChannel: TCP协议网络通信
    • ServerSocketChannel: 监听TCP连接

    [扩展]Channel与Stream的区别

    • Channel是双向的,可读可写;Stream是单向的(所以分为InputStream、OutputStream)
    • Channel有非阻塞I/O模式;Stream为传统阻塞I/O模式

    2) Buffer

    有三个重要的变量

    • capacity: 总容量
    • position: 指示当前位置
    • limit: 读写边界位置

    几个重要方法:

    • flip(): 设置limit = position;position = 0;,对buffer读取前调用
    • rewind(): 设置position = 0;,对buffer读取前进行调用,比如读取同一个buffer数据写入多个通道时会用到
    • clear(): 设置position = 0;limit = capacity;,对buffer重新写入时调用
    • compact(): 将未读完的数据(position~limit)之间的数据移动到缓冲区开头,并将position设置为这段数据末尾的下一个位置。等价于向缓冲区重新写入了这一段数据

    3) Selector

    Selector选择器用于采集各个通道的状态。我们先将通道注册到选择器,并设置好关心的事件,然后调用select()方法,线程挂起,让出CPU,静静等待事件发生。

    通道有4个事件可供监听

    • SelectionKey.OP_ACCEPT: 有可以接受的连接
    • SelectionKey.OP_CONNECT: 连接成功
    • SelectionKey.OP_READ: 有数据可读
    • SelectionKey.OP_WRITE: 可以写入数据

    NIO

    14. 简单介绍一下java的反射机制?反射在哪些地方有应用场景?

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能调用他的任一方法

    应用场景:

    • Spring中的IOC/DI
    • JDBC中的驱动加载

    15. spring加载bean的流程

    Spring加载流程

    16. java线程池?线程池构造函数的几个参数含义?keepAliveTime解释一下?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class ThreadPoolExecutor {
    public ThreadPoolExecutor(int corePoolSize,
    int maximumPoolSize,
    long keepAliveTime,
    TimeUnit unit,
    BlockingQueue<Runnable> workQueue,
    ThreadFactory threadFactory,
    RejectedExecutionHandler handler) {
    // ...
    }
    }

    线程池的构造参数有7个:

    • corePoolSize: the number of threads to keep in the pool, even if they are idle, unless {@code allowCoreThreadTimeOut} is set
    • maximumPoolSize: the maximum number of threads to allow in the pool
    • keepAliveTime: when the number of threads is greater than the core, this is the maximum time that excess idle threads will wait for new tasks before terminating
    • unit: the time unit for the {@code keepAliveTime} argument
    • workQueue: the queue to use for holding tasks before they are executed. This queue will hold only the {@code Runnable} tasks submitted by the {@code execute} method
      • ArrayBlockingQueue
      • LinkedBlockingQueue
      • SynchronousQueue
      • PriorityBlockingQueue
    • threadFactory: the factory to use when the executor creates a new thread
    • handler: the handler to use when execution is blocked because the thread bounds and queue capacities are reached
      • CallerRunsPolicy: A handler for rejected tasks that runs the rejected task directly in the calling thread of the {@code execute} method
      • AbortPolicy: A handler for rejected tasks that throws a {@code RejectedExecutionException}.
      • DiscardPolicy: A handler for rejected tasks that silently discards the rejected task.
      • DiscardOldestPolicy: A handler for rejected tasks that discards the oldest unhandled request and then retries {@code execute}

    17. 一个接口,要去调用另外5个接口,每一个接口都会返回数据给这个调用接口,调用接口要对数据进行合并并返回给上层。这样一种场景可能用到并发包下的哪些类?你会怎么去实现这样的业务场景

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class Solution {
    private static ExecutorService executorService = Executors.newFixedThreadPool(3);
    public static void main(String[] args) {
    CyclicBarrier barrier = new CyclicBarrier(5, () -> {
    // 执行结果汇总
    });
    executorService.execute(() -> {
    // 执行接口1调用,其他接口调用类似
    try {
    barrier.await();
    } catch (InterruptedException e) {
    e.printStackTrace();
    } catch (BrokenBarrierException e) {
    e.printStackTrace();
    }
    });
    }
    }

    18. CountDownLatch和CyclicBarrier的区别

    所有线程必须全部到达栅栏处,才能继续执行;闭锁结束前,不允许线程执行,结束时,允许所有线程执行
    栅栏等待线程;闭锁等待事件
    栅栏可以使参与方在栅栏处反复汇集;闭锁是一次性事件,一旦进入终止状态,不能被重置

    JAVA同步工具类之闭锁
    JAVA同步工具类之栅栏

    19. 线程加锁有哪些方式?synchronized和lock的区别

    synchronized与lock

    synchronized和ReentrantLock之间的选择

    20. volatile关键字的作用?为什么使用AtomicLong而不使用Long?AtomicLong的底层是怎么实现的?

    Java并发机制底层实现原理之volatile

    long 64位,不具有原子性,使用AtomicLong使其具有原子性,线程安全
    AtomicLong底层采用volatile + CAS, 具体采用Unsafe类CAS赋值

    21. mysql的存储引擎有哪几种

    功能 InnoDB MyISAM Memory
    存储限制 64TB 256TB RAM
    支持事务 Yes No No
    支持全文索引 No Yes No
    支持数索引 Yes Yes Yes
    支持哈希索引 No No Yes
    支持数据缓存 Yes No N/A
    支持外键 Yes No No

    22. sql优化有哪些着手点?组合索引的最左前缀原则的含义

    数据库优化的思路

    最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like(%位于左边停止匹配,在右边仍然走索引))就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
    =和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式

    23. springmvc处理请求的流程

    SpringMVC用到的注解,作用是什么,原理

    24. spring的事务怎么使用?事务回滚?自定义异常?

    使用注解@Transactional
    如让checked例外也回滚@Transactional(rollbackFor=Exception.class),一般只需添加这个即可
    让unchecked例外不回滚@Transactional(notRollbackFor=RunTimeException.class)
    不需要事务管理的(只查询的方法)@Transactional(propagation=Propagation.NOT_SUPPORTED)或者不添加

    Spring声明式事务管理默认对非检查型和运行时异常进行回滚,而对检查型异常则不进行回滚
    如果异常被try{} catch{}了,事务就不回滚了,要想回滚就必须在往外抛try{} catch{throw Exception}
    Spring事务设置手动回滚:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()
    Transaction是否生效,仅取决于是否加载于接口方法,并且是否通过接口方法调用(而不是本类调用)

    24. 检查型异常非检查型异常

    1)继承自RuntimeException和Error的是非检查型异常,继承自Exception的则是检查型异常(当然RuntimeException也是Exception的子类)
    2)对非检查型异常可以不用捕获,检查型异常必须捕获处理

    25. 脏读?幻读?

    26. DOCTYPE作用(太保面试题)

    DOCTYPE是用来声明文档类型和DTD规范的,一个主要的用途便是文件的合法性验证
    DTD(document type definition,文档类型定义)是一系列的语法规则, 用来定义XML或(X)HTML的文件类型。
    浏览器会使用它来判断文档类型, 决定使用何种协议来解析,以及切换浏览器模式

    支持一下
    扫一扫,支持沈健
    • 微信扫一扫
    • 支付宝扫一扫