(hasnmap)角度:数据结构+扩容情况+put查找的详细过程+哈希函数+容量为什么始终都是2^N+JDK1.7与JDK1.8的区别。
1)原理: CAS是比较值,如果值相等则变换,不相等只返回当前值,多线程下会自旋竞争
2)这个我也不大会,感觉是因为用到CAS自旋,默认是乐观情况,几乎不存在竞争,不断重试等待保持者释放锁就立刻竞争?
3)单核CPU?
主要是在涉及到金融交易项目中浮点运算丢失精度的问题,通过对构造器的参数为String类型进行算术运算相关API的调用。通过API提供的对象方法进行传统的加减乘除算术运算……
static关键字和final关键字使用情况,一个类不能被继承,除了final关键字之外,还有什么方法(从构造函数考虑)?
序列化和反序列化。反序列化失败的场景。
List遍历时如何删除元素?fail—fast是什么?fail—safe是什么?
正则表达式会写吗?
静态***类对真实业务类的功能进行扩充,即创建一个***类实现和真实类方法相同的功能,让***类持有真实对象,然后通过调用***类的方法达到对真实业务逻辑的升级。缺点就是:如果真实对象中有多个业务逻辑方法(或者有多个真实对象实例),那***对象同样需要调用多个逻辑方法和对象,造成***类的膨胀。动态***是通过在运行时,动态生成一个持有RealObject、并实现***接口的Proxy,同时注入相同的逻辑。……
做题:手写一个对象池
接口实现的关系。ReadWriteLock读锁(多个线程可以共同读)和写锁(只有一个线程写),对应的readLock()和writeLock()用于读取操作和写入操作的锁……。ReentrantReadWriteLock结合了ReentrantLock和ReadWriteLock的实现,其构造方法的重载决定了其公平或非公平的模式默认是非公平(即没有参数)可能导致多个读写线程的推迟,而公平模式可以兼顾到等待时间将长的写线程获取到锁……。
重入特性,允许读写重新获取读取锁或写入锁。在写入线程保持的所有写入锁都被释放后,才允许重入读线程使用。锁降级,允许写锁降级为读锁,通过先获取写入锁,然后获取读取锁,最后释放写入锁,反之是不允许的。锁获取的中断,读取锁和写入锁都支持获取期间的中断。
答:系统性能变低。一般full gc不会频繁执行,如果出现了就要去查看一下是不是创建了大的对象或者空间分配担保失败。调大参数。
推测答案:堆栈参数设置是堆栈的临界值,但是jvm进程占用虚拟内存的大小包括的范围不止堆栈,还有元空间,元空间实际占用的是本机内存,不会受到堆栈参数限制,如果虚拟内存过大是元空间造成的(且没有超过元空间的限制)而不是堆内存过大造成的,就可能导致虚拟内存大于堆栈参数但是进程并不报错。欢迎有更好的答案指点一下
-最好是画个草图来阐述。阻塞式IO:当用户进程对服务请求时,服务器在返回数据的过程中,用户线程阻塞在调用处,直到数据返回才继续执行。非阻塞式IO:当用户请求数据时会立即得到一个回复,即使数据报还没准备好,不会阻塞用户线程的其他执行操作。异步IO:用户发出请求后会立即得到一个请求,不阻塞用户的其他执行,当数据准备好后会通知用户。
-同步就是调用者必须等到方法调用返回后,才能继续后续的行为,异步调用会立即返回,调用者可以继续后续的操作,因为真正的执行不会影响阻塞调用者。并发,多个任务交替执行,但每次只有一个任务在执行。并行是真正的同时执行……
-------------手写伪代码来说明……
CPU 时而 100%,内存经常 100%,怎么定位问题,并且解决
查看一个线程的信息
------年轻代(Eden,Suvivor1,Suvivor2),年老代……阐述下对象的生命周期随着GC而从不同的年龄代区域进行迁移……任何一个空间不够用的时候都会促使JVM进行GC。
----------(一坑套一坑,环环都是坑)对象在内存中的存储布局,对象头、实例数据、对齐填充(按理说这个不是我们业务开发员所关注的定义,都是翻译老外的一些术语),主要还是对象的生命周期导致GC回收,也就是判读对象是否存活。引用计数算法是根据对象的引用来给计数器增减1,当计数器为0的对象即被回收,但很难解决对象之间的相互引用;根搜索算法,GCROOT作为对象起始点,向下搜索,搜索的路线为引用链,如果有些对象不再引用链触及点,那就判断为失效对象。
--------常见的AQS术语,juc中locks包下面的一个类。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待唤醒锁机制将暂时获取不到锁的线程加入到队列中。如果共享资源空闲,则将当前请求资源的线程设置为工作线程并且锁定共享资源……其实还有很多,个人也对其用法不太熟悉,只知道个大概……有时间再查资料吧
八大参数说了一遍,具体讲了自己对最大线程数和阻塞队列这两个参数的理解,如果设置的是无界队列,那么最大线程数这个参数就没什么意义了 . 又说了下线程池的具体工作流程vol
会触发拒绝策略,拒绝策略其实就是一个接口,这个接口有个方法,会传进来两个参数,一个是线程池本身另一个是继续添加的任务,你想怎么处理这个任务都行,比如直接抛弃报异常,或者是让当前线程去执行这个任务.....
-翻译过来就是循环栅栏。JUC包下的类,其构造方法就是一组线程在达到栅栏的某个状态后就执行一定数量的线程。该类型的对象await()方法是是挂起作用,其重载方法可以指定挂起到一定的时间……
高并发的大型项目中如果每个请求都去创建线程,那么线程的创建、销毁、上下文切换等操作都会造成资源的损耗。所以需要一个专门管理线程的类,这个类负责安排空闲的线程运行任务
手写简单的线程池,体现线程复用
锁就是在多线程访问并对共享资源进行写的时候而进行的一种管控。synchronized关键字就是一个例子,通过修饰静态方法、实例方法,或者代码块的方式保证锁管控的代码具有原子性和单线程操作性(写操作)……。JDK后来升级为加入了Lock接口来实现和synchronized类似功能,使用时需要手动获取锁和释放锁,可中断获取锁,超时获取锁
属于对上个问题的延续。API也就是上一个问题的手动获取/释放锁,中断锁……。实现类:ReentrantLock可重入锁,ReadLock读锁,WriteLock写锁。一般的使用方式就是多态的概念,以接口类型作为引用指向对应的不同实现类,创建不同的锁实例对象。对于可重入锁ReentrantLock,多个线程获取其lock()进行业务代码的操作,必须按照争夺锁的先后依次执行,一个线程执行完毕后,另一个线程才能获取锁执行,术语称其为独占锁
重入锁就是该类创建的实例对象能够多次调用lock方法和unlock方法进行当前线程持有锁的次数增加/减少,通过对象的getHoldCount可以进行获取锁的次数。内部构造方法是一个NonfairSync的实例对象,翻译过来就是非公平锁,多个线程获取一个锁时,可能多次被同一个线程获取。
属于对上个问题的延续。Sync的一个两个子类NonfairSync和FairSync……我也不太熟悉底层源码。
实际就是使用synchronized关键字同步中用到的wait和notify,notifyAll方法的类似功能。ReentrantLock采用的是Condition接口中的await等待,signal方法进行唤醒。Condition这个接口的类型是通过ReentrantLock的实例newCondition()进行创建的类型
-是对上个问题的延续。可以通过伪代码的形式进行阐述,比如一个缓冲区有固定的大小,当缓冲区已满则put线程就只能阻塞,直到缓冲区有空间;当缓冲区已空take线程只能阻塞,直到缓冲区有数据。 new一个ReentrantLock的实例,并通过其newCondition()创建两个Condition对象;创建一个固定大小的数组对象模拟缓冲区
如何规避ThreadLocal的内存泄漏
采用直接new的方式创建CountDownLatch类型的对象,构造方法中直接传入参数int,作为计数值。……方法就是设定某些任务执行完毕后,本任务才去执行的场景
也属于JUC包下的一个类,翻译过来就是信号量,用来控制同时访问线程的个数。
原子性一系列操作不允许被中途打断,必须全部执行或者不执行;可见性是指当多个线程访问同一个共享变量时,一个线程对其修改,其他线程都可以看到;有序性多个线程对同步代码的操作,只有竞争到锁才能执行,反之没有同步的措施就会造成线程执行的无序性……。
------除了main主线程,应该还有垃圾回收机制线程吧……这个不太确定……
----------继承Thread类,实现Runnable、Callable接口。实际可以在纸上列出他们的伪代码……
-------sleep是线程暂停指定时间后继续执行,中断interrupu是线程停止运行。
进程之间的通信方式:1. 共享内存 2. 管道 3. 消息队列 4. 信号量 5. 套接字 6. 信号
线程之间的通信方式:1. 使用volatile关键字 2. 使用synchronized配合wait()和notify() 3. JUC工具类CountDownLatch(闭锁) 4. 使用ReentrantLock结合Condition 5. BlockingQueue阻塞队列
答:会造成资源耗尽的风险,(这里问我系统的是没有定义线程数量吗?)然后我解释了一下newCachedThreadPool是创建可伸缩的newFixedThreadPool是创建固定的线程数量,newSingleThreadExecutor是创建单个的,但是由于newCachedThreadPool最大线程数量这个参数可以为Integer.max-value,所有会无限扩展到内存耗光。
数据库连接池
这涉及到数据库瓶颈问题的解决,所以要结合项目,对数据进行垂直和水平拆分。水平分库:(可以手动画个草图来阐述)当用户通过userId来请求数据,通过对userId的分析得出该去哪个数据库进行操作(比如:A数据库是偶数userId,B数据库是奇数userId。不仅仅是通过userId也有按照其他分库的方式,每个库的结构一样,但数据不一样)。水平分表:做法和分库是一样的。垂直分库:依照业务的不同,拆分成多个数据库(用户数据库和产品数据库……各管各的),垂直分表就是依照uid为核心,将字段分割(比如表一存放个人身份信息姓名年龄……,表二存放个人社交信息联系方式地址……)
-常见的InnoDB采用的是B+树底层数据结构,适用于经常更新的表,支持事务,可以通过bin-log日志进行恢复丢失的数据……;
MylASM没有提供对数据库事务的支持,也不支持行级锁和外键,所以执行写操作的时候需要锁定整个表导致效率低下,适合读取操作的速度快
InnoDB:事务型数据库首选,支持事务ACID,支持行锁定和外键,用在需要高性能的大型数据库站点上。
MyISAM:不支持事务,较高的插入查询速度,在Web,数据仓储上最常用。
如何走索引,而避免全表扫描?
正确应该是:在使用不等于(!=或者<>)的时候无法使用索引导致全表扫描 is not null也无法使用索引,但是is null是可以使用索引的.
布隆过滤器怎么实现的
说说Mysql的sql优化
26.你有哪些sql调优经验?
mysql储存引擎有哪些?
分布式集群实现的原理。
explain执行计划看过没有?其中type字段都有哪些值?分别代表什么?
讲一讲数据库的慢查询?
平时建mysql表的时候会考虑一些什么?
写sql语句的时候where会考虑什么?
数据库的大表查询优化了解吗?
MVCC机制了解不?MVCC机制有什么问题?怎么去解决这个问题?
为什么数据量大的时候会出现慢sql? 慢sql如何解决。
mysql慢语句调优做过吗?说说你是怎么做的
如何定位一个慢查询,一个服务有多条SQL你怎么快速定位?
Mysql 事务隔离级别、锁、索引的数据结构、
聚簇索引和非聚簇索引、最左匹配原则、查询优化(explain等命令) 常见问题 Mysql(innondb 下同)
数据库的索引了解吗?说一下索引的原理?
mysql索引是怎么实现的?b+树有哪些特点?真实的数据存在哪里? 哪些情况下建索引?
B树和B+树的区别?
mysql索引为什么用的是b+ tree而不是b tree、红黑树
9.b树和b+树的叶子节点和非叶子节点都存什么
b+高度一般多少,什么量级。b+树的高度怎么计算
聚集索引和非聚集索引了解吗?什么情况用聚集索引什么情况用非聚集索引?各自有什么优缺点。
b+树索引是否支持范围查询,联合索引的失效情况
红黑树索引
加索引的原则
解释下最左匹配原则? 现在一个表有三列a b c,组合索引(a,b,c)查询的时候where a like ? and b=? and c=?能用到这个组合索引吗?为什么
为什么用联合索引;bc会走abc联合索引吗;
怎么看mysql有没有执行索引
数据库的索引有哪几种?为什么要用B+树来做索引?组合索引和几个单个的索引有什么区别?
了解mysql的回表吗?
如果没有主键的话会怎么样;
myisam和innodb哪个会保存表的总记录数,为什么;
为什么InnoDB用的多?
数据库方面有mysql的innodb引擎锁的底层实现、以及回表、怎么避免索引覆盖
为什么MyISAM查询性能好?
如果由大量的增删操作,那么应该选择哪个存储引擎,为什么?
为什么myisam不支持事务 ,innodb是如何支持的事务 ,为什么myisam不采用和innodb相同的方案来解决事务问题 ,
分库分表如何做到不同库表间数据不重复。
MySQL作为相对于雪花算法全局唯一性id的缺点除了性能问题,还有什么?
弹性库自动扩容原理
Nosql引擎用的什么存储结构,关系型数据库和NoSQL各自的优劣点是什么,如何技术选型?
mysql主从复制主要有几种模式?
两个数据库表复制数据库有什么方式?
mysql同步机制原理,有哪几种同步方法?
数据库主从同步如何实现,事务如何实现?
mysql主从节点怎么保证数据的一致性;
分库分表应该怎么分?怎么解决数据迁移的问题?
分库分表如何选择分表键 分库分表的情况下,查询时一般是如何做排序的?
mysql行锁最大并发数?(秒杀项目指出)
mysql最多能存多少数据
Mysql的log有哪些,分别用来解决什么问题
如何保证缓存和数据库双写的一致性
MySQL的查询机制
频繁的增删数据量某个表,数据库最终数据只有几万或者更少,为什么查询会变慢?
数据如果出现了阻塞,你是怎么排查的
Mysql数据库默认的隔离机制。
事务是什么,什么特征,事务如何实现原子性和一致性的
事务的四大特性、并发一致性导致的问题、四种隔离级别解决的问题以及如何实现的(加了什么锁);
Mysql默认的事务隔离级别是什么,有什么缺点
数据库事务的隔离级别有哪些?Mysql默认的隔离级别?不同的隔离级别是通过什么实现的?
不同事务隔离级别分别会加哪些锁?
什么是幻读 ,怎么解决幻读
AUTO_INCREMENT原理(考察并发情况)
自增锁、共享锁、排他锁、意向锁、插入意向锁、记录锁、间隙锁是什么;
怎么定位死锁;
数据库锁知道吗,有几种,加锁和解锁的场景,给一句SQL和隔离级别,能分析加什么锁吗?
数据库的悲观和乐观锁都说一下吧,什么时候用乐观锁比较合适?什么时候用悲观锁呢?
mysql的行锁、表锁、间隙锁、意向锁分别是做什么的?
spring系列的一个整合框架(tomcat和配置文件),简述下helloworld原理即可,依赖maven的配置+注解以及启动类的web应用。
主要是代替以前SpringMVC繁琐的XML配置(视频解析器,组件扫描器,调度器),spring-boot-autoconfigure依赖通过@EnableAutoConfiguration 核心注解初始化并扫描Classpath目录中自动配置类对应的依赖
Spring是一个提供IOC和AOP的容器框架。所谓IOC就是通过框架创造对象,所谓AOP就是在不改变原来业务代码的情况下,通过增加功能类即可以实现对原来代码的方法功能升级,也就是编程的开闭原则思想。
直译过来就是面向切面编程,防止在纵向的业务逻辑执行中重复代码,而且不利于代码的扩展升级。比如一些:安全、日志、权限等集中式管理……主要以静态***和动态***的模式来实现
将原先有手动创建对象的方式交给容器管理,通过构造器注入、setter方法注入,注解注入
-画图阐述:用户发送请求-->前端控制器(根据URL选择哪一个页面控制器进行处理并把请求委托给它)-->页面控制器(接收请求进行功能处理,收集并绑定一个对象作为命令对象然后委托给业务对象进行处理)-->调用业务对象返回模型/逻辑数据-->页面控制器-->ModelAndView-->前端控制器-->根据返回的逻辑视图名进行渲染-->返回控制器响应给客户
属于持久层的框架。通过配置文件XML或注解,将接口和POJO映射成数据库中的记录……相关的依赖包,数据库表,配置文件(数据库驱动信息,核心配置文件),实体对象,最重要的Mapper接口对实体的增删改查操作和Mapper映射文件xml(也需要注册到核心配置文件中),通过SqlSessionFactory创建SqlSession对象进行操作……
${}就是数据源中通过对数据源驱动配置引入到框架核心配置文件中的变量值,#{}mapper.xml的预编译SQL文件
也就是映射文件的namespace值对应Mapper接口包名接口名,接口中的方法名为映射文件中的id值,接口中的方法参数为传递给映射文件的sql参数。Mapper接口没有实现类,调用时采用接口全限名+方法名组成的字符串作为key,即可定位对应的标签(<select>,<insert>……)。Mapper接口原理是JDK动态daili(这两个字被平台加入到了违禁词系统了
`-分页就是将数据库表的记录分页显示,比如1000条记录,分成100页来显示(从0页、0行开始),第0页显示第0-99条数据,以此类推……。逻辑分页,显示每页数据时首先查询1000条数据,然后根据当前页码选出其中的100条来显示。物理分页,先判断该选出的这1000条的第几条到第几条,然后数据库根据给定的请求查询出需要的100条数据返回给前端。
-属于对上个问题的延续,逻辑分页采用的是RowBounds对象进行分页,针对ResultSet结果集执行的内存分页。物理分页可以直接用带有物理分页的参数,也可以使用分页插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据方言添加对应的物理分页语句和参数。
采用resultMap标签,定义数据库列名和对象属性名之间的映射关系
`对于一对一、一对多的查询中通过在Mybatis配置文件中启动lazyLoadingEnabled的布尔值。其原理是使用CGLIB创建目标对象的daili对象……
一级缓存是默认的,作用域为Session,当Session flush或close之后,Session中的所有缓存被清空。二级缓存需要手动配置开启的,存储作用域为namespace,即整个mapper接口……
框架默认是开启一级缓存的,其存储作用域为session,当session的flush和close之后,所有缓存会被清空。二级缓存作用域为Mapper命名空间,可以自定义存储源Eh***默认不打开二级缓存,要开启二级缓存需要手动配置。缓存数据更新机制,当执行了更新数据操作,默认该作用域下所有的select中的缓存将被clear
所谓流程原理,个人认为是对mybatis环境搭建后的具体应用。读取可信配置文件并返回流对象。根据流对象解析创建工厂对象。通过工厂对象创建session,通过session结合映射文件做出一系列的操作……
2)close_wait 服务端还有消息没法送完时候
3) time_wait 客户端 最后的ACK发送完等待2MSL时间,如果丢失重发时间2MSL,上一次链接的消息完全消失
4) 出现大量time_wait: 在 高并发短连接 的TCP服务器上,当服务器处理完请求后立刻主动正常关闭连接。这个场景下会出现大量socket处于TIME_WAIT状态。如果客户端的并发量持续很高,此时部分客户端就会显示连接不上。
具体一点,短连接表示“业务处理+传输数据的时间 远远小于 TIMEWAIT超时的时间”的连接。比如取一个web页面,1秒钟的http短连接处理完业务,在关闭连接之后,这个业务用过的端口会停留在TIMEWAIT状态几分钟,而这几分钟,其他HTTP请求来临的时候是无法占用此端口的。这样大量端口占用造成严重的资源浪费
2、进程通信的方式?每种方式的应用场景?进程如何保证并发的?讲一下信号量?什么是临界区?
3、操作系统怎么进行内存管理?每种方式有什么优缺点?
4、页式存储和段式存储分别应用在什么场景下?
跳表的查询过程是怎么样的,查询和插入的时间复杂度?
`基于内存运行,支持分布式扩展,key-value存储系统,默认支持0-15命名的16个数据库。项目中应用的场景:热点数据的高频读,低频写;发布订阅排行榜,计数器等。五种类型:String Hash List Set Zset 并分别对这几种类型提供了相关的命令来操作数据的增删改查……
`对一组命令集合进行执行,中途不允许打断,否则所有的命令都不执行。从客户端发送一个MULTI发送给Redis来标明线面发送的命令属于事务,每发送一条命令Redis响应一个QUEUED表示命令进入等待执行的事务队列中了。直到用户输入EXEC结束事务的输入并请求Redis执行输入的所有命令。
`-RDB方式:用户自定义一定的条件,然后Redis将自动将缓存进行快照并存储到硬盘上,条件就是在指定时间改动了指定数量的键数,默认会将快照文件存到dump.rdb文件中。
AOF方式:记录服务器执行的所有写操作,需要手动开启参数设置……
`避免单点宕机造成服务数据丢失,所以需要主(写)从(读)复制的措施,一个主数据库可以拥有多个从数据库……
`哨兵模式监控主从架构的工作是否正常进行,通过通知转移故障主节点而重新配置一个新的主节点的特点……
1)异步主从复制,没复制完master宕机
2)脑裂,master脱离连接范围,哨兵选举新的mastere,client没来得及切换继续发送到旧master,数据丢失
秒杀系统的需求就是在同一时间大量的请求对指定商品进行购买交易,但系统一定要扛得住这些大量并发请求。所谓实现就是项目设计的高性能数据库的读写拆分、热点优化……,一致性就是高并发对数据库商品库存字段的扣除要一致……,高可用某台服务器宕机对客户来说是透明的……
思考一
网站首页应该怎么设计
刚刚从业务上说了,那么从技术和后台设计呢
思考二
购物车上,从后台方面考虑有哪些可以设计的
思考三
前期用户量较少,后期多了,推送广告性能变慢,从后台角度怎么优化提升性能
1、100亿黑名单URL,每个64B,判断一个URL是否在黑名单中
2、2GB内存在20亿整数中找到出现次数最多的数
3、40亿个非负整数中找到没有出现的数
4、40亿个非负整数中找到一个没有出现的数,内存限制10MB
5、找到100亿个URL中重复的URL
6、海量搜索词汇,找到最热TOP100词汇的方法
7、40亿个无符号整数,1GB内存,找到所有出现两次的数
8、10MB内存,找到40亿整数的中位数
9、设计短域名系统,将长URL转化成短的URL.(知乎老哥给出了答案,博客有人根据他的总结了一下,很好)
10、让你系统的设计一个高并发的架构,你会从哪几个方面考虑?
11、一个千万级的APP,你要搞定关注和粉丝列表,你用什么来做。要求最后一个关注的在最前面。新增和取关都要比较快的反馈你怎么做?如果一个人关注了之后,服务器宕机了怎么办?
12、OOD design:计费停车场
13、假设有这么一个场景,有一条新闻,新闻的评论量可能很大,如何设计评论的读和写
14、显示网站的用户在线数的解决思路
1、如何解决超卖?mysql锁+redis预减库存+redis缓存卖完标记
2、如何解决重复下单?mysql唯一索引+分布式锁
3、如何防刷?IP限流+验证码
4、热key问题如何解决?redis集群+本地缓存+限流+key加随机值分布在多个实例中
5、消息队列的作用?如何保证消息的不丢失?异步削峰;发送方开启confirm+消息队列持久化+消费方关闭自动ACK,确保消费成功之后自动调用API进行确认。
6、缓存和数据库数据一致性如何保证?秒杀项目不用保证,其他项目就用延时双删或者先更新数据再是缓存失效,为防缓存失效这一信息丢失,可用消息队***保。
7、压测没有?用什么压测?什么情况?
8、系统瓶颈在哪?如何查找,如何再优化?
几千万的数据如何读取处理处理?
答:这个场景题我也没答好,我一直想是让想出一条效率很好的sql语句,然后面试管最后说用limit分页,然后又问我limit可以吗?
这里面试官可能想问我优化分页查询。知识点是关于分页优化索引的吧,不过这里我不太清楚,答的不好。
然后我说没这样实际操作过,但是用explain分析过执行计划。
堆排,快排,归并这些可能会好点,具体看业务
讲了下自己的理解,有些业务可能选插入冒泡这种稳点的排序会更好,比如需要多次排序
public class Main {
//dp + 递归
static int solution(int X, int N){
int result = recur(X, X + 1, N);
return result * 2;
}
static int recur(int X, int Y, int N) else {
return 0;
}
}
//处理循环
int pre = Y - 1;
if (pre < 0) {
pre = 9;
}
int next = Y + 1;
if (next > 9) {
next = 0;
}
return recur(X, pre, N-1) + recur(X, next, N-1);
}
public static void main(String[] args) {
System.out.println(solution(0, 3));
}
}