problems inter

  • JAVA基础
      • 什么是java序列换
      • JAVA如何实现跨平台?
      • JAVA反射是什么?
      • 反射使用场景
      • 泛型是什么?
      • 泛型擦除是什么?
      • AOP使用场景
      • 各个数据类型的大小?
      • 什么是面向对象*?
      • 有哪些方法可用运行时动态生成一个类?(未解决)
      • Exception和Error有什么区别*?
      • 强引用、软引用、弱引用、幻象引用有什么区别*?
      • String、StringBuffer、StringBuilder有什么区别*?
      • String为什么是不可变的?
    • 集合类
      • 对比Vector、ArrayList、LinkedList有何区别*?
      • 对比Hashtable、HashMap、TreeMap有什么不同?
      • 怎么确保一个集合不能被修改?
  • Netty
    • Selector有几种模式?
    • 什么是netty?
    • 说一下Netty线程模型?
    • epoll和select的区别是什么?(待处理)
  • Redis
    • Redis为什么很快?
    • Redis事务能不能满足ACID?
    • Redis有哪些变慢的可能?
    • Redis怎么查看内存使用情况?
    • 怎么清理redis内存碎片?
    • 如何解决缓存和数据库的数据不一致问题?@@@
    • 说一说LRU和LFU的区别?
    • 缓存被污染了这么办?
    • Redis的缓存淘汰策略有哪些?
    • 为什么Redis中的有序集合要用跳表来实现?
    • redis的rehash是怎么操作的?
    • 说一下redis的持久化机制?
    • 如何解决Redis缓存雪崩、穿透、击穿问题?
    • Redis支撑秒杀场景的关键技术和实践都有哪些?
    • 说一下Redis的哨兵模式?
    • Redis实现消息队列有哪些方案?(待处理)
    • Redis主从同步有哪些问题?怎么解决?(待处理)
    • MySQL和Redis使用下的数据一致性解决方案,考虑高可用,高性能。
  • 分布式事务
    • 分布式事务产生的背景?
    • 什么是CAP定理?
    • 常见的分布式事务解决方案?
    • Seata分布式事务框架实现原理?
    • 什么是raft算法?
    • 什么是BASE理论?

JAVA基础

什么是java序列换

序列换指的是把对象序列化成二进制的过程,可以保存到磁盘或者网络发送。静态变量不会被序列化和transient瞬态变量不会被序列化

JAVA如何实现跨平台?

java编译器可以把代码编译成和计算机体系结构无关的字节码指令。字节码文件可以通过JVM转换成本地机器码,因此屏蔽了不同操作系统的差异。

JAVA反射是什么?

反射指的是能够动态获取一个类或者对象的方法和属性。并且可以调用这些方法和属性。日常开发中常用的是利用反射创建实例以及方法的调用。反射创建对象的三种方式是对象名.getClass, 类名.class, Class.forName(), 方法的调用可以用Method类的getMethod方法。也可以通过getFeilds和getConstructor来获取属性和构造器

反射使用场景

“部分信息是source阶段不清晰,需要在runtime阶段动态临时加载”这种场景,反射就可以派上用场了

泛型是什么?

泛型是一种解决不确定对象类型的问题。在没有泛型之前,假如我们往Arraylist里面放数据,只能通过放一个obj类型的数据,不能保证数组中数据类型的一致性。取出来的数据也需要强制转换

泛型擦除是什么?

因为虚拟机没有泛型类型对象,所有对象都属于普通类。例如定义 List 或 List,在编译后都会变成 List

AOP使用场景

各个数据类型的大小?

int4 byte1 sort2 long8 double8 float4 char2

boolean :
1字节:计算机处理数据的最小单位是一字节
4字节:根据《Java虚拟机规范》中描述,虽然定义了Boolean数据类型,但是对它的支持有限,所以在编译时候使用int数据类型来代替,所以占4 个字节

什么是面向对象*?

就是利用3个特性,继承,封装,多态。多态其实就是面向对象的表现,比如。。做一个优惠接口,如果不用面向对象的思想去做,就可以用一个方法来完成这个优惠操作,但是随着优惠类型变多,比如新增了满减,新增了打折,又会新增优惠码最后导致这个优惠代码很臃肿,而且违反设计原则,比如开闭,单一职责等等。当如果使用面向对象原则,就可以把这个优惠抽象出来,然后根据不同的优惠策略,来创建他的子类,这样每个优惠方案的类耦合度很低,并且满足开闭原则,单一职责等等。在面向对象编程中,我们应该尽量面向抽象来减少代码的耦合度

有哪些方法可用运行时动态生成一个类?(未解决)

