抓住金三银四好机会,超齐全java大厂面试题汇总(请自寻学习查找答案)

目录

一、JDK源码

1.HashMap

2.concurrentHashMap

3.volatile

4.linkedList、ArrayList

5.线程池

6.设计模式

二、JVM、GC、G1

1.jvm内部

2.加载

3.堆

4.方法区

5.jit即时编译器

6.垃圾回收

7.垃圾回收器

三、springboot、springcloud

1.注解

2.spring源码

3.AOP

4.事务

5.自动配置原理

6.请求处理原理

7.springcloud

四、docker、k8

五、netty

六、xxljob

七、处理生产问题

八、redis

1.string

2.hash

3.list

4.set(无序)

5.zset

九、es

十、mysql


一、JDK源码

1.HashMap

jdk7:hash冲突会存放在链表中,

jdk8:hash冲突过多,链表会转变为红黑树。‘

红黑树(Red Black Tree) 是一种自平衡二叉查找树。’

2.concurrentHashMap

jdk7:分段锁。

jdk8:不用分段锁了,使用cas+

3.volatile

可见性,不保证原子性,防止指令重排序。

cas:比较并交换

4.linkedList、ArrayList

CountDownLacth:他经常用于监听某些初始化操作,等初始化执行完毕后,通知主线程继续工作。

CyclicBarrier:只要有一个人没有准备好,大家都等待

Semaphore信号量

Callable和Future的使用

CopyOnWriteArrayList(读写分离,写时复制)、CopyOnWriteArraySet(HashSet不安全)、

5.线程池

  newFixedThreadPool()、newSingleThreadExecutor()、newCachedThreadPool()、newScheduledThreadPool()

线程池七大参数

1.corePoolSize:线程池中的常驻核心线程数。

    在创建了线程池后,当有请求任务来之后,就会安排池中的线程去执行任务,近似理解为今日当值线程。

    当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中。

2.maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值必须大于等于1。

3.keepAliveTime:多余的空闲线程的存活时间。

    当前线程池线程数量超过corePoolSize时,当空闲时间达到keepAliveTime值时,多余空闲线程会被销毁直到只剩下corePoolSize个线程为止。

4.unit:keepAliveTime的单位。

5.workQueue:任务队列,被提交但尚未被执行的任务。

6.threadFactory:表示生成线程池中工作线程的线程工厂,用于创建线程,一般用默认的即可。

7.handler:拒绝策略,表示当队列满了并且工作线程大于等于线程池的最大线程数(maximumPoolSize)时如何来拒绝。

6.设计模式

设计模式简介 | 菜鸟教程

二、JVM、GC、G1

1.jvm内部

类加载子系统、堆、栈、方法区、直接内存、垃圾回收系统、执行引擎、本地方法栈、PC寄存器

2.加载

加载-链接(验证、准备、解析)-初始化

类加载器:系统类加载器、扩展类加载器、引导类加载器(启动类加载器)、用户自定义加载器

双亲委派打破:1.jdk1.2之前还没有,引入了线程上下文类加载器,热代码替换热部署

3.堆

jdk7:新生代、老年代、永久代

jdk8:新生代、老年代、元空间

参数

-Xms、-Xmx设置堆内存大小

新生代一般占1,老年代占2,eden比Survivor为8:1:1,朝生夕死。

垃圾收集:

频繁在新生区收集,很少在养老区收集,几乎不再永久区/元空间收集。

TLAB:线程私有缓存,避免线程不安全问题,TLAB仅占有eden区的百分之一,优先在TLAB分配,分配失败会加锁然后在eden区分配内存。

逃逸分析、标量替换(JIT即时编译器会将对象拆解为基本数据类型):栈上分配。

4.方法区

jdk7:方法区-永久代

jdk8:元空间-方法区

常量池(数量值、字符串值、类引用、字段、方法引用)vs运行时常量池(int、string)

方法区的垃圾回收(很难回收)

方法区的演变

 

 

 

5.jit即时编译器

6.垃圾回收

stop the world、安全点与安全区域,强软弱虚、内存溢出与内存泄漏。

引用计数法(循环引用问题无法解决)、可达性分析算法(GC ROOts,栈引用的对象、本地方法引用的对象、静态属性引用的对象、方法区中引用的对象例如字符串常量、同步锁持有的对象、系统类加载器加载的对象等等)

finalize(),对象被销毁之前会调用(只有一次复活机会)

标记-清除算法,复制算法,标记-压缩算法,分代回收,分区算法(G1)

7.垃圾回收器

串行新生代老年代回收(serial GC)单核cpu

并行垃圾新生代老年代回收器(parallel GC),吞吐量优先

parnew + CMS并发,但是需要有个兜底方案(低延迟)

G1区域化分代式,混合回收。分区域所以有个记忆集的概念,

zgc,革命性的。

三、springboot、springcloud

1.注解

@Bean、@Configuration、@ComponentScan扫描包(包括排除等等@Filter排除规则)、@Scope("prototype")(设置单实例多实例)、@Lazy-bean懒加载、@Conditional-按照条件注册bean、@Import导入组件

