2021面试总结

jre是java的运行环境,面向java程序使用者.jdk是开发工具包,提供java的开发环境.

Object九大方法摘要:
protected Object clone() 创建并返回此对象的一个副本。 
boolean equals(Object obj) 指示某个其他对象是否与此对象“相等”。 
protected void finalize() 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。 
Class<? extendsObject> getClass() 返回一个对象的运行时类。 
int hashCode() 返回该对象的哈希码值。 
void notify() 唤醒在此对象监视器上等待的单个线程。 
void notifyAll() 唤醒在此对象监视器上等待的所有线程。 
String toString() 返回该对象的字符串表示。 
void wait() 导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。 
void wait(long timeout) 导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量。 
void wait(long timeout, int nanos) 导致当前的线程等待,直到其他线程调用此对象的 notify()

对象生命周期:创建阶段,应用阶段,不可见阶段,不可达阶段,收集阶段,终结阶段,对象空间重分配阶段

常用设计模式:单例模式(数据库连接),工厂模式(spring核心),代理模式(spring里面AOP实现),策略模式(hibernate主键生成),模版模式(Io流读写)
Java事务是为了解决数据安全操作与访问,类型有JDBC事务,JTA事务,容器事务.事务必须服从ACID原则(原子性,一致性,隔离性,持久性)

类装载的执行过程
1、加载:根据查找路径找到相应的class文件然后导入
2、检查:检查加载的class文件的正确性
3、准备:给类中的静态变量分配内存空间
4、解析:虚拟机将常量池中的符号引用替换成直接引用的过程。符号引用就理解为一个标示,而直接引用直接指向内存中的地址。
5、初始化:对静态变量合景泰代码块执行初始化工作。

反射机制使用的场景
1、JDBC中,利用反射机制动态加载了数据库驱动程序
2、web服务器利用反射调用了sevlet的服务方法
3、Eclispe等开发工具利用反射动态剖析对象的类型和结构,动态提示对象的属性和方法。
4、很多框架都用到反射机制,注入属性,调用方法,例如:spring

List保持元素特定顺序,可重复,通过索引下标遍历,ArrayList允许动态改变数组长度,适合查询,用for循环遍历,LinkedList链表型数据结构,适合添加和删除,利用节点指针信息进行数据移动
set继承自collection接口不能有重复元素,重复添加会覆盖,判断对象只能用equals
map键值对存储 ,hashtable线程同步,线程安全,多个线程可以共享一个,所有键必须非空,单线程情况下速度hashtable比hashmap慢,hashmap线程不同步允许键为空
HashMap不是线程安全的,而ConcurrentHashMap是线程安全的;ConcurrentHashMap让锁的粒度更精细一些,并发性能更好。
hash碰撞原理:两个对象的hashcode值一样解决方案:开放地址法(线性探测再散列,二次探测再散列,随机探测再散列),再哈希法,链地址法(拉链法),建立公共溢出区

单线程相当于一个厕所,用于UI页面刷新,网络请求,本地存储,多线程代表多个厕所,多线程实现如下:
1:继承Thread类重写run方法,用start启动线程,无返回值
2:实现runnable接口,重写run方法,无返回值
3:创建callable接口,并实现clall方法,有返回值
4:线程池ExecutorService创建,线程池管理ThreadPoolExecutor核心池大小corePoolSize,线程池最大线程数maxmumPoolSize,线程持续时间keepAliveTime
5:线程同步
   synchronized修饰,一般用来修饰代码块关键代码比同步整个方法更好 
   volatile修饰变量,原理:每次重新计算,而不使用寄存器中的值,不能用来修饰常量
wait属于object类中的,调用wait方法时,线程会放弃对象锁,再调用notify方法才被唤醒,但无法唤醒指定线程,可调用notityAll唤醒全部处于等待状态的线程
sleep属于Thread类,调用sleep方法时,线程不会释放对象锁,容易造成线程堵塞
线程状态:新建状态,就绪状态(调用start方法后),运行状态,阻塞状态,死亡状态(run方法正常退出)
ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的变量值完成操作的场景。
CountDownLatch用来实现阻塞线程,底层继承了AbstractQueuedSynchronizer
线程池拒绝策略:
1.abortpolicy :默认的拒绝策略,会抛出异常
2.discordpolicy :会默认丢弃任务,不会抛出异常
3.discordoldestpolicy :丢弃队列最前面的任务,然后重新提交被拒绝的任务。
4.callerrunspolicy :由调用线程处理该任务