Exception和Error有什么区别*?

都继承了Throwable类,Exception是指程序中可以catch或者抛出的。Error指不大可能出现的情况,一般不能预料,比如内存溢出等。Exception还分检查和不可检查,比如nullPointerException就是不可检查

强引用、软引用、弱引用、幻象引用有什么区别*?

主要是跟GC相关。强引用指得就是普通的对象引用,只要强引用存在就不会被GC。
软引用只会在JVM认为内存不足的时候才会尝试去回收软引用。
弱引用会在第二次垃圾回收的时候回收,比如ThreadLocalMap 里面的entry指向的threadlocal变量就是用的弱引用。
虚引用主要是用于跟进垃圾回收的进度,

String、StringBuffer、StringBuilder有什么区别*?

都可以对字符串进行拼接等操作,但String这个类是immutable的,所以拼接,截取字符串等操作都会产生新的对象。StringBuffer和StringBuilder的区别就是StringBuffer是线程安全的,其余操作没有什么区别。

ps: StringBuffer内部是通过synchronize关键字修饰方法(锁的是调用方法的对象)来达到线程安全的。

    @Overridepublic synchronized StringBuffer append(String str) {toStringCache = null;super.append(str);return this;}

String为什么是不可变的?

String类中有个私有的被final修饰的成员变量,一个char数组。String a = “abc” 实习是a, b, c 存入了char数组。由于value数组是final修饰的,value引用的地址不会改变,而且也不能修改,所以实现了String的不可变性。

集合类

对比Vector、ArrayList、LinkedList有何区别*?

ArrayList和Vector都是动态数组,ArrayList自动扩容的倍数为1.5倍,Vector是两倍,还有Vector是线程安全的,底层数据结构都是数组,适合根据下标访问,LinkedList底层数据结构是一个双向链表,更适合插入,删除,LinkedList实现了Clonenable类和Serializable表面可以被复制和序列化。

ps: 从底层数据结构不同,相关操作对应的时间复杂度不同。线程安全不同来回答。

对比Hashtable、HashMap、TreeMap有什么不同?

都是用于存储键值对的容器。Hastable是线程安全的但是性能不好,不支持支持null值,null键。HashMap线程不安全,支持null值,null键,底层实现是数组+链表,TreeMap底层数据结构是红黑树,线程不安全。

ps: 由于实现了红黑树,treemap的get(), put(), remove() 等方法的时间复杂度都是log(n)

怎么确保一个集合不能被修改?

可以使用 Collections. unmodifiableCollection(Collection c) 方法来创建一个只读集合,这样改变
集合的任何操作都会抛出 Java. lang. UnsupportedOperationException 异常

Netty

Selector有几种模式?

什么是netty?

Netty是一个基于NIO的异步事件驱动的网络应用程序框架,用于快速开发高性能协议服务器和客户端。Netty没有NIO那样有繁杂的类库和API。

说一下Netty线程模型?

Netty采用了Reactor模式,分为单reactor单线程,单reactor多线程,主从reactor多线程。Reactor负责请求监听和分发事件,在单线程模型只有一个handler用于处理请求,对高并发的支持不好,单reactor多线程指的是会有多个handler对象将请求给worker线程池来处理。多reactor多线程在原来的基础上加了一层subreactor,主reactor负责接收连接,从reactor负责后续任务。对并发的支持也更好

epoll和select的区别是什么?(待处理)

Redis

Redis为什么很快?

  1. Redis是基于内存操作,比对磁盘进行读写快很多
  2. Redis的数据存储在一个全局的Hash表中,可以在O(1)时间内查到对应的key-value
  3. Redis数据结构,比如Zset采用的是跳表,不仅支持高效率的查询,删除,插入操作,还支持高效的区间查询
  4. Redis采用多路复用机制,能够并发处理大量请求,吞吐量比较高

Redis事务能不能满足ACID?

分情况:
原子性:入队时就报错,保证,执行中报错不保证
隔离性:保证
一致性:保证
持久性:RDB和AOF都可能存在数据丢失,不保证

