高级程序员(JAVA)必知必会二(问题+答案)
1.业务介绍,场景描述,负责模块2.数据库隔离级别,分别会避免什么样的错误,默认隔离级别。read_uncommited,read_commited,repeatable_read,serializable_read,脏读,可重复读,幻读3.IOC的原理对象实例化的工作从开发者转移到容器。applicationContext常用接口哪些,都有什么作用。MessageSour...
1.业务介绍,场景描述,负责模块
2.数据库隔离级别,分别会避免什么样的错误,默认隔离级别。
read_uncommited,read_commited,repeatable_read,serializable_read,脏读,可重复读,幻读
3.IOC的原理
对象实例化的工作从开发者转移到容器。
applicationContext常用接口哪些,都有什么作用。
- MessageSource———为应用提供国际化访问功能
- ResourceLoader———提供资源(如URL和文件系统)的访问支持
- ApplicationEventPublisher———引入事件机制,包括启动事件、关闭事件等,让容器在上下文中提供了对应用事件的支
-
ApplicationContext的主要实现类有
- ClassPathXmlApplicationContext(从类路径加载IoC配置文件);
- FileSystemXmlApplicationContext(从文件系统加载IoC配置文件)。
4.AOP原理
动态代理。cglib和jdk的原理。
JDK动态代理只能对实现了接口的类生成代理,而不能针对类
CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法(继承)
5.happenBefore偏序规则
https://blog.csdn.net/u010031673/article/details/48153797
6.多线程相关
volatile定义与功能。
wait和notify notifyall实践
https://www.cnblogs.com/moongeek/p/7631447.html
被wait的线程,想要继续运行的话,它必须满足2个条件:
- 由其他线程notify或notifyAll了,并且当前线程被通知到了
- 经过和其他线程进行锁竞争,成功获取到锁了
2个条件,缺一不可。其实在实现层面,notify和notifyAll都达到相同的效果,都只会有一个线程继续运行。但notifyAll免去了,线程运行完了通知其他线程的必要,因为已经通知过了。什么时候用notify,什么时候使用notifyAll,这就得看实际的情况了。
7.爬虫框架原理
8.垃圾回收
垃圾收集器,作用,垃圾回收算法,新生代suvivor和eden占比调节参数
https://blog.csdn.net/lojze_ly/article/details/49456255
1)-XX:NewSize和-XX:MaxNewSize
用于设置年轻代的大小,建议设为整个堆大小的1/3或者1/4,两个值设为一样大。
2)-XX:SurvivorRatio
用于设置Eden和其中一个Survivor的比值,这个值也比较重要。
3)-XX:+PrintTenuringDistribution
这个参数用于显示每次Minor GC时Survivor区中各个年龄段的对象的大小。
4).-XX:InitialTenuringThreshol和-XX:MaxTenuringThreshold
用于设置晋升到老年代的对象年龄的最小值和最大值,每个对象在坚持过一次Minor GC之后,年龄就加1。
G1和CMS的区别
https://blog.csdn.net/qq_25396633/article/details/72972008
9.IO相关
突然中断会怎样。
10.redis
常用应用场景
https://blog.csdn.net/u012743772/article/details/78212719
11.消息队列
https://blog.csdn.net/seven__________7/article/details/70225830
拉模式:
点对点消费,如果没有消费者在监听队列,消息将保留在队列中,直至消费者连接到队列,在这种模型中,消息不是自动推动给消费者的,而是要由消费者从队列中请求活动(拉模式)。 优点: 1.保证每条消息都被接收。 2.消息不会丢失。
推模式
消息会自动广播,消息消费者无需主动请求或轮询主题的方法来获得新消息。 对比: 1.不保证每条消息都会被消费, 2.发布消息时,只有正在监听该topic的能够接收,如果没人监听,则会消息丢失。
https://blog.csdn.net/heyutao007/article/details/50131089
加大点难度:
Dubble通信机制,抛开注册中心,如果调用不到,可能会出现什么问题,如何定位
负载均衡策略
dubbo负载均衡策略:
在集群负载均衡时,Dubbo提供了多种均衡策略,缺省为random随机调用。
RandomLoadBalance
随机,按权重设置随机概率。
在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。
RoundRobin LoadBalance
轮循,按公约后的权重设置轮循比率。
存在慢的提供者累积请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。
LeastActive LoadBalance
最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。
ConsistentHashLoadBalance
一致性Hash,相同参数的请求总是发到同一提供者。
当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
https://www.cnblogs.com/leeSmall/p/7620467.html
锁降级:
锁降级指的是写锁降级成为读锁。锁降级是指把持住当前拥有的写锁的同时,再获取到读锁,随后释放写锁的过程。
https://www.jianshu.com/p/0f4a1995f57d
可重入锁:
https://blog.csdn.net/lzwglory/article/details/80016497
熔断机制
https://blog.csdn.net/world_snow/article/details/79080314
https://blog.csdn.net/isitman/article/details/81184868
数据库相关,b树b+树还有哈希索引有啥区别
http://uule.iteye.com/blog/2429508
Rehash啥原理
https://blog.csdn.net/qq_27093465/article/details/52270519
Ioc都用了哪些设计模式,怎么用的
https://blog.csdn.net/liagnzi1259/article/details/77520181
双亲委派机制碰见重复类怎么办
线程上下文加载器破坏双亲委派机制
https://blog.csdn.net/yangcheng33/article/details/52631940
能不能自己写个类叫java.lang.System?
答案:通常不可以,但可以采取另类方法达到这个需求。
解释:为了不让我们写System类,类加载采用委托机制,这样可以保证爸爸们优先,爸爸们能找到的类,儿子就没有机会加载。而System类是Bootstrap加载器加载的,就算自己重写,也总是使用Java系统提供的System,自己写的System类根本没有机会得到加载。
锁降级,锁升级相关
平常都有用到哪些jdk自带的工具,都用来做什么了
如果出现outOfMemery,可以从哪些地方来定位这个问题
如果出现stackoverFlow,可以从哪些地方来定位问题
其实上面两个问题都可以从原理方面来展开:
java虚拟机中,五个区得知道吧,程序计数器,虚拟机栈,本地方法栈,堆,方法区,除了程序计数器,其他区都可能发生OutOfMemory。比如:
虚拟机栈扩展时无法申请到足够的内存时将会跑出OOM异常。
本地方法栈和虚拟机栈差不多,所以也会出现同样的问题。
堆的话主要是存放对象的,如果GC后,仍然没有足够的内存分配,也不能扩展,将会抛出OutOfMemoryError:Java Heap Space异常,如果不是真的有逻辑问题(莫名创建了大量的对象),那可以尝试下调整下虚拟机的默认内存空间大小,vm arguments框里输入一些简单的参数配置,
各个参数的含义为:
-Xms
,表示程序启动时,JVM 堆的初始化最小尺寸参数;-Xmx
,表示程序启动时,JVM 堆的初始化最大尺寸参数;-XX:PermSize
,表示程序启动时,JVM 方法区的初始化最小尺寸参数;-XX:MaxPermSize
,表示程序启动时,JVM 方法区的初始化最大尺寸参数。
方法区的话,如果它使用的内存超过它允许的大小时,就会抛出OutOfMemory:PermGen Space异常。permGen代表的是permanent generation,永久代的意思。PermGen 空间的使用量, 与JVM加载的 class 数量有很大关系,随着生成的class越来越多,将会占满Permgen空间
https://blog.csdn.net/renfufei/article/details/77994177
栈溢出的相关参考这个
一、局部数组过大。当函数内部的数组过大时,有可能导致堆栈溢出。
二、递归调用层次太多。递归函数在运行时会执行压栈操作,当压栈次数太多时,也会导致堆栈溢出。
三、指针或数组越界。这种情况最常见,例如进行字符串拷贝,或处理用户输入等等。
解决这类问题的办法有两个,
一是增大栈空间,二是改用动态分配,使用堆(heap)而不是栈(stack)。
B树和hash的应用场景是什么样子的
SpringBoot了解
https://www.cnblogs.com/wmyskxz/p/9010832.html
数据库的有什么了解
https://blog.csdn.net/chuangsun/article/details/78013537
MYSQL的RR如何避免幻读出现
https://www.cnblogs.com/fanguangdexiaoyuer/p/10759746.html
PING的原理
https://blog.csdn.net/inject2006/article/details/2139149
JWT原理
https://www.cnblogs.com/cjsblog/p/9277677.html
limit优化方案
http://www.cnblogs.com/beynol/p/mysql-optimization-limit.html
CGlib比JDK的性能对比??
一般情况下还是选择jdk代理,jdk代理比较快。
(1)使用CGLib实现动态代理,CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,比使用Java反射效率要高。唯一需要注意的是,CGLib不能对声明为final的方法进行代理,因为CGLib原理是动态生成被代理类的子类。
(2)在对JDK动态代理与CGlib动态代理的代码实验中看,1W次执行下,JDK7及8的动态代理性能比CGlib要好20%左右。
最新的版本mysql多少,有什么新特性?
社区版已经到8.0.12https://www.jb51.net/article/137123.htm
最新的版本Spring多少,有什么新特性?
Spring5https://www.ibm.com/developerworks/cn/java/j-whats-new-in-spring-framework-5-theedom/index.html
最新的版本jdk多少,有什么新特性?
JDK9https://www.cnblogs.com/yif0118/p/8319837.html
localdate新的日期类https://blog.csdn.net/wyz0516071128/article/details/80834107
date -> LocalDate(例如2018-09-18)
time -> LocalTime(例如12:20:25.000000040)
timestamp -> LocalDateTime(例如2018-09-18T09:35:47.335)
流式处理https://www.cnblogs.com/shenlanzhizun/p/6027042.html
lamda表达式https://www.hhfate.cn/t/536
optional类https://blog.csdn.net/sun_promise/article/details/51362838
接口中的默认方法https://www.cnblogs.com/luozhiyun/p/7999705.html
单点登陆系统如何实现?
https://blog.csdn.net/u011530389/article/details/50680873
spring三级缓存解决循环依赖
https://www.jianshu.com/p/6c359768b1dc
.说一下TreeMap的实现原理?红黑树的性质?红黑树遍历方式有哪些?如果key冲突如何解决?setColor()方法在什么时候用?什么时候会进行旋转和颜色转换?
手写RPC
https://blog.csdn.net/lovoo/article/details/78108938
bean的生命周期
https://www.cnblogs.com/kkdn/p/9685755.html
https://blog.csdn.net/Adrian_Dai/article/details/79444753
Dubbo超时重试;Dubbo超时时间设置
Dubbo超时和重连配置示例
<!-- 服务调用超时设置为6秒,超时不重试-->
<dubbo:service interface="com.provider.service.DemoService" ref="demoService" retries="0" timeout="5000"/>
Dubbo消费者端统一的超时和重连配置
<!--统一的消费者配置-->
<dubbo:consumer timeout="30000" retries="0" version="1.0.0"/>
dubbo在调用服务不成功时,默认会重试2次。
Dubbo的路由机制,会把超时的请求路由到其他机器上,而不是本机尝试,所以 dubbo的重试机器也能一定程度的保证服务的质量。
但是如果不合理的配置重试次数,当失败时会进行重试多次,这样在某个时间点出现性能问题,调用方再连续重复调用,
系统请求变为正常值的retries倍,系统压力会大增,容易引起服务雪崩,需要根据业务情况规划好如何进行异常处理,何时进行重试。
如何保障请求执行顺序
为了简单轻量级的可以考虑使用 Redis. 借助 Redis 的list结构, Producer 调用 Redis 的 lpush 往特定key里添加消息, Consumer 调用 brpop 去不断监听该key.
如果需要实现复杂功能的, 那么可以考虑使用 RabbitMQ 或 ActiveMQ 等之类的专门的消息队列.
http://jm.taobao.org/2017/01/12/rocketmq-quick-start-in-10-minutes/
执行某操作,前50次成功,第51次失败
a全部回滚
父类方法加事务PROPAGATION_REQUIRED
b前50次提交第51次抛异常,ab场景分别如何设置Spring(传播性)
父类方法加事务PROPAGATION_REQUIRED ,子类方法加事务PROPAGATION_REQUIRES_NEW
Zookeeper有哪些用
https://mp.weixin.qq.com/s/J8erMBhiogXoQcn91SJcbw
数据库垂直和水平拆分
案例:
以mysql为例,简单购物系统暂设涉及如下表:
1. 产品表(数据量10w,稳定)
2. 订单表(数据量200w,且有增长趋势)
3. 用户表 (数据量100w,且有增长趋势)
垂直拆分:
解决问题: 表与表之间的io竞争
不解决问题: 单表中数据量增长出现的压力
方案:
- 把产品表和用户表放到一个server上
- 订单表单独放到一个server上
水平拆分:
解决问题: 单表中数据量增长出现的压力
不解决问题: 表与表之间的io争夺
方案:
- 用户表通过性别拆分为男用户表和女用户表;
- 订单表通过已完成和完成中拆分为已完成订单和未完成订单;
- 产品表未完成订单放一个server上;
- 已完成订单表盒男用户表放一个server上;
- 根据新用户和老用户,因为新用户相应的活跃度高;
MyBatis如何分页;如何设置缓存;MySQL分页
https://blog.csdn.net/wangpei555/article/details/52829194
熟悉IO么?与NIO的区别,阻塞与非阻塞的区别
https://blog.csdn.net/hxpjava1/article/details/56282385
https://www.cnblogs.com/orez88/articles/2513460.html
阻塞队列了解多少
https://www.cnblogs.com/tjudzj/p/4454490.html
接口如何处理重复请求?
设计一个对外服务的接口实现类,在1,2,3这三个主机(对应不同IP)上实现负载均衡和顺序轮询机制(考虑并发)
jvm,jre以及jdk三者之间的关系?
总的来说JDK是用于java程序的开发,而jre则是只能运行class而没有编译的功能。
JDK是提供给Java开发人员使用的,其中包含了java的开发工具,也包括了JRE。所以安装了JDK,就不用在单独安装JRE了。 其中的开发工具包括编译工具(javac.exe)打包工具(jar.exe)等
JVM可以理解为是一个虚拟出来的计算机,具备着计算机的基本运算方式,它主要负责将java程序生成的字节码文件解释成具体系统平台上的机器指令。让具体平台如window运行这些Java程序。
三者之间关系
JDK 包含JRE,JRE包含JVM。
我们开发的实际情况是:我们利用JDK(调用JAVA API)开发了属于我们自己的JAVA程序后,通过JDK中的编译程序(javac)将我们的文本java文件编译成JAVA字节码,在JRE上运行这些JAVA字节码,JVM解析这些字节码,映射到CPU指令集或OS的系统调用。
AQS原理?
https://blog.csdn.net/mulinsen77/article/details/84583716
https://www.cnblogs.com/daydaynobug/p/6752837.html
Dubbo负载均衡算法
https://www.cnblogs.com/leeSmall/p/7620467.html
Zookeeper底层原理
https://blog.csdn.net/qiangcuo6087/article/details/79042035
mybatis底层原理
https://blog.csdn.net/w372426096/article/details/82622418
Mybatis动态SQL底层工作原理
https://blog.csdn.net/zhangdongnihao/article/details/80347772
bean的生命周期
https://blog.csdn.net/fuzhongmin05/article/details/73389779
锁优化策略
https://blog.csdn.net/stackflow/article/details/79455880
https://blog.csdn.net/East_MrChiu/article/details/89263476
CAS原理
https://blog.csdn.net/mmoren/article/details/79185862
BIO NIO AIO的区别
https://blog.csdn.net/qq_33665647/article/details/54584988
https://blog.csdn.net/thebigdipperbdx/article/details/79512825
具体了解NIO
https://blog.csdn.net/u011381576/article/details/79876754
ELK
http://1028826685.iteye.com/blog/2306570
序列化与反序列化框架
https://blog.csdn.net/earbao/article/details/46914407
REDIS常见应用场景
https://blog.csdn.net/HD243608836/article/details/80216982
CAP原理,为啥CA不能同时满足
http://www.ruanyifeng.com/blog/2018/07/cap.html
https://blog.csdn.net/qq_39123695/article/details/83037723
分布式锁
https://www.cnblogs.com/seesun2012/p/9214653.html
elasticSearch和solr区别
https://www.cnblogs.com/blueskyli/p/8326229.html
SPI机制(service provider interface)
https://www.cnblogs.com/softlin/p/4321955.html
https://www.jianshu.com/p/9cf306550b0a
https://blog.csdn.net/qq_38182963/article/details/78660779
beanFactory和applicationcontext的区别
https://www.cnblogs.com/zhaoxinshanwei/p/8856318.html
https://blog.csdn.net/rcj183419/article/details/54708505
Redis怎么持久化
https://www.cnblogs.com/tdws/p/5754706.html
Redis为啥是单线程
https://www.cnblogs.com/qwangxiao/p/8535202.html
innodb和myisam的区别
https://www.cnblogs.com/y-rong/p/8110596.html
可重复读避免幻读的原理
https://www.cnblogs.com/fanguangdexiaoyuer/p/10759746.html
多线程面试题
https://blog.csdn.net/ll666634/article/details/78615505
RockeMQ保证顺序消费
https://blog.csdn.net/gwd1154978352/article/details/80691916
手写可重入锁
https://blog.csdn.net/z_565282532/article/details/78943821
分布式事务
https://www.cnblogs.com/jing99/p/11769093.html
分布式事务GTS的介绍
https://blog.csdn.net/m0_37803704/article/details/80549364
线程的五种状态
https://blog.csdn.net/xingjing1226/article/details/81977129
MQ的应用场景
https://blog.csdn.net/wqc19920906/article/details/82193593
用户态和内核态的区别
https://blog.csdn.net/qq_39823627/article/details/78736650
限流算法
https://blog.csdn.net/u012526691/article/details/80333907
索引和慢sql
https://blog.csdn.net/qq_35216516/article/details/80523773
公平锁和非公平锁实现
https://blog.csdn.net/lsgqjh/article/details/63685058
AP和CP的区别
https://www.cnblogs.com/wei57960/p/12260228.html
https://blog.csdn.net/fly910905/article/details/100023415
为啥不推荐使用Executors创建线程池
https://blog.csdn.net/ren365880/article/details/108130577
更多推荐
所有评论(0)