悲观锁:共享资源每次只给一个线程使用,用完后才把资源让给其他线程,造成线程阻塞比如:行锁,表锁,读锁,写锁,操作之前会先上锁,synchronized和reentrantLock就是悲观锁思想的实现
乐观锁:每次拿数据时不会加锁,提交更新时,使用版本号机制或CAS算法判断在此之间是否有人更新数据,Lock是乐观锁的实现
公平锁:synchronized属于非公平锁,reentrantLock通过构造参数决定是非公平锁,reentrantLock构建时时传入一个true即公平锁

缓存分客户端缓存,网络中缓存,服务端缓存(session,redis,cache,数据库缓存)
redis有3种部署方式:单机模式,master-slave + sentinel选举模式,redis cluster模式
redis基于内存的数据库,定期往硬盘推送,多用于会话缓存,全页缓存,排行榜/计数器,发布/订阅,优势速度快,支持多种数据类型,支持事务
redis因为是单进程单线程,需要自己控制读写同步,比如synchronized事物同步,setnx锁
redis持久化分为磁盘快照,aof快照模式,虚拟内存
redis数据类型:String字符串,Hash哈希,List列表,Set集合,Zset有序集合
redis过期策略:定期删除(设置过期时间,每隔100ms随机抽取,若过期就删除)+惰性删除(读取某个key时,先检查该key是否过期,如果过期,就会在此时删除,不会返回任何东西)
redis内存淘汰机制:
(1)volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。
(2)volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰。
(3)volatile-random:从已设置过期时间的数据集中任意选择数据淘汰。
(4)volatile-lfu:从已设置过期时间的数据集挑选使用频率最低的数据淘汰。
(5)allkeys-lru:从数据集中挑选最近最少使用的数据淘汰
(6)allkeys-lfu:从数据集中挑选使用频率最低的数据淘汰。
(7)allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
(8) no-enviction(驱逐):禁止驱逐数据,这也是默认策略。意思是当内存不足以容纳新入数据时,新写入操作就会报错,请求可以继续进行,线上任务也不能持续进行,采用no-enviction策略可以保证数据不被丢失。

