随笔分类 - Java面经
摘要:基础篇 ArrayList扩容规则 如果调用无参arrayList构造方法,则初始长度为0;如果构造带参的构造方法,则初始容量为指定长度。 1.调用add()方法 1.第一次扩容为10(从0到9)。 2.后续扩容都是前一次的1.5倍(创建一个新数组(0-14),将旧数组的元素拷贝到新数组中去,用新数
阅读全文
摘要:(详细版请按照问题查找面经系列) arrayList扩容:无参、有参add、addaAll(复制) 多线程读写:failFast(并发修改异常)、failSafe(一致性,读写分离) LinkList、ArrayList:连续内存,随机访问快(下标)、尾插性能好、缓存,读写快(局部性原理){占用空间
阅读全文
摘要:数据类型 基本数据类型 byte short int long float double char boolean (字节)1 2 4 8 4 8 2 1 自动类型转换:byte-short-int-long-float-double 引用数据类型 String,数组等 switch,String,
阅读全文
摘要:springMVC执行流程 初始化阶段 在 Web 容器第一次用到 DispatcherServlet 的时候,会创建其对象并执行 init 方法 init 方法内会创建 Spring Web 容器,并调用容器 refresh 方法 refresh 过程中会创建并初始化 SpringMVC 中的重要
阅读全文
摘要:事务失效的几种场景 1.抛出检查异常导致事务无法正确回滚。 原因:Spring 默认只会回滚非检查异常 解法:配置 rollbackFor 属性 @Transactional(rollbackFor = Exception.class) 2. 业务方法内自己 try-catch 异常导致事务不能正确
阅读全文
摘要:Spring Bean生命周期 1.处理名称,检查缓存 一级缓存:放单例成品对象;二级缓存:放单例工厂的产品;三级缓存:放单例工厂。 2.检查父工厂 如果父子容器名称重复,优先子容器bean。 3.检查DependsOn 有依赖关系的bean创建次序有保障。无依赖关系时,A dependsOn B,
阅读全文
摘要:Spring refresh 流程 Spring refresh 概述 refresh 是 AbstractApplicationContext 中的一个方法,负责初始化 ApplicationContext 容器,容器必须调用 refresh 才能正常工作。它的内部主要会调用 12 个方法,我们把
阅读全文
摘要:当重写了finalize方法的对象,在构造方法调用时,jvm会将其包装成一个finalizer对象,并加入unfinalized队列中(双向链表)。当进行垃圾回收时,将这些对象对应的finalizer对象加入一个空的队列ReferenceQueue(单向链表)。真正的回收时机:即时对象无人引用,由于
阅读全文
摘要:# 对象引用类型## 1.强引用内存空间不足时不会被GC回收。当没有任何引用指向它或者指向它的对象为null的时候会被GC垃圾回收。## 2.软引用适用于缓存。第一次回收时不会被回收,而后当内存满,进行GC回收时会被回收。防止内存溢出。当空间充足时不会被回收。## 3.弱引用垃圾回收时直接被回收。#
阅读全文
摘要:类加载 类加载过程 1.加载 ①将类的字节码载入方法区,并创建.class对象。 ②如果此类的父类没有加载,先加载父类。 ③加载是懒惰执行。 2.链接 ①验证-验证类是否符合字节码规范,合法性、安全性检测。 ②准备-为static变量分配空间,设置默认值。 ③解析-将常量池的符号引用解析为直接引用。
阅读全文
摘要:java创建对象的过程主要分为一下五个步骤: (1)类加载检查 Java虚拟机(jvm)在读取一条new指令时候,首先检查能否在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否被加载、解析和初始化。如果没有,则会先执行相应的类加载过程。 (2)内存分配 在通过(1)后,则开始为新生的
阅读全文
摘要:内存溢出 项目中什么情况下会内存溢出,怎么解决的 1.误用固定大小线程池 当前线程任务超时后,其余任务将被加入任务队列中,任务对象所耗费的内存会导致整个堆内存耗尽,导致内存溢出异常。 解决方法: 不要用工具类提供的线程池来创建线程池。而是使用线程池时自己使用线程池的构造方法,根据实际情况设置一个有大
阅读全文
摘要:JVM垃圾回收 GC和分代回收算法 GC的目的: 实现无用对象内存自动释放,减少内存碎片,加快分配速度。 GC要点: 1.回收区域是堆内存,不包括虚拟机栈,在方法调用结束会自动释放方法占用的内存。 2.判断无用对象,使用可达性分析算法,三色表记法标记存活对象,回收未标记对象。 3.GC具体的实现称为
阅读全文
摘要:JVM垃圾回收算法 标记:找到不能被作为垃圾回收的对象并标记。标记的对象保留,未被标记的对象作为垃圾释放。 标记清除法 标记:将一定不能被回收的根对象作为GC Root对象,从根对象出发,沿着它的引用链找当前对象有没有被根对象引用到。若是则不能被回收,加标记。若否,则不加标记,GC时释放掉。 清除:
阅读全文
摘要:JVM堆内存参数: 对于JVM内存配置参数:-Xmx10240m -Xms10240m -Xmn5120m -XX:SurvivorRatio=3 其最小内存值和Survivor区总大小分别是? -Xmx10240m Xmx:Java虚拟机最大内存10G m:单位,兆字节 -Xms10240m Xm
阅读全文
摘要:虚拟机-jvm内存结构 方法区:存放类加载时的方法 堆:存放new出来的对象 虚拟机栈:记录方法内的局部变量和方法参数等信息。 程序计数器:记录main线程执行中执行其他线程,回到主线程时从哪里开始执行。 本地方法栈:调用本地方法接口实现由操作系统实现的功能(本地库) GC:内存不足时将不再使用的地
阅读全文
摘要:ThreadLocal作用: 1.线程隔离。线程间:ThreadLocal可实现资源对象的线程隔离,让每个线程各用各的资源对象,避免争用引发的线程安全问题。 2.资源共享。线程内:ThreadLocal同时实现了线程内的资源共享。 ThreadLocal原理:关联资源 每个线程中都有一个独立的Thr
阅读全文
摘要:HashTable与ConcurrentHashMap比较 1.HashTable与ConcurrentHashMap都是线程安全的Map集合。 2.HashTable与ConcurrentHashMap的键和值都不能为空。 3.HashTable并发度低,整个HashTable对应一把锁,同一时刻
阅读全文
摘要:1.悲观锁的代表是synchronized和Lock锁。 1.核心思想:线程只有占有了锁,才能去操作共享变量,每次只有一个线程占锁成功,获取锁失败的线程都得停下来等待。 2.线程从运行到阻塞、再从阻塞到唤醒,涉及线程上下文切换,如果频繁会影响性能。 3.实际上,线程在获取synchronized和L
阅读全文
摘要:volatitle能否保证线程安全? 线程安全要考虑三个方面:可见性,有序性,原子性。 1.可见性:一个线程对共享变量修改,另一个线程能看到最新结果。 2.有序性:一个线程内代码按照编写顺序执行。 3.原子性:一个线程内多行代码以一个整体运行,期间不能有其他线程代码插队。 volatile能够保证共
阅读全文