@Controller、@Service、@Repository、@Component注册名称都是类名首字母小写

@Value赋值、@PropertySource加载配置文件、@EnableConfigurationProperties + @ConfigurationProperties自动配置绑定

@Autowired自动注入(优先按照类型,多个类型就根据属性名查找)@Autowired:可以标注 构造器、参数、方法、属性。

@Qualifier指定需要装配的组件名称

@Primary装配首选bean

@Resource默认是按照属性名装配

@Inject自动装配,与@Autowired一样

@RestController、@Controller、@ResponseBody、@RequestMapping("/hello")

@SpringBootApplication启动类,容器注册

@PathVariable、@RequestHeader、@ModelAttribute、@RequestParam、@MatrixVariable、@CookieValue、@RequestBody、@RequestAttribute

@ControllerAdvice+@ExceptionHandler处理全局异常(推荐)

2.spring源码

BeanPostProcessor后置处理器,bean赋值,注入其他组件、@Autowired、生命周期注解功能、@Async、等等很多功能都用到了BeanPostProcessor。

ApplicationContextAwareProcessor注入源码

3.AOP

前置 后置 环绕 异常 返回通知。

在组件创建完成之后,判断组件是否需要增强,需要增强就返回一个代理对象。

拦截器链的概念

4.事务

@Transactional

底层使用AOP,

5.自动配置原理

@EnableAutoConfiguration

* SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration

* 每个自动配置类按照条件进行生效(@Conditionalxxxx),默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定

* 生效的配置类就会给容器中装配很多组件

* 只要容器中有这些组件,相当于这些功能就有了

* SpringBoot默认会在底层配好所有的组件。但是如果用户自己配置了以用户的优先(@ConditionalOnMissingBean)

*定制化配置:① 用户直接自己@Bean替换底层的组件② 用户去看这个组件是获取的配置文件什么值就去修改。

xxxxxAutoConfiguration ---> 组件 ---> xxxxProperties里面拿值 ----> application.properties

6.请求处理原理

HttpServlet -> HttpServletBean -> FrameworkServlet -> DispatcherServlet(实现doService-> doDispatch方法处理请求)

处理请求、解析参数、拦截器HandlerInterceptor

7.springcloud

nacos、feign openfeign、hystrix、gateway、sleuth zipkin、

sentinel、seata(AT模式、SAGA模式)

四、docker、k8

docker使用

五、netty

RPC框架、心跳检测、http服务器、即时通讯、消息推送

Channel通道,用来读写连接等,

EventLoop用来处理事件。

异步非阻塞。

CPU核心数*2

bossGroup:接收连接。

workerGroup:负责具体的处理,交由对应的 Handler 处理。

自带的解码器

六、xxljob

分布式任务调度,配合springbatch使用(但是springbatch比较复杂,reader、writer、processor等,所以直接用的tasklet)

七、处理生产问题

jstack 、 jmap

jps:显示当前java县城

jstack:查看当前进程的线程栈,通常查看死锁、锁等待等。

jmap:显示各种信息,还可以生成堆dump快照(会stop应用,生产慎用)

jstat查看堆内存

八、redis

string

hash

list

set

zset(sortedSet)

bitmap(位图)

HyperLogLog(统计)

GEO(地理)

stream

1.string

set get

ttl 查看过期时间

setnx 不存在创建

商品id等、点赞数、阅读量,incr命令递增

2.hash

hset hget

做缓存用

3.list

lpush:向左添加

rpush:向右添加

订阅列表

4.set(无序)

sadd、srem

交集、差集、并集运算,随机弹出元素(SPOP弹出并删除,SRANDMEMBER弹出不删除)。

抽奖小程序、点赞用户列表

微博社交关系(关注的人、我关注的人也关注她、可能认识的人、共同关注等)

5.zset

zadd、

商品排序(排行榜)、抖音热搜、

分布式锁、redisson、内存淘汰策略lru(最近最少使用)

哨兵、集群、持久化(快照、aof)

九、es

elk、查询、倒排索引、IK分词器、javaAPI

Relational DB(MySQL)

Elasticsearch

数据库(database)

索引(indices)(就和数据库一样)

表(tables)

类型types(慢慢会被弃用)

行(rows)

文档documents

字段(columns)

字段fields

十、mysql

MyISAM和InnoDB(支持行锁)

索引:单值索引、唯一索引、主键索引、复合索引

B+树,真实数据存在叶子结点,非叶子节点不存储真实数据,只存储索引方向。

需要索引:主键、频繁查询、频繁更新、高并发下更倾向于用复合索引、排序字段、统计分组字段。

不需要:表记录少、经常删改的、重复多的字段

explain:

id越大越先被执行

type最好达到ref级别

key_len:越短越好。

索引失效:

1.全值匹配我最爱。

2.最佳左前缀法则。

3.不在索引列上计算、函数、类型转换,字符串不加引号导致类型转换。

4.范围索引右边的列会失效。

5.尽量使用覆盖索引,少用select*

6.!= <>无法用索引

76.is null is not null

8.like以通配符开头的

9.少用or

慢查询日志、druid会有sql执行时间

乐观锁悲观锁

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秃了也弱了。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值