Redis的集群模式分为三种(https://mp.weixin.qq.com/s/auiHtkSyYpJbMGShBsH86g)
1、主从复制:一个 master 可以有多个 slave 节点;slave 节点可以有 slave 节点,从节点是级联结构。普通的主从模式,当主数据库崩溃时,需要手动切换从数据库成为主数据库
2、哨兵模式:哨兵模式核心还是主从复制,主节点宕机的情况下,多了一个竞选机制,从所有的从节点竞选出新的主节点。竞选机制的实现,是依赖于在系统中启动一个 sentinel 进程。
   sentinel不仅会监控主数据库和从数据库,之间也会相互监控。每一个都是一个独立的进程,作为进程,它会独立运行
   哨兵模式虽然已经可以实现高可用,读写分离 ,但是存在几个方面的不足:
   哨兵模式下每台 Redis 服务器都存储相同的数据,很浪费内存空间;数据量太大,主从同步时严重影响了 master 性能。
哨兵模式是中心化的集群实现方案,每个从机和主机的耦合度很高,master 宕机到 slave 选举 master 恢复期间服务不可用。
哨兵模式始终只有一个 Redis 主机来接收和处理写请求,写操作还是受单机瓶颈影响,没有实现真正的分布式架构。
3、Jedis sharding集群(ShardedJedis(客户端分片)是把分片的逻辑放在Redis客户端实现,通过Redis客户端预先定义好的路由规则(使用一致性哈希),把对 Key 的访问转发到不同的 Redis 实例中,查询数据时把返回结果汇集)
4、中间件代理:通过中间件的形式,Redis 客户端把请求发送到 Twemproxy,Twemproxy 根据路由规则发送到正确的 Redis 实例,最后 Twemproxy 把结果汇集返回给客户端。
  通过引入一个代理层,将多个 Redis 实例进行统一管理,使 Redis 客户端只需要在 Twemproxy 上进行操作,而不需要关心后面有多少个 Redis 实例,从而实现了 Redis 集群。
5、Cluster集群模式
   Redis Cluster 是一种服务器 Sharding 技术(分片和路由都是在服务端实现),「采用多主多从,每一个分区都是由一个 Redis 主机和多个从机组成,片区和片区之间是相互平行的」。
   Redis Cluster 采用虚拟哈希槽分区而非一致性 hash 算法,预先分配一些卡槽,所有的键根据哈希函数映射到这些槽内,每一个分区内的 master 节点负责维护一部分槽以及槽所映射的键值数据。
   Redis Cluster 集群采用了 P2P 的模式,完全去中心化。

缓存命中:客户端请求的数据存在于缓存中
缓存击穿:热点缓存数据失效瞬间,大并发访问穿破缓存,直接请求数据库,解决方案:设置永不过期
缓存穿透:即不存在于缓存中,也不存在于数据库,造成每次都需要查询数据库,解决方案:布隆过滤,缓存空对象
缓存替代策略:不存在于缓存中,即将写入缓存,但缓存容量已满,需剔除一条旧数据,由替代策略(LRU,LFU)决定
缓存雪崩:缓存大量失效,所有查询都操作数据库,解决方案:mutex加锁排队,缓存reload机制预热,双缓存策略
服务降级:服务器压力剧增,根据策略释放服务器资源保证核心任务正常运行,方案:拒接服务,延迟服务,随机服务
服务限流:服务降级的一种,限流算法:计数器,漏桶,令牌桶,Nginx限流利用连接限流和请求限流

JVM对象内存存储布局划分的三部分:
对象头:存放三类信息。
对象体:存放对象真正存储的有效信息,例如:在代码中定义的各种类型内容字段等。
对齐字节:无特殊含义,只是因为虚拟机要求任何对象的大小必须是8字节的整数倍。

JVM优化方案:改变运行时堆的大小,调整三大区(新生代,老年代,永久待)的大小,内存调试工具jmap,jstack,jconsole
JVM垃圾回收算法
清除算法:先标记后清除,无法释放出较大内存空间
复制算法:划分内存,复制存活对象,回收剩余垃圾对象,适用于存活对象不多的新生代对象块中
整理算法:先标记后整理并清除,适用于存活对象较多的老年代对象块中

mybatis中#会把参数当作字符串传入,可以防止SQL注入,而$容易导致SQL注入攻击
oracle是利用rowNum分页,rowId和rowNum都是虚列,rowId用于定位数据所在物理地址,具有唯一性,而rowNum用于SQL输出结果排序
sql优化:
1)通过内部函数代替复杂SQL提高SQL效率.
2)SQL语句中连接多个表时, 使用表的别名并把别名前缀于每个字段上,减少解析的时间 
3)用EXISTS替代IN、用NOT EXISTS替代NOT IN
4)用Where子句替换HAVING子句
5)SELECT子句中避免使用‘ * ‘
6)正确使用索引提高效率
7)SQL中关键字使用大写
8)使用“临时表”暂存中间结果
sql优化:索引,主键,避免全表扫描,避免使用多表查询,游标,临时表,避免大事务操作
sql执行计划:响应时间,影响行数,是否使用索引

Spring模块:
Spring Core:核心类库,提供IOC服务;
Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等);
Spring AOP:AOP服务;
Spring DAO:对JDBC的抽象,简化了数据访问异常的处理;
Spring ORM:对现有的ORM框架的支持;
Spring Web:提供了基本的面向Web的综合特性,例如多方文件上传;
Spring MVC:提供面向Web应用的Model-View-Controller实现。

springboot启动流程
SpringBoot启动程序,先创建了一个springApplication实例并执行run方法。
实例化ApringApplication的构造方法,其中做了几件事情
1)推断webApplicationType,主要思想就是在当前的classpath下搜索特定的类
2)搜索META-INF\spring.factories文件配置的ApplicationContextInitializer的实现类
3)搜索META-INF\spring.factories文件配置的ApplicationListener的实现类
4)推断MainApplication的class

SpringBoot和SpringCloud区别
SpringBoot:专注于快速方便的开发单个个体微服务(关注微观);
SpringCloud:关注全局的微服务协调治理框架,将SpringBoot开发的一个个单体微服务组合并管理起来(关注宏观);
SpringBoot可以离开SpringCloud独立使用,但是SpringCloud不可以离开SpringBoot,属于依赖关系。