Redis有哪些变慢的可能?

  1. 慢查询:首先使用redis-cli的日志观察是否慢记录,通过config set slowlog-log-slower-than 10000设置慢记录的时间标准。还有config set slowlog-max-len设置存储慢查询日志,可以通过slowlog get来查看命令,执行时间等信息来确定是否有慢查询。SMEMBERS、SUNION等命令都可能是慢查询。如果因为慢查询导致Redis变慢,可以使用 SSCAN 多次迭代返回,避免一次返回大量数据

  2. 处理大量的过期key: Redis处理过期的key也可能导致变慢、Redis删除过期key的机制是每100毫秒采样一定数量的过期key并且全部删除,如果过期key的比例占%25以上,就重复上面的过程直到比例在25%以下。删除过程是阻塞的,如果大于%25的话,会影响性能。所以应该避免设置同一个时间大量KEY过期

  3. 执行AOF的时候: AOF采用always写回策略的时候,为了保证数据的完整性,及时知道写回操作是否完成,不会采用后台子进程来进行写回操作,会影响性能

  4. AOF重写的时候,通过fsync启用后台子线程进行重写,如果日志文件过大,负责重写的子线程一直没有完成时,如果主线程再次使用fsync想把操作日志写到磁盘时,就会发生阻塞。这个时候需要看看设置的AOF写回策略和业务系统对数据完整性的敏感程度高不高。如果对敏感度高,可以用高速固态硬盘作为AOF

  5. 删除BigKey: 还有在删除一个bigkey的时候可能会导致阻塞,操作系统在释放内存的时候,需要把被释放的内存插入一个内存空闲块的链表,用于后面方便管理内存。这个插入过程比较费时间,如果释放的内存很大,就会导致阻塞,比如从库在收到主库的RDB文件后会执行FLUSHDB命令。异步删除也称为惰性删除(lazy free)可以防止主线程的阻塞

Redis怎么查看内存使用情况?

info memory
碎片率:mem_fragmentation_ratio = used_memory_rss/ used_memory
越接近1越好

怎么清理redis内存碎片?

启用自动内存碎片清理,可以把 activedefrag 配置项设置为 yes–config set activedefrag yes

了解
active-defrag-ignore-bytes 100mb:表示内存碎片的字节数达到 100MB 时,开始清理

active-defrag-threshold-lower 10:表示内存碎片空间占操作系统分配给 Redis 的总空间比例达到 10% 时,开始清理

active-defrag-cycle-min 25: 表示自动清理过程所用 CPU 时间的比例不低于 25%,保证清理能正常开展;

active-defrag-cycle-max 75:表示自动清理过程所用 CPU 时间的比例不高于 75%,一旦超过,就停止清理,从而避免在清理时,大量的内存拷贝阻塞 Redis,导致响应延迟升高。

如何解决缓存和数据库的数据不一致问题?@@@

情况分为读写缓存,和只读缓存。读写缓存的时候,可以采用同步写回策略,修改缓存后立即修改数据库也可以用异步写回策略,如果是只读缓存的话,在删改数据的时候,我觉得可用先删改数据库的值再删改缓存中的值,但是这两个操作需要保证原子性。

说一说LRU和LFU的区别?

LRU是淘汰最长时间没有访问的,LFU是淘汰最近一段时间访问频率最低的。Redis中使用的是RedisObject存储的数据,RedisObject中有一个lru字段,LRU策略中lru字段存储了访问时间的时间戳,LFU中存储的是时间戳(16bit)+counter(8bit,最大只能到255), 用于计算访问次数,如果访问次数一样,就会根据时间戳来判断。Redis会随机采样部分数据,例如10个,100个,然后在这个候选名单中筛选。LRU在应用对大量数据同时进行单次查询后,容易造成缓存污染,因为按照LRU的策略这些查询后的数据长时间都不会被淘汰,这个时候用LFU就会更好。

缓存被污染了这么办?

当缓存中存在大量不经常或者不会被访问的数据时,就会导致缓存污染,当缓存满了后需要写入新的缓存,缓存污染就会引起不必要的缓存淘汰,进而会影响数据的性能。可用使用LRU和LFU来解决

Redis的缓存淘汰策略有哪些?

为什么Redis中的有序集合要用跳表来实现?

跳表的插入删除,查询的时间复杂度都是O(logn)。而且跳表支持快速的范围查询。

redis的rehash是怎么操作的?

redis有两个全局hash表,由于rehash有大量的数据拷贝,一次性迁移完会导致redis线程阻塞。所以采用的是渐进式rehash,一次请求迁移一点数据。

说一下redis的持久化机制?

RDB: 通过bgsave命令,fork出一个子线程来进行内存数据的全量快照。fork阶段会有一个很短的阻塞, 缺点是容易丢失两次快照之间的数据
AOF: 将执行成功的指令写入一个文件用于数据恢复,数据完整性比RDB好,文件比RDB大但可以通过bgreplicaof来重写文件,aof采用always的时候主线程会阻塞

如何解决Redis缓存雪崩、穿透、击穿问题?

