![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java面试
JmStart
这个作者很懒,什么都没留下…
展开
-
Java面试题(三十一) GitHub上的骚操作
一. 全局搜索1. 全局搜索也就是模糊搜索:如:搜索 SpringBoot搜索结果:这样搜索范围太大,且项目质量参差不齐,所以在搜索框中,还可以按 Star 数量、Fork 数量等来查询二. 精准搜索1. in 关键词限制搜索范围公式:搜索词 in:name(/description/readme)搜索结果:2. 关键字搜索>n、>=n、<n、<=n:查询数量范围,可以是 starts、forks、topics......n..*、*..n:等同于 &原创 2020-07-06 14:20:58 · 255 阅读 · 0 评论 -
Java面试题(三十) 面试官:“生产环境服务器变慢,你说说诊断思路和性能评估?”
一. 基本调试命令一般我们的服务器都是跑在Linux上的1. 整机: 1. top 系统性能 2. uptime 精简版 3. oad average:系统负载均衡 1min 5min 15min 系统的平均负 载值相加除3大于60%就代表压力过大2. CPU:1. vmstat:查看CPU参数vmstat -n 2 3 第二个参数是采样的时间间隔数单位s,第三个参数是采样的次数 procsr:运行和等待CPU时间片的进程数,原则上1核CPU的运行队列不要超过2,多核系统的原创 2020-07-06 13:35:38 · 705 阅读 · 0 评论 -
Java面试题(二十九) 阿里面试高频问题:四大GC垃圾回收算法与七大垃圾收集器是如何相辅相成的?
一. GC垃圾回收算法1. 引用计数算法2. 复制拷贝算法3. 标记清除算法4. 标记整理算法二. 垃圾收集器1. 四种主要垃圾收集器1. Serial 串行回收为单线程环境所设计且适用于一个线程进行垃圾回收,会暂停所有的用户线程,不适合服务器环境。2. Paralle 并行回收多个垃圾收集线程并行工作,此时用户线程是暂停的,适用于科学计算/大数据处理首台处理等弱交互场景。3. CMS 并发标记清除(并发回收)用户线程和垃圾收集线程同时执行(不一定是并行,可能交替执行),不需要原创 2020-07-05 15:26:46 · 280 阅读 · 0 评论 -
Java面试题(二十八) Java大陆最神秘的邪教之「OOM错误」圣使的前世今生
一. 常见的OOM1. 简述OOM错误种类:1. java.lang.StackOverflowError //这个虽然不是OOM,但是也是内存溢出错误2. java.lang.OutOfMemoryError: Java heap space3. java.lang.OutOfMemoryError: GC overhead limit exceeded4. java.lang.OutOfMemoryError: Direct buffer memory5. java.lang.OutOfM原创 2020-07-04 18:11:14 · 255 阅读 · 0 评论 -
Java面试题(二十七) JVM圣地四大天骄 之 强引用、软引用、弱引用、虚引用
一. 强引用1. 强引用 StrongReference当内存不足,JVM开始垃圾回收,对于强引用对象,就算出现了OOM也不会堆该对象进行回收。强引用是我们最常见的普通对象引用,只要还有强引用指向一个对象,就能表明对象还“活着”,垃圾收集器不会碰这种对象。在Java中最常见的就是强引用,把一个对象赋给一个引用变量,这个引用变量就是一个强引用。当一个对象被强引用变量引用时,它处于可达状态,他是不可能被垃圾回收机制回收的,即使该对象以后永远都不会被用到 JVM也不会回收。因此强引用是造成Java原创 2020-07-04 10:41:06 · 173 阅读 · 0 评论 -
Java面试题(二十六) 面试官必问的JVM基本配置参数有哪些?
一. 常用的X参数-Xms:初始大小内存,默认为物理内存1/64,等价于-XX:InitialHeapSize-Xmx:最大分配内存,默认物理内存1/4,等价于-XX:MaxHeapSize-Xss:设置单个线程栈的大小,默认542K~1024K ,等价于-XX:ThreadStackSize-Xmn:设置年轻代的大小二. 常用的XX参数-XX:MetaspaceSize设置元空间大小元空间的本质和永久代类似,都是对JVM规范中方法区的实现,不过元空间与永久代最大的区别在于:原创 2020-06-27 16:46:42 · 254 阅读 · 0 评论 -
Java面试题(二十五) 盘点如何查看JVM系统默认值
一. 如何盘点查看JVM系统默认值如何查看运行中程序的JVM信息:jps -l 查看进程信息jinfo -flag 配置项 进程号jinfo -flags 进程号 ==== 查看所有配置1.JVM参数类型(3种)1.标配参:java -version -help图示:2.x参数:java -Xint/-Xcomp/-Xmixed -version-Xint :解释执行-Xcomp:第一次使用就编译成本地代码-Xmixed:混合模式-Xint图示:-Xcomp图示:原创 2020-06-27 11:07:55 · 186 阅读 · 0 评论 -
Java面试题(二十四) 面试官:“JVM垃圾回收的时候是如何确定垃圾的?什么是GC Roots?”
一. JVM垃圾回收的时候是如何确定垃圾的?1.垃圾的定义:内存中已经不再使用到的空间就是垃圾。2.如何判断一个对象是否可以被回收引用计数法:Java中引用和对象是有关联的。如果要操作对象则必须用引用进行。因此很显然一个简单的办法是通过引用计数来判断一个对象是否可以回收,简单说,给对象中添加一个引用计数器,每当有一个地方引用它,计数器加1,每当有一个引用失效时,计数器减1,任何时刻计数器数值为零的对象就是不可能再被使用的,那么这个对象就是可回收对象。但是它很难解决对象之间相互循环引用的问原创 2020-06-26 13:57:43 · 241 阅读 · 0 评论 -
Java面试题(二十三) 了解Java大陆最核心的门派JVM圣地
一. JVM简介1.JVM运行图:JVM是运行在操作系统之上的,他与硬件没有直接的交互。2.JVM体系结构图:1.Class Loader类加载器负责加载class文件,class文件在文件开头有特定的文件标示,并且ClassLoader只负责class文件的加载,值与他是否可以允许,则由Execution Engine决定2.Execution Engine执行引擎 负责解释命令,提交操作系统执行3.Native Interface 本地接口Java语言本身不能对操作系统底层进行原创 2020-06-26 13:42:22 · 187 阅读 · 0 评论 -
Java面试题(二十二) 手写死锁+死锁故障定位排查
一. 手写死锁1.死锁的定义:死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉那他们都将无法推进下去,如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。通俗的讲:就是吃着碗里的,看着锅里的。2.死锁产生的原因:1.系统资源不足2.进程运行推进的顺序不合适3.资源分配不当3.死锁产生原因图解:4.代码模拟死锁://资源类class HoldLockThread impleme原创 2020-06-26 08:15:46 · 388 阅读 · 0 评论 -
Java面试题(二十一) 面试官:“怎么合理配置线程池的线程数,你是如何考虑的?”
一. 介绍这里说的线程数是只七大参数中的第二个参数maximumPoolSize:线程池能够容纳同时执行的最大线程数这里要分成两种情况考虑: 1. CPU密集型 2. IO密集型1. CPU密集型:CPU密集的意思是该任务需要大量的运算,而没有阻塞,CPU一直全速运行CPU密集任务只有在真正多核CPU上才可能得到加速(通过多线程)而在单核CPU上,无论你开几个模拟的多线程该任务都不可能得到加速,因为CPU总的运算能力就那些CPU密集型任务配置尽可能少的线程数量:一般公式:CPU核原创 2020-06-25 17:30:34 · 930 阅读 · 0 评论 -
Java面试题(二十) 手写线程池+解析四大隔离策略
一. 实现线程池步骤七大核心参数全部使用上: 1. 2个核心线程 (2个工作员工) 2. 池中可以有5个线程 (最多有5个员工) 3. 1秒后判断是否过了高峰期,需不需要撤掉其他员工 4. 时间的单位 5. 任务队列 (候客区设置为3位) 6. 线程工厂 (默认银行Logo) 7. 隔离策略 (超过我设置的最大员工数加候客区人数,就会拒绝其他客户在这个银行办公)不熟悉线程池七大核心参数看这篇:细说线程池七大核心参数二. 四大隔离策略原创 2020-06-25 16:49:22 · 604 阅读 · 0 评论 -
Java面试题(十九) 细说线程池秘境“七大参数”护法的身世
一. 线程池七大参数详解1. 底层源码/** * Creates a new {@code ThreadPoolExecutor} with the given initial * parameters. * * @param corePoolSize the number of threads to keep in the pool, even * if they are idle, unless {@code allowCoreThre原创 2020-06-25 09:47:50 · 1264 阅读 · 0 评论 -
Java面试题(十八) 初窥Java大陆神秘的线程池秘境
一. 线程池1. 定义:1.线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后启动给这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行。2.主要特点: 线程复用、控制最大并发数、管理线程 降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗 提高响应速度,当任务到达时,任务可以不需要等到线程创建就能立即执行 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗原创 2020-06-24 10:16:56 · 225 阅读 · 0 评论 -
Java面试题(十七) 在多线程中获得线程的3种方式
一. 继承Thread类class MyThread extends Thread { @Override public void run() { super.run(); }}二. 实现Runnable接口class MyThread2 implements Runnable { @Override public void run() { }}三. 实现Callable接口class MyThread3 implem原创 2020-06-24 07:33:18 · 132 阅读 · 0 评论 -
Java面试题(十六) 武学巅峰之阻塞队列版生产者消费者模式
一. 阻塞队列版生产者消费者模式1. 使用到的技术包括: Volatile:保证可见性 CAS/AtomicInteger:保证原子性 BlockingQueue:保证并发性2. 集合了前面几篇文章的精华:1. 了 解 Volatile2. 了 解 CAS3. 了 解 AtomicReference4. 了 解 阻塞队列5. 了 解 传统生产者消费者模式3. 阻塞队列版生产者消费者模式:代码演示//资源类class MySource { //标识 volatile保原创 2020-06-23 11:17:29 · 131 阅读 · 0 评论 -
Java面试题(十五) Synchronized和Lock的区别?说说Lock的好处?
一. Synchronized和Lock的区别1. 区别1. 原始构成: synchronized是关键字属于jvm层面 monitorenter,底层是通过monitor对象来完成,其实wait/notify等方法也依赖于monitor对象只有在同步或方法中才能掉wait/notify等方法 monitorexit Lock是具体类,是api层面的锁(JUC)2. 使用方法: sychronized不需要用户取手动释放锁, 当synchronized代码执行原创 2020-06-23 08:55:58 · 396 阅读 · 0 评论 -
Java面试题(十四) 传统版生产者消费者模式
一. 生产者消费者模式1. 定义:生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲原创 2020-06-22 17:12:03 · 204 阅读 · 0 评论 -
Java面试题(十三) 阻塞队列之神兵出鞘
一. 阻塞队列1. 常见的阻塞队列: ArrayBlockingQueue:是一个基于数组结构的有界阻塞队列, 此队列按FIFO原则对元素进行排序。 LinkedBlockingQueue:是一个基于链表结构的阻塞队列, 此队列按FIFO排序元素,吞吐量通常要高于ArrayBlockingQueue。 SynchronousQueue:是一个不存储元素的阻塞队列, 每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态, 吞吐量通常要高于LinkedBlocking原创 2020-06-22 15:47:06 · 240 阅读 · 0 评论 -
Java面试题(十二) 面试官:“ 小伙子 CountDownLatch、CyclicBarrier、Semaphore 使用过吗?”
一. CountDownLatchCountDownLatch:他允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。他是线程一直减减的CountDownLatch主要有两个方法, 1.当一个或多个线程调用await()方法时,调用线程会被阻塞。 2.其他线程调用countDown()方法会将计数器减1,当计数器的值变为0时, 因调用await()方法被阻塞的线程才会被唤醒,继续执行案例:饭店吃饭public static void main(Stri原创 2020-06-21 10:22:52 · 240 阅读 · 0 评论 -
Java面试题(十一) 揭秘Java大陆的神秘家族“锁”之一族(四) 手写读写锁
一. 独占(写)锁与共享(读)锁独占(写)锁与共享(读)锁也可以叫读写锁简单理解就是,我写的时候不能被其他线程干扰,需要独占线程资源,我读的时候可以共享并发进行。二. 实现读写锁模拟缓存来实现读写锁手写一个缓存需要三点: 1.存值 put(key, value) 2.取值 get(key) 3.清空缓存 clearclass Mycache { //缓存空间 private volatile Map<String, Object> map = new原创 2020-06-20 18:54:19 · 256 阅读 · 0 评论 -
Java面试题(十) 揭秘Java大陆的神秘家族“锁”之一族(三) 手写自旋锁
一. 手写自旋锁自旋锁好处,循环比较获取直到成功为止,没有类似wait的阻塞1. 实现步骤 通过CAS操作完成自旋锁, T1线程先进来调用mylock方法自己持有锁5秒钟, T2随后进来发现当前有线程持有锁,不是null,所以只能通过自旋等待, 直到T1释放锁后T2随后抢到线程资源底层源码是这样实现自旋锁的public final int getAndAddInt(Object var1, long var2, int var4) { int var5;原创 2020-06-20 17:09:05 · 204 阅读 · 0 评论 -
Java面试题(九) 揭秘Java大陆的神秘家族“锁”之一族(二) 可重入锁(递归锁)
一. 可重入锁(递归锁)1. 定义:指的时同一线程外层函数获得锁之后,内层递归函数仍然能获取该锁的代码,在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁,也就是说,线程可以进入任何一个它已经拥有的锁所同步着的代码块。简单来说,就是进门后开了一个大门锁,就可以进入厨房,厕所,客厅等等,都可以进入。2. 可重入锁作用:最大的作用就是避免死锁3. 使用synchronized实现可重入锁class Phone { //证明 synchronized实现可重入锁 p原创 2020-06-20 12:04:33 · 348 阅读 · 0 评论 -
Java面试题(八) 揭秘Java大陆的神秘家族“锁”之一族(一) 公平锁与非公平锁
一. 公平锁1. 定义:公平锁:Threads acquire a fair lock in the order in which they requested it公平锁:就是很公平,在并发环境中,每个线程在获取锁时,会先查看此锁维护的等待队列,如果为空,或者当前线程就是等待队列的第一个,就占有锁,否则就会加入到等待队列中,以后会按照FIFO的规则从队列中取到自己。简单来说:就是按照顺序办事,不可以加塞,插队等。2. 实现:Lock lock = new ReentrantLo原创 2020-06-20 09:04:49 · 142 阅读 · 0 评论 -
Java面试题(七) 集合家族之ArrayList在多线程下怎么说才能让面试官满意?
一. ArrayList在多线程下的完全隐患面试官最喜欢问到的关于ArrayList在多线程下的三问是:1. ArrayList是线程不安全的,请写一个不安全的例子出来?2. 怎么解决呢?3. 更好的解决方案呢?1. ArrayList是线程不安全的,请写一个不安全的例子出来?代码演示public static void main(String[] args) { List<String> list = new ArrayList<>();原创 2020-06-10 09:49:50 · 212 阅读 · 0 评论 -
Java面试题(六) 解决CAS大美女引来的ABA渣男
一. ABA问题简介假设有线程1和线程2,线程1执行一次任务需要10毫秒,线程2执行一次任务需要2毫秒线程1先从主内存取出A,但是他慢,他的等,线程2同时也从内存取出A,并且线程2执行的快,所以他可以进行多次访问主存并且修改主存内的值,如线程2把A修改成B,在把B修改成A,当线程1在执行的时候发现主存还是A,他就正常修改数据了。但是所有人都知道这是有猫腻的,看似一样,实则已经被更换过了,也可以简单理解为"狸猫换太子"。代码演示ABA问题 //原子引用 public stati原创 2020-06-08 12:04:16 · 205 阅读 · 0 评论 -
Java面试题(五) 揭开CAS大美女的神秘面纱
一. CAS定义1. CAS:比较和交换(Conmpare And Swap)是用于实现多线程同步的原子指令。2. 它将内存位置的内容与给定值进行比较,只有在相同的情况下,将该内存位置的内容修改为新的给定值。 3. 这是作为单个原子操作完成的。 4. 原子性保证新值基于最新信息计算; 如果该值在同一时间被另一个线程更新,则写入将失败。 5. 操作结果必须说明是否进行替换; 这可以通过一个简单的布尔响应(这个变体通常称为比较和设置),或通过返回从内存位置读取的值来完成(摘自维基本科)二.原创 2020-06-07 16:55:41 · 249 阅读 · 0 评论 -
Java面试题(四) 单例模式是如何在并发多线程下稳如老狗的?
一. 单例模式单例模式,属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例根据需要,也有可能一个线程中属于单例,如:仅线程上下文内使用同一个实例 (来源:百度百科) 简单总结:单例模式就是需要一个私有构造器,一个私有静态类对象二. 单例模式在单线程下 //懒汉式 private static SingletonDemo instance = null; private SingletonDemo() { System.o原创 2020-06-07 11:01:21 · 215 阅读 · 0 评论 -
Java面试题(三) JUC圣教之扒扒Volatile圣使的看家本领
一. Volatile1. volatile是Java虚拟机提供的轻量级的同步机制其特性: 1.保证可见性 2.不保证原子性 3.禁止指令重排2. 保证可见性当多个线程访问主内存同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看到修改的值,并重新从主内存中取出修改后的变量。...原创 2020-06-06 16:11:43 · 159 阅读 · 0 评论 -
Java面试题(二) 军阀Redis家中的两房姨太太RDB&AOF
Redis持久化* Redis主要是工作在内存中。* 内存本身就不是一个持久化设备,断电后数据会清空。* 所以Redis在工作过程中,如果发生了意外停电事故,如何尽可能减少数据丢失。持久化方式* RDB (Relational Database)* AOF (Append Of File)一. RDB1. RDB简介 RDB:在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的 Snapshot 快照,它恢复时是将快照文件直接读到内存里。2. 工作机制: 每隔一段时间,原创 2020-06-02 12:02:53 · 129 阅读 · 0 评论 -
Java面试题(一) MyBatis中实体类属性名&表字段名的爱恨情仇
一. MyBatis中当实体类中的属性名和表中的字段名不一样怎么办?如: last_name = lastName , dept_id = deptId解决方案 * 1.写sql语句时起别名 * 2.在MyBatis的全局配置文件中开启驼峰命名规则 * 3.在Mapper映射文件中使用resultMap来自定义映射规则1. 写sql语句时起别名 <!-- id属性:必须是接口中方法的方法名 resultType属性:必须是方法的返回值的全类名 --> <原创 2020-06-02 10:01:58 · 195 阅读 · 0 评论