Spring工作原理IOC和AOP
IOC:利用反射机制动态注入创建或管理Bean,降低类与类之间的依赖关系,反射比直接调用处理速度慢
AOP:面向切面,可针对对象做监督和控制,比如调用类对象具体方法前后去调用指定的模块
Spring框架中用到的设计模式:
1.工厂设计模式:Spring使用工厂模式通过BeanFactory和ApplicationContext创建bean对象。
2.代理设计模式:Spring AOP功能的实现。
3.单例设计模式:Spring中的bean默认都是单例的。
4.模板方法模式:Spring中的jdbcTemplate、hibernateTemplate等以Template结尾的对数据库操作的类,它们就使用到了模板模式。
5.包装器设计模式:我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
6.观察者模式:Spring事件驱动模型就是观察者模式很经典的一个应用。
7.适配器模式:Spring AOP的增强或通知(Advice)使用到了适配器模式、Spring MVC中也是用到了适配器模式适配Controller。

Spring注入方式:setter,interface,constructor

SOA:面向服务架构,为B/S模型的自然延伸
微服务:根据业务进行拆分分割,实现独立设计,开发,运行,运维,然后相互之间调用

垂直拆分分库
水平拆分分表(按照表列属性,表列属性不一样)
垂直拆分分表(按照规则,表列属性一样)

1)RMI与JNDI集成服务实例
Java RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。
优点:RMI易于编写和使用,可将完整的对象作为参数和返回值传递,使用Java内置的安全机制保证下载执行程序时用户系统的安全。
缺点:RMI与语言相绑定,对服务器的IP地址和端口依赖很紧密。
2)Web service
Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。
优点:Web Service技术, 夸平台,夸语言,应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。
缺点:是单机应用程序,需要xml封装,传送时必须多一些额外数据,另外安全性较低。
3)Socket
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
socket工作在传输层,不用自己实现,是进程间通信的端点,传输速度快,比较稳定。

TCP和UDP的区别
1) TCP提供面向连接的传输,通信前要先建立连接(三次握手机制); UDP提供无连接的传输,通信前不需要建立连接。
2) TCP提供可靠的传输(有序,无差错,不丢失,不重复); UDP提供不可靠的传输。
3) TCP面向字节流的传输,因此它能将信息分割成组,并在接收端将其重组; UDP是面向数据报的传输,没有分组开销。
4) TCP提供拥塞控制和流量控制机制; UDP不提供拥塞控制和流量控制机制。

HTTPS和HTTP的区别
https协议需要到CA申请证书,一般免费证书较少,因而需要一定费用。
http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl/tls加密传输协议。
http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
http的连接很简单,是无状态的;HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。


分布式系统
1)分布式软件系统是支持分布式处理的软件系统,是在由通信网络互联的多处理机体系结构上执行任务的系统。一个分布式程序由若干个可以独立执行的程序模块组成,它们分布于一个分布式处理系统的多台计算机上被同时执行。
2)对于所有的分布式系统,事务一致性问题是极其重要的问题,因为它直接影响到系统的可用性。可以通过引入消息中间件(比如MQ)来解决此问题,传统的方式是,处理方处理业务完成之后,发送消息通知处理完成,
引入消息中间件后,处理方在接收到业务请求后,主动通过消息中间件发送一条准备处理业务的消息,处理完成后再发送一条确认消息,这样就可以保证事务的一致性。

分布式锁
数据库:创建数据库唯一索引,实现创建锁过程和释放锁过程,弊端,数据库性能消耗大,不便于扩展
redis,实现方便,如果处理时间过长容易导致锁超时,比如分布式锁实现,即Redisson
zooKeeper,性能略低于redis,但可以解决失效死锁问题