缓存雪崩
有两种原因会导致缓存雪崩,其中一种是缓存中大量数据同时失效,这个时候可以在给这些需要同时失效的数据添加一个比较小的随机时间,比如 1-2分钟,让这些数据不会在同一时间一起失效,或者可以通过服务降级的方式,比如访问商品属性等不是特别重要的数据,在缓存没有命中的时候就直接返回错误页面或者提示,但是如果访问重要数据比如价格的时候,缓存没有命中还是去数据库查。另外一种导致缓存雪崩的原因是redis缓存实例发生故障宕机,这种情况我们可以通过服务熔断,在业务系统调用缓存接口的时候直接返回,等redis恢复后再允许访问,从而防止大量的请求积压到数据库
缓存穿透
在 Redis 中缓存一个空值或是和业务层协商确定的缺省值(例如,库存的缺省值可以设为 0)。或者使用布隆过滤器
缓存击穿
热点数据突然失效,导致大量请求积压到数据库,对于热点数据,就不设置过期时间

Redis支撑秒杀场景的关键技术和实践都有哪些?

秒杀场景的特征是高并发和读多写少。秒杀可以利用分布式锁来实现,只有获得锁才可以提交订单,这样的话大量的请求都在while循环等待锁了。还有由于秒杀时,库存量是热点数据,不应该设置过期时间,防止缓存击穿

说一下Redis的哨兵模式?

哨兵sentinel是一个单独进程,和Redis主从库同时运行,负责监控,选主,通知。当PING不通一个库的时候,就会判断是主观下线,只有当一半以上的哨兵都判断主管下线才会确定为客观下线。然后会先选取一个哨兵leader(通过哨兵配置文件中的 quorum 配置项设定的), 然后由leader来选取新主库,选主的时候,需要根据和旧主库同步程度的高低来选择、(有一个参数是slave_repl_offset 需要和 master_repl_offset接近),哨兵之间可以互相通知判断结果是因为redis的 发布订阅模式。

Redis实现消息队列有哪些方案?(待处理)

首先需要保证消息的顺序保存,重复消息处理,以及消息处理的可靠性()。Redis提供了Streams数据类型,可以实现消息队列。

Redis主从同步有哪些问题?怎么解决?(待处理)

1.数据一致性问题,主从库数据不一致。出现这个问题是因为主从数据同步的命令是异步完成的。

MySQL和Redis使用下的数据一致性解决方案,考虑高可用,高性能。

利用分布式事务解决办法中的最终一致性,先更新mysql,通过订阅mysql的binlog写入,再通过消息队列去删除对应的redis缓存

分布式事务

分布式事务产生的背景?

在微服务架构下,由于每个服务使用的不是同一个事务控制器,比如A服务远程调用B服务,那么如果在调用之前发生异常A还能回滚,但是如果B服务调用成功之后A服务发生异常,A服务就没办法回滚B服务。

什么是CAP定理?

CAP指的是一致性Consistency, 可用性Availability和分区容错性Partition Tolerence. CAP定理指CAP中只有分区容错性是可以确定的,而可用性和一致性只能选择一个。例如一个节点发生了异常,想要保住一致性就需要将这个节点停止,但是就不能保住可用性了。

常见的分布式事务解决方案?

2PC:二阶段提交。接收到请求后协调者(Coordinator)先给各个服务发送事务预处理请求,服务受到预处理请求后执行本地事务但不提交需要先给Coordinator反馈是否能执行,如果有一个服务不能提交,所有事务回滚

TCC:TCC指的是try,confirm, cancel 三个阶段,比如A调用了B服务和C服务,首先A,B, C都需要调用try方法来保证所有服务的预处理成功,如果所有预处理成功后,就调用Confirm方法完成事务,如果有一个服务由于服务挂了,数据库宕机等导致异常,所有方法执行rollback方法进行回滚。TCC需要引入支持TCC的框架,比如Hmily,ByteTCC等,引入框架后各个服务能感知到其他服务try方法执行的结果,具体感知的原理暂时不知道

最大努力通知:

最终一致性:

Seata分布式事务框架实现原理?

什么是raft算法?

redis使用的就是raft算法。在raft算法中,每个节点有三种状态,follower,candidate,leader. 主从切换是follower在一定时间内没有接收到来之leader的信息,就会变成candidate,然后通过投票机制选出领导者,主从同步是通过同步日志,主节点接受到数据变更的请求后,会将请求写到日志中然后发送给从节点,当大多数从节点返回确认信息后,主节点再执行,然后从节点执行。

什么是BASE理论?

