Java面试
文章平均质量分 93
Jason&Zhou
你知道的越多,你不知道的越多!
展开
-
大量NullPointExcepiton导致老年代被打满,引起巨量Full GC使应用程序停止
一、前言我们线上有个应用程序,大约每隔一个星期左右就会出现假死现象,也就是进程在,但是实际程序已经挂掉了,开始排查没有发现什么问题,然后就写了一个每周重启进程的脚本,定时重启进程,好了一段时间。大约在一周前,发现重启脚本也不好使了,每次重启后,大约不到十五分钟进程就会挂掉,意识到问题的严重性了,故开始以下的排查:二、正文1、首先通过jmap命令看下堆中各个区域信息是否正常,命令如下:jmap -heap pid结果如下:我去,这年轻代、老年代和永久代都已经炸了。。。我首先想到的是永久代空间原创 2021-12-03 10:35:00 · 1073 阅读 · 0 评论 -
MySQL存储引擎不能使用索引中范围条件右边的列
一、前言对于range查询,在一条组合索引里面,range字段后面的列是不生效的,不会使用索引,range列自身仍是生效的。二、正文(1)首先建立一个学生表:(2)建立一个联合索引(name,age,class_id)测试Case1:只有 name 且是等于explain select * from student where name = 'Mitsunari' 结果如下:注意:ken_len字段长度和ref字段使用了索引中的第一列,也就是name。Case2:name和ag原创 2021-10-29 16:30:52 · 1627 阅读 · 0 评论 -
Mysql之Using filesort优化
一、前言在使用 explain 命令优化SQL语句的时候常常会在Extra列的描述中发现 Using filesort 选项,其实这个名字很容易造成误解,一开始我以为是“文件排序”的意思,进一步说可能就是使用了磁盘空间来进行排序,但是这个理解是错误的,Using filesort 真正含义其实只有 sort 这一个单词,和 file 没有什么关系,仅仅表示没有使用索引的排序。filesort使用的算法是QuickSort,即对需要排序的记录生成元数据进行分块排序,然后再使用mergesort方法合并块。其原创 2021-10-29 10:14:55 · 7814 阅读 · 1 评论 -
String值为什么不能被修改以及对StringBuff和StringBuilder的理解
一、String值为什么不能被修改1.1、首先我们来看个例子:public class testString { public static void main(String[] args) { String str = "abc"; str = "123"; System.out.println(str); }}看到上面的例子,你们会认为str的值改变了啊,从“abc”变为“123”了啊。表面上看确实是这个样子的,但让我们来看下在原创 2021-10-24 10:02:34 · 1517 阅读 · 2 评论 -
redis缓存雪崩、击穿、穿透详解及其应对办法
redis作为高并发的基石,在各大互联网存储技术中拥有广泛的应用。而缓存雪崩、击穿、穿透这三个概念也许我们都听说过,但这三个概念具体含义及其却别是什么呢?让我们一起来揭开他们的神秘面纱。一、缓存雪崩1、概念目前电商的首页以及热点数据都会做缓存,一般缓存都是定时任务去刷新,或者查不到后去更新,定时刷新就会存在一个问题:比如:如果所有首页key的失效时间是12小时,中午12点刷新,零点秒杀活动有大量的用户涌入,假设每秒6000个请求,本地缓存能抗住每秒5000个请求,但是所有的key都失效了,每秒400原创 2020-10-12 17:17:51 · 853 阅读 · 0 评论 -
ArrayList源码解析
一、前言ArrayList我们在实际开发中是一个很常用的数据结构,可以称它为动态数组。我们平常用的这个形式的:int[] a = new int[size]称为普通数组,在new时候需要指定其大小(size),不能够动态的增加其大小,那么接下来我们来看看ArrayList为什么称之为动态数组。二、正文1.ArrayList有用过嘛?它是一个什么东西?用来干什么的?有用过,ArrayList就是数组列表,主要用来装载数据,当我们装载的是基本类型的数据int、long、boolean、short、b原创 2021-07-11 20:07:23 · 234 阅读 · 1 评论 -
Redis集群的三种模式
一、前言在实际生产中,如果 redis 只部署一个节点,当机器故障时,整个服务都不能提供服务了。这就是我们常说的单点故障。如果 redis 部署了多台,当一台或几台故障时,整个系统依然可以对外提供服务,这样就提高了服务的可用性。今天我们就聊聊 redis 高可用的三种模式:主从模式,哨兵模式,集群模式。二、正文1.主从复制模式主从复制的作用通过持久化功能,Redis保证了即使在服务器重启的情况下也不会丢失(或少量丢失)数据,因为持久化会把内存中数据保存到硬盘上,重启会从硬盘上加载数据。 但原创 2021-07-11 19:57:07 · 586 阅读 · 0 评论 -
Redis基础及其高级用法
一、前言传统的关系型数据库如Mysql、Oracle等已经不能适用所有的场景了,比如秒杀的库存扣减,APP首页的访问流量高峰等等,都很容易把数据库打崩,所以引入了缓存中间件,目前市面上比较常用的缓存中间件有Redis和Memcached,当然还有基于内存的缓存,比如Ehcache 。下面先讲一下上面三种缓存区别已经优缺点。二、正文缓存是高并发场景下提高热点数据访问性能的一个有效手段,在开发项目时会经常使用到。1.缓存类型有哪些?缓存的类型分为:本地缓存、分布式缓存和多级缓存。本地缓存:本原创 2021-07-11 16:02:38 · 616 阅读 · 1 评论 -
Mysql数据库事务
一、前言MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说:银行系统,一个人转钱给另外一个人,这个过程应该放到一个事务中,不能因为其中一个环节失败,而导致钱的丢失,要么全部成功,要么全部失败。下面带大家了解下数据库事务的特点、事务的隔离级别以及并发事务所带来的问题等等。二、正文1.事务的四个特性?从业务角度出发,对数据库的一组操作要求保持4个特征:Atomicity(原子性):一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对原创 2021-07-10 20:00:24 · 352 阅读 · 0 评论 -
MVCC详解
多版本并发控制(MultiVersion Concurrency Control,简称 MVCC )详解一、前言全称Multi-Version Concurrency Control,即多版本并发控制,主要是为了提高数据库的并发性能。以下文章都是围绕InnoDB引擎来讲,因为myIsam不支持事务。同一行数据平时发生读写请求时,会上锁阻塞住。但mvcc用更好的方式去处理读—写请求,做到在发生读—写请求冲突时不用加锁。这个读是指的快照读,而不是当前读,当前读是一种加锁操作,是悲观锁。那它是怎么做到读原创 2021-07-09 17:02:01 · 23421 阅读 · 16 评论 -
Mysql数据库优化
一、前言在Mysql数据库索引详解章节中,我们介绍了数据库索引结构和各种索引的概念及其作用。我们知道,对数据库优化可以加索引,但是我们怎么知道加了是什么索引呢?就是说,具体这条sql走的是哪个索引呢?这就需要我们运行执行计划—explain ,通过执行计划来看是否按照我们的意愿走了对的索引,还是走的全表扫描,而且还需要先排除缓存的干扰,还有就是哪些情况会导致索引失效等等。下面先带大家了解下数据库缓存的知识点。二、正文1.Mysql基础架构数据库调优其实一般情况都是我们的SQL调优,SQL的调优原创 2021-07-07 20:54:06 · 409 阅读 · 3 评论 -
Mysql数据库索引详解
一、前言随着我们业务量不断的增大,会发现查询数据库的时间变的越来越长,其实就是数据库到达了性能的瓶颈,这时候需要我们对其进行优化操作,可能我们第一时间就会想到:加索引。没错,这是优化的一个方向,但是我们不能只知道加索引,还应该知道索引都有哪些类型啊,索引是怎样的一种结构啊,聚合索引和非聚合索引的区别啊等等一系列相关的问题。下面我就来分别介绍下这些知识点二、正文1.Mysql索引都有哪几种类型,分别有什么特点?主要有两种类型:哈希索引B+ Tree索引哈希索引:哈希索引能以 O(1)原创 2021-07-06 17:19:14 · 2844 阅读 · 4 评论 -
Java线程间的协作以及创建线程的四种方式
一、前言线程间的协作方法主要有:wait、notify、notifyAll、sleep、yield、join,本文首先介绍下线程的状态有哪些,然后解释下各个方法的含义以及作用,最后从底层原理解释下它们之间的区别。二、正文1.线程的状态Java中线程中状态可分为六种:初始(NEW):新创建了一个线程对象,但还没有调用start()方法。运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如mai原创 2021-05-30 17:25:33 · 343 阅读 · 0 评论 -
Java线程池详解
前言线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性能。线程池维护多个线程,等待监督管理者分配可并发执行的任务。这种做法,一方面避免了处理任务时创建销毁线程开销的代价,另一方面避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。而本文描述线程池是JDK中提供的ThreadPoolExecutor类。当然,使用线程池可以带来一系列好处:原创 2021-05-30 17:12:14 · 687 阅读 · 0 评论 -
CountDownLatch-CyclicBarrier-Semaphore解析
一、前言CountDownLatch、CyclicBarrier、Semaphore是JUC包下常用的同步锁,其中CountDownLatch、Semaphore是基于AQS(AbstractQueuedSynchronizer)实现的共享锁。下面来看下这三个锁的具体区别。二、正文1.CountDownLatch解析先看下官方源码解释:A synchronization aid that allows one or more threads to wait until a set of op原创 2021-05-30 16:58:07 · 237 阅读 · 0 评论 -
AQS-ReentrantLock解析
前言AQS( AbstractQueuedSynchronizer )是一个用来构建锁和同步器(所谓同步,是指线程之间的通信、协作)的框架,Lock 包中的各种锁(如常见的 ReentrantLock, ReadWriteLock), concurrent 包中的各种同步器(如 CountDownLatch, Semaphore, CyclicBarrier)都是基于 AQS 来构建,所以理解 AQS 的实现原理至关重要,AQS 也是面试中区分侯选人的常见考点。正文1.AQS实现原理AQS 全称原创 2021-05-30 16:41:39 · 184 阅读 · 0 评论 -
ThreadLocal源码解析
前言ThreadLocal提供了线程的本地实例,它与普通变量的区别在于,每个使用该变量的线程都会初始化一个完全独立的实例副本。主要的作用是做数据隔离,填充的数据只属于当前线程,变量的数据对别的线程而言是相对隔离的。总的来说,ThreadLocal适用于每个线程需要自己独立的实例且该实例需要在多个方法中被使用,也即变量在线程间隔离而在方法或类间共享的场景。正文1.ThreadLocal底层原理?首先我先说下它的使用:ThreadLocal<String> localName =原创 2021-05-30 16:34:06 · 396 阅读 · 0 评论 -
Synchronized应用及其底层原理解析
一、前言在涉及到多线程同步的问题时,可能第一时间会想到用Synchronized,在jdk1.6以前Synchronized属于重量锁,就是同一时间只允许一个线程获取锁,其他线程都要阻塞等待,但这对于多线程效率问题有很大影响。在jdk1.6之后,Java团队对Synchronized做了优化,进行了锁升级,升级方向:无锁—>偏向锁—>轻量级锁—>重量级锁。下面我们来详细解析下Synchronized的使用和源码。二、正文1.Synchronized的使用场景?Synchron原创 2021-05-27 22:29:48 · 391 阅读 · 2 评论 -
Volatile应用及其底层原理解析
Volatile应用及其底层原理解析前言Volatile在面试的时候算是多线程篇必问的一个问题了,我们先通过几个栗子,看看得到的结果是不是我们想像的一样,然后在引出Volatile,以及其作用。正文我们先来看一个栗子:public class volatileDemo { public static void main(String[] args) { Jason jason = new Jason(); jason.start(); for原创 2021-05-26 21:38:04 · 399 阅读 · 3 评论 -
ConcurrentHashMap源码详解
ConcurrentHashMap源码详解一、前言在HashMap源码解析篇中,我们对HashMap源码部分进行了详细透彻的分析,提出了连环追命16连问,算是把HashMap所涉及到的知识点在源码层面都分析完了。但是HashMap在多线程环境下有线程安全的问题,这篇文章,我们讲下有什么集合可以保证在多线程的环境中线程安全。二、正文1.HashMap在多线程环境中存在线程安全的问题,那应该如何处理呢?通常我们会有三方替代方式:使用Collections.synchronizedMap(Map原创 2021-05-25 21:40:17 · 989 阅读 · 23 评论 -
HashMap源码解析
一、前言HashMap这个数据结构,不管是在实际应用中还是面试中,都是很重要的知识点。例如:在实际应用中,我们需要在O(1)时间内查找到相关的元素,假如遍历数据找其相关元素,那时间复杂度就是O(n)了,不符合我们需要在O(1)时间复杂度里找到其元素,这时我们就想到用HashMap这个数据结构来进行查找,通过匹配key和value值,可以在O(1)时间内快速找到。再比如,在面试中,面试官对HashMap底层原理会进行全方位的考察,如:HashMap 1.7,1.8底层原理有什么区别?扩容机制?线程是否安全?原创 2021-05-24 19:23:40 · 276 阅读 · 4 评论