redis和zk的实现方案中各自的优缺点。
对于redis的分布式锁而言,它有以下缺点:
它获取锁的方式简单粗暴,获取不到锁直接不断尝试获取锁,比较消耗性能。
另外来说的话,redis的设计定位决定了它的数据并不是强一致性的,在某些极端情况下,可能会出现问题。锁的模型不够健壮
即便使用redlock算法来实现,在某些复杂场景下,也无法保证其实现100%没有问题,关于redlock的讨论可以看How to do distributed locking
redis分布式锁,其实需要自己不断去尝试获取锁,比较消耗性能。
但是另一方面使用redis实现分布式锁在很多企业中非常常见,而且大部分情况下都不会遇到所谓的“极端复杂场景”
所以使用redis作为分布式锁也不失为一种好的方案,最重要的一点是redis的性能很高,可以支撑高并发的获取、释放锁操作。
redis分布式锁过期时间到了,但业务还没执行完,怎么办?
redisson给的答案是锁获取成功后,注册一个定时任务,每隔一定时间(this.internalLockLeaseTime / 3L)就去续约
对于zookeeper分布式锁而言:
zookeeper天生设计定位就是分布式协调,强一致性。锁的模型健壮、简单易用、适合做分布式锁。
如果获取不到锁,只需要添加一个监听器就可以了,不用一直轮询,性能消耗较小。
但是zk也有其缺点:如果有较多的客户端频繁的申请加锁、释放锁,对于zk集群的压力会比较大。
如何解决zk缺点
首先尝试从缓存读取,读到数据则直接返回;如果读不到,就读数据库,并将数据会写到缓存,并返回。
需要更新数据时,先更新数据库,然后把缓存里对应的数据失效掉(删掉)。
缓存失效期越短,数据一致性越高。但失效期越短,查数据库就会越频繁。

自己设计一个MQ应该考虑的因素。
考虑点
1、远程通信功能
(1)逻辑通信协议:STOMP, AMQP, MQTT, Openwire, SSL, and WebSockets
(2)物理通信协议:TCP、HTTP?
2、目标功能
(1)支持哪几种消息发送模式(P2P、Pub/Sub)
(2)消息接收模型(推、拉)
(3)消息投递策略(at-most-once、at-least-once、exactly-once)
(4)消息事务支持?
(5)消息顺序性?
(6)JMS API支持?(这个不是很关键)
(7)管理API:JMX还是REST?
3、分布式方面考量
(1)高可用(High Availability):Master/Slave?Failover?失败重连?
(2)高吞吐(High Throughout):消息吞吐量、扩容(横向纵向扩展、负载均衡)?
(3)高一致(High Persistence):消息持久化、不重发?

消息中间件:关注于数据的发送和接收,利用高效可靠的异步消息传递机制集成分布式系统,优点:解耦 异步 横向扩展 安全可靠 顺序保证
消息队列的作用:解耦、异步、削峰
消息队列的缺点:系统可用性降低 系统复杂性增加
消息队列选型:中小型(RabbitMQ) 大型(rocketMq和kafka)
消息队列高可用:
rcoketMQ模式:多master 模式、多master多slave异步复制模式、多 master多slave同步双写模式。
Kafka通过Zookeeper管理集群配置,选举leader,以及在Consumer Group发生变化时进行rebalance。
rabbitMQ有普通集群和镜像集群模式
消息重复消费(MQ幂等消费):
正常情况下,消费者在消费消息时候,消费完毕后,会发送一个确认信息给消息队列,消息队列就知道该消息被消费了,就会将该消息从消息队列中删除。
RabbitMQ是发送一个ACK确认消息,RocketMQ是返回一个CONSUME_SUCCESS成功标志,kafka实际上有个offset的概念。
因为网络传输等等故障,确认信息没有传送到消息队列,导致消息队列不知道自己已经消费过该消息了,再次将该消息分发给其他的消费者。
这个消息做一个唯一主键,那么就算出现重复消费的情况,就会导致主键冲突,避免数据库出现脏数据。
拿到这个消息做redis的set的操作,因为你无论set几次结果都是一样的,set操作本来就算幂等操作。
准备一个第三方介质,来做消费记录。以redis为例,给消息分配一个全局id,只要消费过该消息,将以K-V形式写入redis。那消费者开始消费前,先去redis中查询有没消费记录即可。
可靠性传输:
可靠性传输每种MQ都要从三个角度来分析:生产者弄丢数据、消息队列弄丢数据、消费者弄丢数据
RabbitMQ提供transaction和confirm模式来确保生产者不丢消息。
RabbitMQ通过持久化配置和confirm机制配合防止消息队列丢数据
RabbitMQ采用手动确认消息即可防止消费者丢数据
kafka中通过设置producer端acks=all和retries=MAX防止生产者丢数据
kafka中通过设置replication.factor参数和min.insync.replicas参数防止消息队列丢数据
kafka中通过设置offset的值改成手动提交即可防止消费者丢数据