BA指的是基本可用,比如在流量过大的情况下,将部分用户的请求降级,S指的是软状态soft state, E指的是Eventually Consistency最终一致性,最终一致性是指业务可能在某个状态的数据是不满足一致性的,但是最后通过某些方法能够满足最终一致性

JAVA core foundations相关推荐

  1. 认识Java Core和Heap Dump

    什么是Java Core和Heap Dump Java程序运行时,有时会产生Java Core及Heap Dump文件,它一般发生于Java程序遇到致命问题的情况下. 发生致命问题后,Java进程有时 ...

  2. 【JAVA Core】精品面试题100道

    [JAVA Core]精品面试题100道 加个说明:我的初心是Java每个技术栈整理个100道面试题,现在的底子是哪吒的<208道面试题> 后续我会把自己有价值的题和面试真题添加进入,也对 ...

  3. java core 正则 \\PL+的意义

    java core第十版中的第一章中出现了一个正则"\\PL+",根据注释(Split into words:noletters are delimiters)提示,这个正则的意思 ...

  4. 别人的Morgan Stanley面试,注重基础,java core、多线程、设计模式、设计程序。。。

    过完年来就打算换工作,而是复习了1个月的基础做过的项目和英语.这个月的某天突然接到猎头的推荐,摩根斯坦利的direct hire职位,心中激动不已,抓紧复习英语,搜索了下ms的面试情况,全程都是英语面 ...

  5. java core知识谱图和j2ee知识谱图

    java core知识谱图 [img]http://dl2.iteye.com/upload/attachment/0128/5528/4e3a6d59-aa71-3dec-9841-8b483080 ...

  6. java core日志在哪里_java-如何在未启用日志记录功能的情况下在...

    我已使用CXF 3.0.0 Milestone1创建了Rest服务,并且试图在SEND阶段的Out Interceptor中获取HTTP响应的正文,并将其放入String变量中,而未在xml配置文件中 ...

  7. 如何开始 java core java

    .1 java 入门的经典书是那些.2 怎样开始学习java.3 java的开发工具是哪些? (what is the best fundamental books for java easy lea ...

  8. java core 作者_java core dump分析实战

    hs_err_pid简介 hs_err_pid.log是java程序发生core的时候产生的文件,里面有当时出错时jvm的执行情况. 排查方法 头文件解读可以查看问题 头文件包含了简单的信息阐述,里面 ...

  9. Java core 包_feilong-core 让Java开发更简便的工具包

    ## 背景 在JAVA开发过程中,经常看到小伙伴直接从网上copy一长段代码来使用,又或者写的代码很长很长很长... **痛点在于:** * 难以阅读 * 难以维护 * sonar扫描结果债务长 * ...

最新文章

  1. Python设计模式-命令模式
  2. python的快速入门-1.1、Python快速入门(0529)
  3. session和cookie到底有什么联系?这一篇文章给你分析的明明白白~
  4. Android TimePickerDialog样式配置与TimePicker模式选择
  5. Springboot-Jpa多数据库配置-2.0+版本
  6. 下列关于html5表单的多样输入方式,IT兄弟连 HTML5教程 HTML5表单 多样的输入类型1...
  7. c语言字符串定界符,关于c ++:按字符分割字符串
  8. MFC:移动对话框到右下角
  9. 四.开发记录之ubuntu系统安装ROS和开发环境
  10. 初入c++(四)string类和c++中的引用
  11. RxHttp 一条链发送请求,新一代Http请求神器(一)
  12. 是什么决定了创业的成败?
  13. 多种方式创建 Entity Framework Core 上下文
  14. 手写模拟器,将电子文档转换为手写字体,就用这个软件
  15. android手机黑科技软件,安卓党福利!10款黑科技APP,让你的手机更好用
  16. 4位格雷码的顺序编码_格雷码的编码和译码算法.doc
  17. 操作系统实验ucore lab1
  18. react router BrowserRoute部署后页面空白问题
  19. lol服务器维护局,lol维护局 英雄联盟钻石维护局掉多少分
  20. paddle——站在巨人肩膀上及背刺二三事

热门文章

  1. 看图识“字”(15)-站点图
  2. arduino灯带随音乐_【求教】求大神指点,led随音乐律动
  3. 怎么画出好的架构图,架构师必备
  4. 演化博弈的Python实现:基础篇3 基于双层网络的演化博弈
  5. mysql药品信息表_jsp+mysql医院药品管理信息系统设计
  6. 全球开源学习平台Moodle
  7. 使用-flat.vmdk文件恢复ESXI虚拟机的vmdk文件
  8. SPSS学习笔记——对应分析
  9. Python爬虫第一步之获取网页源代码
  10. Dreammail 帮助获取