nginx负载均衡的5种策略及原理
**1、轮询(默认)**
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 
upstream backserver { 
server 192.168.0.14; 
server 192.168.0.15; 

**2、指定权重**
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 
upstream backserver { 
server 192.168.0.14 weight=8; 
server 192.168.0.15 weight=10; 

**3、IP绑定 ip_hash**
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 
upstream backserver { 
ip_hash; 
server 192.168.0.14:88; 
server 192.168.0.15:80; 

**4、fair(第三方)**
按后端服务器的响应时间来分配请求,响应时间短的优先分配。 
upstream backserver { 
server server1; 
server server2; 
fair; 

**5、url_hash(第三方)**
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 
upstream backserver { 
server squid1:3128; 
server squid2:3128; 
hash $request_uri; 
hash_method crc32; 

nginx性能优化
1、Nginx一些参数:运行工作进程数量,Nginx运行CPU亲和力,Nginx最大打开文件数,Nginx事件处理模型,开启高效传输模式,连接超时时间
2、fastcgi 调优
3、gzip 调优
4、expires 缓存调优
5、内核参数优化
6、关于系统连接数的优化
7、编译安装取消debug模式

如何实现秒杀?
秒杀系统单独部署
重设商品页面并静态化,分布式部署在cdn
突增网络及服务器带宽
控制用户下单机制,减少提交服务次数,如创新性验证码
使用乐观锁
先减库存,后做下单操作,避免售出大于库存
读写分离,读使用缓存
Nginx请求分发
使用队列ConcurrentLinkedQueue处理入队需求大于出队需求
加入zookeeper分布式锁
IO与NIO的区别
IO是面向流的,NIO是面向缓冲区的
Java IO的各种流是阻塞的,Java NIO的非阻塞模式

1:byte取值范围?为什么
2:jdk和jre的区别
3:void和Void区别
4:java泛型中有什么,分别代表什么
5:什么叫做逃逸分析
6:java中的类型提升
7:hash冲突
8:对象克隆深拷贝和浅拷贝
9:伪共享
10:oracle jdk和open jdk 区别
11:hashmap扩容
12:什么情况下会出现栈内存溢出
13:内存屏障
14:何为跨域,如何解决
15:什么是无锁,哪里使用了无锁
16:throw和throws区别
17:如何理解强软弱虚引用
18:JVM内存模型和JVM内存结构

如何创建区或使用区
cap  tcc
tomcat负载均衡
数据库集群:数据库安装到多个服务器上,形成一主多从,提高容错性和高性能 
java动态代理
HashMap、Hashtable、ConcurrentHashMap的原理与区别
StringBuffer与StringBuilder的区别
过载保护
消息通知
分布式事物,如何实现接口幂等性

Collections.reverse(mapList);  //反转map


搜索日志
grep "SOP0002" /ebank/log/mobper/mobper_mobwap-sit.log
tail -f /ebank/log/mobper/mobper_mobwap-sit.log  | grep "10.118.0.115"

查看esb
cat /ebank/spdb/config/ebank_common.properties | grep "esb"

Collections.reverse(mapList);  //反转map

1: 创建新的工作空间
2:拉取整个分支
3:把整个分支转为maven项目
4:把整个分支从工作空间中删除
5:导入已经存在的maven项目:import-maven-existing Maven Projects -选择整个分支
6:分别删除每个项目错误的jar依赖
7:设置Maven settings.xml文件依赖然后更新项目 maven-update Projects 
8:设置项目之间互相依赖,比如common依赖hsm和payment,per依赖common和hsm和payment
9:按照依赖顺序分别执行maven install
10:更改server中modules属性栏中的path为/wap/
11:加载到tomcat启动

springBoot  mongodb+mysql  redis  shiro 

redis  bgsave底层实现是什么
jvm内存模型 元数据区多大
hashmap底层实现是什么
为什么mysql用b+树不用b
红黑树 二叉树
为什么内存运算要比IO快
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值