精华内容
下载资源
问答
  • 学习指南(按照开发经验对程序员进行分层) 0~1年(搬砖): Java基础(基本语法、面向对象、继承、多态、接口和抽象类、异常、内部类、集合、泛型、反射、I/O等) Web编程(Servlet+MySQL数据库+商品管理系统实战...

    一面(电话面+后期在线coding)

    ①你们为什么要使用mongdoDb?你们的这个系统中涉及到哪些表?

    ②hytrix 的实现原理是什么?隔离策略有哪些?你们使用的是哪一些?你们项目中哪些地方使用到了,使用场景是什么?为什么要使用?

    ③spirng 源码。

    ④rocketMq 的设计理念,数据存储,设计思想等。

    ⑤ConcurrentHashMap的底层实现原理

    ⑥你线上问题解决经验是什么?遇到了什么问题?应该怎么去解决?

    ⑦在线编码: 两个有序链表,合并成一个链表,然后进行算法的时间复杂度,空间复杂度分析。

    二面(电话面+后期在线coding)

    ①tcp协议和uDP 协议的区别是什么?

    ②3次握手和4次挥手的过程是什么样的?

    ③怎么保证接口的幂等性?

    ④mysql的存储引擎的数据结构是什么?相比其余的数据结构,有什么优缺点?

    ⑤说一下你对SpringCloud,SpringBoot,Spring的理解

    ⑥java 在编译和运行过程中分别作了什么?

    ⑦在线编码: 给定一个字符串,单词之间以空格分隔,要求里面的单词倒装过来。

    三面(电话面,技术交叉面)

    ①介绍一下springCloud 的组件,各组件的作用,你们是怎么用,你的理解是什么?

    ②springCloudbus 关联的消息中间有几种?支持哪几种?你觉的什么场景下,会用到springCLoudBus?

    ③springCloud里面的限流,限流是怎么内部实现的?怎么去挡住多余的请求,怎么实现限流的(线程池的工作原理)?

    ④什么时候该用mongoDB,什么时候使用mysql?该如何选择?

    ⑤你做过的项目数据量有多大呢?如果现在数据量特别大,或者一张表一种放不下了,应该怎么处理?分布分表应该怎么做?具体的某一张表怎么拆?(涉及到主键生成,各种主键生成策略对比,数据分片,以及关联数据的存储,主从复制)

    ⑥java 官方提供的创建的线程池的方式有几种?分别是什么?

    ⑦你们使用的java 版本是什么?java最新的版本是多少?你们为什么还在使用java8呢?

    ⑧你们的垃圾回收器是什么的? 为什么是使用CMS而不是G1? 你能介绍一下像CMS垃圾回收器,从对象创建,内存分配到垃圾回收整个过程吗?

    ⑨介绍一下策略模式,应该怎么用? 它能解决什么问题?从编码领域系统设计方,介绍一下我们怎么去实现一个策略模式?

    学习指南(按照开发经验对程序员进行分层)

    0~1年(搬砖):

    • Java基础(基本语法、面向对象、继承、多态、接口和抽象类、异常、内部类、集合、泛型、反射、I/O等)
    • Web编程(Servlet+MySQL数据库+商品管理系统实战)
    • SSM框架入门到精通(Spring+SpringMVC+Mybatis+SSM商品管理系统实战)
    • SpringBoot(SpringBoot+SpringBoot商品管理系统实战)

    1~3年(技工):

    • JVM深度进阶(JVM内存区域+JVM运行时内存+垃圾回收与算法+JAVA 四种引用类型+GC分代收集算法 VS 分区收集算法+GC垃圾收集器等)
    • 并发编程深度进阶(并发机制的底层实现原理+内存模型+并发编程基础+锁+并发容器和框架+原子类操作+并发工具类+线程池+实战)
    • MySQL深度进阶(Mysq|存储引擎选型及注意事项+解读Mysq|的共享锁及排它锁+分区+事务隔离级别+索引+Sql优化)
    • 数据结构与算法(Java程序员面试必问)

    3~5年(包工头):

    • 分布式消息中间件(Zookpeer+Kafka+MQ+dubbo+SpringCloud等)
    • 数据库(主从复制+读写分离+分库分表)
    • 高效存储(Redis+MongoDB)

    5年以上(设计师):

    • 分布式扩展到微服务(SpringBoot+SpringCloudAlibaba+Docker)
    • SSM框架源码解读(Spring高级源码+SpringMVC源码+Mybatis源码)

    10年以上(送外卖送快递):

    进入饿了么,开始送外卖(开个玩笑)

    惊喜

    最后还准备了一套上面资料对应的面试题(有答案哦)和面试时的高频面试算法题(如果面试准备时间不够,那么集中把这些算法题做完即可,命中率高达85%+)

    image.png

    image.png

    把这些算法题做完即可,命中率高达85%+)

    [外链图片转存中…(img-XA0Nt1Ap-1624877887822)]

    [外链图片转存中…(img-qiRtLrwO-1624877887823)]

    资料获取方式:戳这里免费领取

    展开全文
  • 注意:这次面试过程比较长,内容繁多,在文章中我基本上简述了,文章里的面试题完整版和我个人的总结方法经验(面试学习和刷题笔记),都整理有PDF完整版,如有需要可以看文末 01 JAVA基础 1.1 java知识点 Hashmap ...

    开篇介绍

    个人背景:

    不说太多废话,但起码要让你先对我有一个基本的了解。本人毕业于浙江某二本院校,算是科班出身,毕业后就进了一家外包公司做开发,当然不是阿里的外包,具体什么公司就不透露了,在外包一呆就呆了整整2年多,直到现在才从外包离开,如今拿到阿里的offer准备入职了。

    阐述原因:

    在外包公司的两年里,作为一名菜鸡,确实非常合格,技术没什么长进,眼见也没有提升,没规划没未来,让人实在焦虑,之所以开始改变自己也是家庭发生了变故,才让自己开始思考人生。身边很多人感叹过,能从外包逆袭,算是传奇,所以今天想要分享一下个人的经历,希望能够鼓励到一些与我有相似经历的同行。

    注意:这次面试过程比较长,内容繁多,在文章中我基本上简述了,文章里的面试题完整版和我个人的总结方法经验(面试学习和刷题笔记),都整理有PDF完整版,如有需要可以看文末

    01 JAVA基础

    1.1 java知识点

    • Hashmap 源码级掌握,扩容,红黑树,最小树化容量,hash冲突解决,有些面试官会提出发自灵魂的审问,比如为什么是红黑树,别的树不可以吗;为什么8的时候树化,4不可以吗,等等
    • concureentHashMap,段锁,如何分段,和hashmap在hash上的区别,性能,等等
    • HashTable ,同步锁,这块可能会问你synchronized关键字 1.6之后提升了什么,怎么提升的这些
    • ArrayList 优势,扩容,什么时候用
    • LinkedList 优势,什么时候用,和arraylist的区别 等等
    • 基本类型和包装类型的区别,涉及自动装箱和拆箱,怎么做的,原理
    • String ,StringBuffer,StringBuilder哪个是安全的
    • 字符串编码的区别,被问到过,我觉得比较容易被忽视的一个点
    • 什么是泛型,怎么用泛型
    • static能不能修饰threadLocal,为什么,这道题我当时一听到其实挺懵逼的
    • Comparable和Comparator接口是干什么的,其区别
    • 多态的原理是什么,感觉这个很容易被问到
    • 接口和抽象类,面试官问我是怎么理解的,我说接口对应功能,抽象类对应属性,然后面试官给我说了他的看法,说抽象类更偏向于一种模板~ 然后又交流了一下各自的想法
    • 如何通过反射和设置对象私有字段的值
    • 快速失败(fail-fast)和安全失败(fail-safe)的区别是什么
    • synchronized 的实现原理以及锁优化?
    • volatile 的实现原理?
    • Java 的信号灯?
    • synchronized 在静态方法和普通方法的区别?
    • 怎么实现所有线程在等待某个事件的发生才会去执行?
    • CAS?CAS 有什么缺陷,如何解决?
    • synchronized 和 lock 有什么区别?
    • Hashtable 是怎么加锁的 ?
    • List,Map,Set接口在取元素师,各有什么特点
    • 如何线程安全的实现一个计数器
    • 生产者消费者模式,要求手写过代码,还是要知道的
    • 单例模式,饿汉式,懒汉式,线程安全的做法,两次判断instance是否为空,每次判断的作用是什么。
    • 线程池,这个还是很重要的,在生产中用的挺多,四个线程池类型,其参数,参数的理解很重要,corepoolSize怎么设置,maxpoolsize怎么设置,keep-alive各种的,和美团面试官探讨过阻塞队列在生产中的设置,他说他一般设置为0,防止用户阻塞
    • cyclicbarrier 和countdownlatch的区别,个人理解 赛马和点火箭
    • 线程回调,这块 被问过让我设计一个RPC,怎么实现,其实用到了回调这块的东西
    • sleep 和yeild方法有什么区别
    • volatile关键字,可见性。
    • 乐观锁和悲观锁的使用场景
    • 悲观锁的常见实现方式:lock synchronized retreentlock
    • 乐观锁:CAS MVCC
    • 读写锁的实现方式,16位int的前八位和后八位分别作为读锁和写锁的标志位
    • 死锁的条件,怎么解除死锁,怎么观测死锁。
    • 希望大家能够好好看一下反射的原理,怎么确定类,怎么调方法
    • RPC框架,同步异步,响应时间,这些都被问到过,还让设计过
    • 同步,异步,阻塞,非阻塞 在深信服的面试中遇到过,最好再找一些应用场景加以理解

    1.2 JVM

    • 内存模型以及分区,需要详细到每个区放什么。
    • 堆里面的分区:Eden,survival (from+ to),老年代,各自的特点。
    • 对象创建方法,对象的内存分配,对象的访问定位。
    • GC 的两种判定方法
    • GC 的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么地方,如果让你优化收集方法,有什么思路?
    • GC 收集器有哪些?CMS 收集器与 G1 收集器的特点
    • Minor GC 与 Full GC 分别在什么时候发生?
    • JVM 内存分哪几个区,每个区的作用是什么?
    • 如和判断一个对象是否存活?(或者 GC 对象的判定方法)
    • java 中垃圾收集的方法有哪些?
    • 类加载器双亲委派模型机制?
    • java 内存模型,java 类加载过程?
    • 什么是类加载器,类加载器有哪些?
    • 简述 java 内存分配与回收策率以及 Minor GC 和Major GC

    02 数据库

    2.1 MySQL

    • 事务四大特性(ACID)原子性、一致性、隔离性、持久性?
    • 事务的并发?事务隔离级别,每个级别会引发什么问题,MySQL默认是哪个级别?
    • MySQL常见的三种存储引擎(InnoDB、MyISAM、MEMORY)的区别?
    • MySQL的MyISAM与InnoDB两种存储引擎在,事务、锁级别,各自的适用场景?
    • 查询语句不同元素(where、jion、limit、group by、having等等)执行先后顺序
    • 索引为什么要用B+树,B+树和B-树的区别是什么
    • mysql的默认事务级别,一共有哪些事务级别
    • mysql的一些语句,这些肯定需要掌握的
    • mysql锁,行锁,表锁 ,什么时候发生锁,怎么锁,原理
    • 数据库优化,最左原则啊,水平分表,垂直分表
    • 什么是临时表,临时表什么时候删除?
    • MySQL B+Tree索引和Hash索引的区别?
    • sql查询语句确定创建哪种类型的索引?如何优化查询?
    • 聚集索引和非聚集索引区别?
    • 有哪些锁(乐观锁悲观锁),select 时怎么加排它锁?
    • 非关系型数据库和关系型数据库区别,优势比较?
    • 数据库三范式,根据某个场景设计数据表?
    • 数据库的读写分离、主从复制,主从复制分析的 7 个问题?
    • 使用explain优化sql和索引?
    • MySQL慢查询怎么解决?
    • 什么是 内连接、外连接、交叉连接、笛卡尔积等?
    • mysql都有什么锁,死锁判定原理和具体场景,死锁怎么解决?
    • varchar和char的使用场景?
    • mysql 高并发环境解决方案?
    • 数据库崩溃时事务的恢复机制(REDO日志和UNDO日志)?

    03 Spring相关

    spring的两大特性- ioc aop,实现原理

    • 如果存在A依赖B,B依赖A,那么是怎么加到IOC中去的
    • beanFactory的理解,怎么加载bean
    • FactoryBean的理解
    • 基于注解的形式,是怎么实现的, 你知道其原理吗,说一下
    • 依赖冲突,有碰到过吗,你是怎么解决的~
    • bean的生命周期
    • spring中的自动装配方式
    • BeanFactory 和 FactoryBean
    • Spring IOC 的理解,其初始化过程?
    • BeanFactory 和 ApplicationContext?
    • Spring Bean 的生命周期,如何被管理的?Spring Bean 的加载过程是怎样的?
    • 如果要你实现Spring AOP,请问怎么实现?
    • 如果要你实现Spring IOC,你会注意哪些问题?
    • Spring 是如何管理事务的,事务管理机制?
    • Spring 的不同事务传播行为有哪些,干什么用的?
    • Spring 中用到了那些设计模式?
    • Spring MVC 的工作原理?
    • Spring 循环注入的原理?
    • Spring 如何保证 Controller 并发的安全?
    • 你一般是怎么对mvc项目进行分层的
    • dispatch-servlet的工作原理
    • 为什么有了springmvc还要在项目中使用spring?
    • springmvc的运行机制,dispatch -》 hanldermapping-—》handler -》handlerAdapter-》执行handler-》modelandview -》 返回mv -》 视图解析器-》返回view -》 渲染响应
    • 怎么防止依赖注入
    • 怎么让mapper 和xml对应
    • 如何自动包装对象
    • 和spring相比,做了什么改变
    • starter你知道哪些
    • 如何部署springmvc项目 以及如何部署springboot项目
    • springboot的插件,你使用过哪些

    04 中间件

    4.1 redis

    • Redis用过哪些数据数据,以及Redis底层怎么实现
    • Redis缓存穿透,缓存雪崩
    • 如何使用Redis来实现分布式锁
    • Redis的并发竞争问题如何解决
    • Redis持久化的几种方式,优缺点是什么,怎么实现的
    • Redis的缓存失效策略
    • Redis集群,高可用,原理
    • Redis缓存分片,Redis的数据淘汰策略
    • 为什么选择redis,有什么好处,基于内存,抗压
    • redis集群怎么进行数据分配,hash槽
    • redis的主从复制是怎么实现的
    • redis的数据结构 最常问 hash是什么, sorted set怎么实现的
    • 因为项目的原因,问我redis是怎么保证高可用的,主从和集群怎么加在一起
    • redis 和memcache的区别
    • redis 分布式锁的实现原理 setNX 啥的
    • redis模拟session,除了redis你还考虑过别的吗
    • redis的缓存击穿,怎么处理这个问题
    • redis是基于内存的,那么它有持久化吗,aof rdb
    • aof和rdb的优缺点,你在项目中使用的哪一个

    4.2 MQ

    • 为什么选择rabbitMQ, 社区活跃,高并发
    • 别的MQ也要了解,比如RocketMQ(阿里的,java开发,再次开发,并发高,分布式,出错少)
    • ActiveMQ, kafka
    • topic 和 block
    • MQ的作用,同步转异步,消除峰值
    • 如何保证数据一致性,即原子性,ack
    • 消息队列在项目中的应用

    4.3 nginx

    • 怎么配置负载均衡
    • 怎么限流
    • 怎么使用nginx缓存
    • 为什么使用nginx,有别的替代品吗
    • 请解释 x Nginx 如何处理 P HTTP 请求
    • 在 x Nginx 中,如何使用未定义的服务器名称来阻止处理请求? ?
    • 使用“ 反向代理服务器 ” 的优点是什么?
    • x Nginx 服务器上的 r Master 和 和 r Worker 进程分别是什么?
    • nginx的压力测试,你测试过吗,能抗住多少压力
    • 你如何通过不同于 0 80 的端口开启 Nginx?
    • 是否有可能将 x Nginx 的错误替换为 2 502 错误、 503
    • s stub_status 和 和 r sub_filter 指令的作用是什么? ?

    4.5 dubbo

    • 原理,怎么用
    • 和erueka有什么区别
    • 为什么要用dubbo,不用行不行?
    • 跨域请求的一些知识点
    • Dubbo 支持哪些协议,每种协议的应用场景,优缺点?
    • Dubbo 超时时间怎样设置?
    • Dubbo 集群的负载均衡有哪些策略
    • Dubbo 的主要应用场景?
    • Dubbo 服务注册与发现的流程?
    • Dubbo 中 中 zookeeper 做注册中心,如果注册中心集群都挂掉,发布者和订阅者之间还能通信么?
    • dubbo 服务负载均衡策略?

    05 其他插件

    5.1 shiro

    • 怎么做权限控制
    • 为什么使用shiro,你直接使用aop不也是一样的吗,shiro还有标签~各种扯
    • shiro的两个最重要的函数
    • 认证和授权是怎么做的

    5.2 docker

    • 和vmware的区别
    • 你一般是怎么部署的 IDEA,直接把项目部署到docker并打包到云服务器
    • docker的好处,小,快

    06 Linux

    • 常见的命令
    • sed 和 awk 感觉linux必考。。
    • linux的使用场景,你什么时候会用linux – 》 布置服务器
    • 怎么查看进程和杀死进程
    • 打印一个文件夹中的所有文件
    • float在计算机中是怎么存储的,当时被问到的时候,我也在问自己,怎么存的~~~ 佛了
    • 线程和进程的区别
    • 线程的通信方式,进程的通信方式
    • 系统线程的数量上限是多少
    • 页式存储的概念
    • 内存碎片,你有了解过吗,有想过解决方案吗~

    07 算法

    7.1 排序算法

    • 八大排序算法真的是面试宠儿
    • 最常考 快速排序 和归并排序
    • 哪些排序算法是稳定的 哪些是不稳定的
    • 堆排 也应该掌握

    7.2 树

    • 根据遍历结果恢复树,递归
    • 二叉搜索树第k大
    • 树的和为k的路径
    • 层次遍历
    • 根据层次遍历和后序遍历恢复树
    • 镜像树
    • 树的深度
    • 是不是平衡二叉树

    7.3 链表

    • 反转链表
    • 链表环的入口
    • 交叉链表的交点
    • 复杂链表的复制
    • 二叉搜索树变成双向链表

    7.4 回溯算法

    • 走迷宫
    • 游戏通关

    7.5 递推算法

    • 走台阶
    • 断钢筋

    7.6 背包问题

    • 装最多的东西

    7.7 贪心算法

    • 覆盖问题
    • 时间问题

    08 设计模式

    • 面试中设计模式其实也是挺重要的
    • Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
    • 在 Java 中,什么叫观察者设计模式(observer design pattern)
    • 使用工厂模式最主要的好处是什么?在哪里使用
    • 举一个用 Java 实现的装饰模式(decorator design pattern) ?它是作用于对象层次还是类层次?
    • 在 Java 中,什么时候用重载,什么时候用重写?
    • 举例说明什么情况下会更倾向于使用抽象类而不是接口
    • 观察者模式
    • 适配模式
    • 工厂模式

    最后

    给大家送一个小福利

    资料都是免费分享的,附送高清脑图,高清知识点讲解教程,以及一些面试真题及答案解析。送给需要的提升技术、准备面试跳槽、自身职业规划迷茫的朋友们。点我免费领取!!!

    • 举例说明什么情况下会更倾向于使用抽象类而不是接口
    • 观察者模式
    • 适配模式
    • 工厂模式

    最后

    给大家送一个小福利

    [外链图片转存中…(img-MkeqzbmK-1624683903262)]

    资料都是免费分享的,附送高清脑图,高清知识点讲解教程,以及一些面试真题及答案解析。送给需要的提升技术、准备面试跳槽、自身职业规划迷茫的朋友们。点我免费领取!!!

    [外链图片转存中…(img-rm7bAKPj-1624683903264)]

    展开全文
  • Spring 也算有多年的历史了,已成为Java应用程序开发框架的事实标准。在如此悠久的历史背景下,有人可能会认为Spring放慢了脚步,躺在了自己的荣誉簿上,再也做不出什么新鲜的东西,或者是让人激动的东西。甚至有人...

    前言

    Spring 也算有多年的历史了,已成为Java应用程序开发框架的事实标准。在如此悠久的历史背景下,有人可能会认为Spring放慢了脚步,躺在了自己的荣誉簿上,再也做不出什么新鲜的东西,或者是让人激动的东西。甚至有人说,Spring是遗留项目,是时候去看看其他创新的东西了。
    这些人说得不对。
    Spring的生态圈里正在出现很多让人激动的新鲜事物,涉及的领域涵盖云计算、大数据、无模式的数据持久化、响应式编程以及客户端应用程序开发。
    而大厂面试更是年年不会落下问SpringBoot,你还在怕搞不懂SpringBoot吗?以下是小编好时间心思整理的Spring大厂面试从基础到深入必懂知识点,分享出来给大家学习阅读,查漏补缺,也预祝大家面试顺利!

    垃圾回收算法

    垃圾回收算法的实现设计到大量的程序细节,并且每一个平台的虚拟机操作内存的方式都有不同,所以不需要去了解算法的具体实现。

    复制算法

    将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。这样使得每次都是对整个半区进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只要按顺序分配内存即可,实现简单,运行高效。

    “最粉嫩”的JVM垃圾回收器及算法,抗极限面试,倒背如流

    只是这种算法的代价是将内存缩小为了原来的一半。但是要注意:内存移动是必须实打实的移动(复制),所以对应的引用(直接指针)需要调整。

    复制回收算法适合于新生代,因为大部分对象朝生夕死,那么复制过去的对象比较少,效率自然就高,另外一半的一次性清理是很快的。

    Appel式回收

    一种更加优化的复制回收分代策略:具体做法是分配一块较大的 Eden 区和两块较小的 Survivor 空间(一般称作做From区和To区,也可以叫做S0和S1)

    基于经验统计,新生代中的对象98%是“朝生夕死”的,所以并不需要按照 1:1 的比例来划分内存空间,而是将内存分为一块较大的 Eden 空间和两块较小的 Survivor 空间,每次使用 Eden和其中一块Survivor[1]。当回收时,将 Eden 和 Survivor 中还存活着的对象一次性地复制到另外一块 Survivor 空间上, 最后清理掉 Eden 和刚才用过的 Survivor 空间。

    HotSpot 虚拟机默认 Eden 和 Survivor 的大小比例是 8:1,也就是每次新生代中可用内存空间为整个新生代容量的 90%(80%+10%),只有10%的内存会被 “浪费”。当然,98%的对象可回收只是一般场景下的数据,我们没有办法保证每次回收都只有不多于10%的对象存活,当 Survivor 空间不够用时,需要依赖其他内存(这里指老年代)进行分配担保(Handle Promotion)

    “最粉嫩”的JVM垃圾回收器及算法,抗极限面试,倒背如流

    标记清除

    算法分为“标记”和“清除”两个阶段:首先扫描所有对象标记出需要回收的对象,在标记完成后扫描回收所有被标记的对象,所以需要扫描两遍。回收效率略低,如果大部分对象是朝生夕死,那么回收效率降低,因为需要大量标记对象和回收对象,对比复制回收效率要低。

    它的主要问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾回收动作。回收的时候如果需要回收的对象越多,需要做的标记和清除的工作越多,所以标记清除算法适用于老年代

    “最粉嫩”的JVM垃圾回收器及算法,抗极限面试,倒背如流

    标记整理

    首先标记出所有需要回收的对象,在标记完成后,后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。标记整理算法虽然没有内存碎片,但是效率偏低。

    我们看到标记整理与标记清除算法的区别主要在于对象的移动。对象移动不单单会加重系统负担,同时需要全程暂停用户线程才能进行,同时所有引用对象的地方都需要更新(直接指针需要调整)。所以看到,老年代采用的标记整理算法与标记清除算法,各有优点,各有缺点。

    “最粉嫩”的JVM垃圾回收器及算法,抗极限面试,倒背如流

    垃圾回收器

    回收器名称回收对象和算法回收器类型Serial新生代,复制算法线程(串行)Parallel Scavenge新生代,复制算法并行的多线程回收器ParNew新生代,复制算法并行的多线程回收器Serial Old老年代,标记整理算法单线程(串行)Parallel Old老年代,标记整理算法并行的多线程回收器CMS老年代,标记清除算法并发的多线程回收器G1新生代,老年代;标记整理 + 化整为零并发的多线程回收器

    “最粉嫩”的JVM垃圾回收器及算法,抗极限面试,倒背如流

    目前最常用的两种垃圾回收器,也不用多说,肯定是CMS和G1,一般面试官会问下CMS和G1的区别以及各自的特点,不太会深入问实现原理,毕竟Java面试可问的知识点实在太多了,都一个个深入问1个小时的面试时间根本不够。

    串行的垃圾回收器就不说了,这里专门讲下并发的垃圾回收器

    CMS(Concurrent Mark Sweep)回收器

    顾名思义,这是并发的垃圾回收器,这种回收器是一种以获取最短的回收停顿时间为目的的垃圾收集器,目前很大一部分Java的互联网应用或者B/S系统的服务器上,由于这类应用尤其在意相应速度,希望系统停顿时间越短越好,这样用户体验也会更好,CMS就非常符合这类应用的需求。

    从名字就可以看出,这种回收器是基于标记清除的算法实现,它的运作过程相对串行的垃圾回收器相对复杂点,分为以下4个步骤

    初始标记:很短,仅仅只是标记下GC Root能直接关联的对象,速度极快。

    并发标记:和用户应用同时进行,进行GC Root跟踪的过程,标记GC Root开始关联的所有对象,开始遍历整个可达分析的路径对象,这个时间比较长,所以并发。

    重新标记:短暂,为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标 记阶段稍长一些,但远比并发标记的时间短。

    并发清除:由于整个过程中耗时最长的并发标记和并发清除过程收集器线程都可以与用户线程一起工作,所以,一般来说,CMS 的内存回收过程是与用户线程一起执行的。-XX:+UseConcMarkSweepGC ,表示新生代使用ParNew,老年代的用 CMS。

    “最粉嫩”的JVM垃圾回收器及算法,抗极限面试,倒背如流

    CPU 敏感:CMS 对处理器资源敏感,毕竟采用了并发的收集、当处理核心数不足 4 个时,CMS 对用户的影响较大。

    浮动垃圾:由于 CMS 并发清理阶段用户线程还在运行着,伴随程序运行自然就还会有新的垃圾不断产生,这一部分垃圾出现在标记过程之后,CMS无法在当次收集中处理掉它们,只好留待下一次GC时再清理掉。这一部分垃圾就称为“浮动垃圾”。由于浮动垃圾的存在,因此需要预留出一部分内存,意味着 CMS 收集不能像其它收集器那样等待老年代快满的时候再回收。在1.6的版本中老年代空间使用率阈值(92%)如果预留的内存不够存放浮动垃圾,就会出现 Concurrent Mode Failure,这时虚拟机将临时启用 Serial Old 来替代 CMS。

    会产生空间碎片:标记 - 清除算法会导致产生不连续的空间碎片总体来说,CMS是JVM 推出了第一款并发垃圾收集器,所以还是非常有代表性。但是最大的问题是 CMS 采用了标记清除算法,所以会有内存碎片,当碎片较多时,给大对象的分配带来很大的麻烦,为了解决这个问题,CMS 提供一个 参数:-XX:+UseCMSCompactAtFullCollection,一般是开启的,如果分配不了大对象,就进行内存碎片的整理过程。这个地方一般会使用 Serial Old ,因为 Serial Old 是一个单线程,所以如果内存空间很大、且对象较多时,CMS 发生这样情况会很卡。

    总结:CMS 问题比较多,所以JDK没有一个版本默认垃圾回收器是CMS,只能手动指定。但是它毕竟是第一个并发垃圾回收器,对于了解并发垃圾回收具有一定意义,所以我们必须了解。为什么 CMS 采用标记-清除,在实现并发的垃圾回收时,如果采用标记整理算法,那么还涉及到对象的移动(对象的移动必定涉及到引用的变化,这个需要暂停业务线程来处理栈信息,这样使得并发收集的暂停时间更长),所以使用简单的标记-清除算法才可以降低 CMS的STW的时间。

    该垃圾回收器适合回收堆空间几个 G至20G。

    G1(Garbage First)

    随着JVM内存的增大,STW的时间成为JVM 急迫解决的问题,但是如果按照传统的分代模型,总跳不出STW时间不可预测这点。

    为了实现STW的时间可预测,首先要有一个思想上的改变。

    G1将堆内存“化整为零”,将堆内存划分成多个大小相等独立区域(Region),每一个Region 都可以根据需要,扮演新生代的Eden空间、Survivor空间,或者老年代空间。

    回收器能够对扮演不同角色的 Region 采用不同的策略去处理,这样无论是新创建的对象还是已经存活了一段时间、熬过多次收集的旧对象都能获取很好的收集效果。

    Region:Region可能是Eden,也有可能是Survivor,也有可能是Old,另外 Region 中还有一类特殊的Humongous区域,专门用来存储大对象。G1认为只要大小超过了一个Region容量一半的对象即可判定为大对象。每个Region的大小可以通过参数-XX:G1HeapRegionSize 设定,取值范围为 1MB至32MB,且应为2的N次幂。而对于那些超过了整个 Region 容量的超级大对象,将会被存放在 N 个连续的 Humongous Region 之中,G1 的进行回收大多数情况下都把 Humongous Region 作为老年代的一部分来进行看待。

    开启参数 -XX:+UseG1GC分区大小 -XX:+G1HeapRegionSize一般建议逐渐增大该值,随着 size 增加,垃圾的存活时间更长,GC 间隔更长,但每次 GC 的时间也会更长。

    最大GC暂停时间 -XX:MaxGCPauseMillis设置最大GC暂停时间的目标(单位毫秒),这是个软目标,JVM会尽最大可能实现它。

    “最粉嫩”的JVM垃圾回收器及算法,抗极限面试,倒背如流

    运行过程如下:

    初始标记:仅仅只是标记一下GC Roots能直接关联到的对象,并且修改 TAMS 指针的值,让下一阶段用户线程并发运行时,能正确地在可用的 Region 中分配新对象。这个阶段需要停顿线程,但耗时很短,而且是借用进行Minor GC的时候同步完成的,所以G1收集器在这个阶段实际并没有额外的停顿。要达到GC与用户线程并发运行,必须要解决回收过程中新对象的分配,所以G1为每一个Region 区域设计了两个名为TAMS(Top at Mark Start)的指针,从 Region 区域划出一部分空间用于记录并发回收过程中的新对象。这样的对象认为它们是存活的,不纳入垃圾回收范围。

    并发标记:从GC Root开始对堆中对象进行可达性分析,递归扫描整个堆里的对象图,找出要回收的对象,这阶段耗时较长,但可与用户程序并发执行。当对象图扫描完成以后,并发时有引用变动的对象,这些对象会漏标,漏标的对象会被一个叫做SATB(snapshot at the beginning)算法来解决。

    最终标记:对用户线程做另一个短暂的暂停,用于处理并发阶段结后仍遗留下来的最后那少量的 SATB 记录(漏标对象)。

    筛选回收:负责更新Region的统计数据,对各个Region的回收价值和成本进行排序,根据用户所期望的停顿时间来制定回收计划,可以自由选择任意多个Region构成回收集,然后把决定回收的那一部分 Region 的存活对象复制到空的Region中,再清理掉整个旧 Region 的全部空间。这里的操作涉及存活对象的移动,是必须暂停用户线程,由多条收集器线程并行完成的。

    总结:并行与并发:G1 能充分利用多 CPU、多核环境下的硬件优势,使用多个 CPU(CPU 或者 CPU 核心)来缩短 Stop-The-World 停顿的时间,部分其他收集器 原本需要停顿 Java 线程执行的 GC 动作,G1 收集器仍然可以通过并发的方式让 Java 程序继续执行。

    分代收集:与其他收集器一样,分代概念在 G1 中依然得以保留。虽然 G1 可以不需要其他收集器配合就能独立管理整个 GC 堆,但它能够采用不同的方式 去处理新创建的对象和已经存活了一段时间、熬过多次 GC 的旧对象以获取更好的收集效果。

    空间整合:与 CMS 的“标记—清理”算法不同,G1 从整体来看是基于“标记—整理”算法实现的收集器,从局部(两个 Region 之间)上来看是基于“复 制”算法实现的,但无论如何,这两种算法都意味着 G1 运作期间不会产生内存空间碎片,收集后能提供规整的可用内存。这种特性有利于程序长时间运 行,分配大对象时不会因为无法找到连续内存空间而提前触发下一次 GC。

    追求停顿时间:-XX:MaxGCPauseMillis 指定目标的最大停顿时间,G1 尝试调整新生代和老年代的比例,堆大小,晋升年龄来达到这个目标时间。

    并发标记

    三色标记算法

    说到并发标记,就不能不提下并发标记中的三色标记算法,它是一种描述追踪式回收器的有效的办法,利用它可以推演回收器的正确性。

    在三色标记法之前有一个算法叫 Mark-And-Sweep(标记清除)。这个算法会设置一个标志位来记录对象是否被使用。最开始所有的标记位都是0,如果发现对象是可达的就会置为1,一步步下去就会呈现一个类似树状的结果。等标记的步骤完成后,会将未被标记的对象统一清理,再次把所有的标记位 设置成0方便下次清理。

    这个算法最大的问题是 GC 执行期间需要把整个程序完全暂停,不能异步进行 GC 操作。因为在不同阶段标记清扫法的标志位0和1有不同的含义,那么新增的对象无论标记为什么都有可能意外删除这个对象。对实时性要求高的系统来说,这种需要长时间挂起的标记清扫法是不可接受的。所以就需要一个算法来解决 GC 运行时程序长时间挂起的问题,那就三色标记法。三色标记最大的好处是可以异步执行,从而可以以中断时间极少的代价或者完全没有中断来进行整个GC。

    我们将对象分为三种类型:

    黑色:根对象,或者该对象与它的子对象都被扫描过。

    灰色:对本身被扫描,但是还没扫描完该对象的子对象。

    白色:未被扫描对象,如果扫描完所有对象之后,最终为白色的为不可达对象,既垃圾对象。

    “最粉嫩”的JVM垃圾回收器及算法,抗极限面试,倒背如流

    最后

    由于文案过于长,在此就不一一介绍了,这份Java后端架构进阶笔记内容包括:Java集合,JVM、Java并发、微服务、SpringNetty与 RPC 、网络、日志 、Zookeeper 、Kafka 、RabbitMQ 、Hbase 、MongoDB、Cassandra 、Java基础、负载均衡、数据库、一致性算法、Java算法、数据结构、分布式缓存等等知识详解。

    image

    本知识体系适合于所有Java程序员学习,关于以上目录中的知识点都有详细的讲解及介绍,掌握该知识点的所有内容对你会有一个质的提升,其中也总结了很多面试过程中遇到的题目以及有对应的视频解析总结。
    有需要的朋友可以点击这里免费获取

    image

    的提升,其中也总结了很多面试过程中遇到的题目以及有对应的视频解析总结。
    有需要的朋友可以点击这里免费获取

    [外链图片转存中…(img-tiyPU9Zr-1623933443006)]

    image

    展开全文
  • 什么是分布式锁?在回答这个问题之前,我们先回答一下什么是锁。 普通的锁,即在单机多线程环境下,当多个线程需要访问同一个变量或代码片段时,被访问的变量或代码片段叫做临界...在单机多线程的java程序中,我们可

    什么是分布式锁?在回答这个问题之前,我们先回答一下什么是锁。

    普通的锁,即在单机多线程环境下,当多个线程需要访问同一个变量或代码片段时,被访问的变量或代码片段叫做临界区域,我们需要控制线程一个一个的顺序执行,否则会出现并发问题。

    如何控制呢?就是设置一个各个线程都能看的见的标志。然后,每个线程想访问临界区域时,都要先查看标志,如果标志没有被占用,则说明目前没有线程在访问临界区域。如果标志被占用了,则说明目前有线程正在访问临界区域,则当前线程需要等待。

    这个标志,就是锁。

    在单机多线程的java程序中,我们可以使用堆内存中的变量作为标志,因为多线程是共享堆内存的,堆内存中的变量对于各个线程都是可见的。

    讲明白了普通的锁,接下来,我们再看看分布式锁。

    在分布式环境下,即多台计算机,每个计算机上会启动jvm执行程序的运行环境下,如果不同计算机上的线程想访问临界区域时,该怎么办呢?

    前面普通锁的使用堆内存中的变量的方式肯定不适用了。因为在多机环境下,某台计算机上的堆内存中的变量对于其他计算机上的线程肯定是不可见的。那么,根据锁的本质和原理,我们就要找到另外的对于多机上的线程都可见的标志,以它来作为锁,就可以了。这样的锁,就是分布式锁。

    当然,这里只是解释了什么是分布式锁,至于分布式锁该如何实现,其实有多重方式,关键在于要保证锁对多机上的程序是可见的即可。一些常用的实现方式是,使用redis,使用数据库等等。

    为什么要使用分布式锁

    我们在开发应用的时候,如果需要对某一个共享变量进行多线程同步访问的时候,可以使用我们学到的Java多线程的18般武艺进行处理,并且可以完美的运行,毫无Bug!

    注意这是单机应用,也就是所有的请求都会分配到当前服务器的JVM内部,然后映射为操作系统的线程进行处理!而这个共享变量只是在这个JVM内部的一块内存空间!

    分布式锁应该具备哪些条件

    在分析分布式锁的三种实现方式之前,先了解一下分布式锁应该具备哪些条件:

    • 1、在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行;

    • 2、高可用的获取锁与释放锁;

    • 3、高性能的获取锁与释放锁;

    • 4、具备可重入特性;

    • 5、具备锁失效机制,防止死锁;

    • 6、具备非阻塞锁特性,即没有获取到锁将直接返回获取锁失败。

    分布式锁的三种实现方式

    目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题。分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance),最多只能同时满足两项。”所以,很多系统在设计之初就要对这三者做出取舍。在互联网领域的绝大多数的场景中,都需要牺牲强一致性来换取系统的高可用性,系统往往只需要保证“最终一致性”,只要这个最终时间是在用户可以接受的范围内即可。

    在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务、分布式锁等。有的时候,我们需要保证一个方法在同一时间内只能被同一个线程执行。

    • 基于数据库实现分布式锁;

    • 基于缓存(Redis等)实现分布式锁;

    • 基于Zookeeper实现分布式锁;

    最后

    整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

    image

    image

    再免费分享一波我的Java专题面试真题+视频学习详解+Java进阶学习书籍

    题面试真题+视频学习详解+Java进阶学习书籍](https://gitee.com/vip204888/java-p7)**

    其实面试这一块早在第一个说的25大面试专题就全都有的。以上提及的这些全部的面试+学习的各种笔记资料,我这差不多来回搞了三个多月,收集整理真的很不容易,其中还有很多自己的一些知识总结。正是因为很麻烦,所以对以上这些学习复习资料感兴趣,

    展开全文
  • twemproxy - Redis 集群管理方案 Redis 官方版本支持的集群 ⑩Redis 集群(下) 数据结构 数据访问 新的节点 心跳机制 故障修复 故障修复的协议 数据迁移 总结 Redis 应用 Redis 应用 积分排行榜 分布式锁 消息...
  • 一、 热修复框架简介、 1、类替换、 2、so 替换、 3、资源替换、 4、全平台支持、 5、生效时间、 6、性能损耗、 7、总结、 二、 将 Java 字节码文件打包到 Dex 文件、
  • } /** Implemen 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》 【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享 ts Map.put and related methods. @param hash hash ...
  • 有需要的朋友戳这里即可免费获取 Java面试核心知识点 已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了,各位读者朋友们快来免费获取吧 img-81YcjkT6-1619753586959)] Java面试核心知识点 已经有读者...
  • ./gradlew clean nuwaQihooDebugPatch -P NuwaDir=/Users/jason/Documents/nuwa java verison must be same using android studio and terminal run following command to push patch.jar to sdcard. adb push ...
  • 注意标题 Java层原理和实现###在说到热修复之前,先简单说下android的apk生成的一个原理,我们都是知道android是Java语言写的,那么.java文件和.class文件大部分人应该都不会陌生,其实从Java文件到apk文件经历了...
  • 4大Java OSGi 框架比较

    2021-02-26 18:12:11
    身为一名Java开发人员,如果你还对OSGi结构一无所知,那你真的有点Out了。什么是OSGiOSGi的名称来源于其开源组织的名称Open Services Gateway initiative,OSGi是一个标准,它致力于提供给Java项目一个模块化的底层...
  • 所以一个class被一个ClassLoader实例加载过的话,就不能再被这个ClassLoader实例再次加载(这里的加载指的是,调用了defileClass(...)放...所与对于加载的话,只能重新创建一个ClassLoader,然后再去加载已经被加载...
  • 我们抛开网上的热修复框架不谈,我们来通过原理手动实现一个热修复工具,在撸码之前我们先通过一张图来了解热修复的流程.Android热修复ACCCB328-AF5C-4BD9-AD08-6F7D971BD74C.png聪明的和不聪明的都已经看出来,Android...
  • 原标题:全面了解Android热修复技术作者:赵裕, 腾讯移动客户端开发商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处。原文链接:http://wetest.qq.com/lab/view/338.htmlWeTest 导读本文探讨了Android...
  • Android热修复之—阿里热修复

    千次阅读 2021-11-09 17:20:20
    但是有了热修复,就省事多了,下面就阿里的热修复集成使用做下说明记录,还是比较简单的,主要是对官网的内容做一个整合,看起来更方便一些。 1、首先是要去阿里云官网注册一个账号,然后进入移动研发平台EMAS创建...
  • Android热修复原理

    2021-06-05 00:51:53
    类替换 类的加载机制: 类的加载ClassLoader(KitKat - 4.4.4_r1): parent为BootClassLoader,双亲(我理解为2个亲戚)委托机制,父加载器不是父类 Qzone和Tinker的热修复方案: 第二个参数是dex文件的保存目录 ...
  • 热修复方案按照是否必须重启 分为两类: 重启生效 / 即时生效。按照 实现方式可以分为3类: java层的实现 / native层的实现 / java native混合实现 阿里AndFix 方案(已弃用) AndFix 是 无需重启 ...
  • } } 源码路径 : libcore/dalvik/src/main/java/dalvik/system/BaseDexClassLoader.java 三、分析 PathDexList 源码 应用调用类 A.java 时 , 通过 PathClassLoader 调用 , PathClassLoader 没有实际内容 , 只是继承 ...
  • 游戏上线后难免会有功能性bug,这些bug很多只做...这里,我们来讨论一种java代码更新的实现。代码更-开源工具的实现1.Apache Tomcat 实现:Tomcat 动态 JSP 编译运行,这是一种阉割的加载。Tomcat 采用ecj ...
  • Android 热修复

    2021-06-03 11:47:10
    原标题:Android 热修复什么是热修复技术? AndFix框架替换原理和优势...什么是热修复技术?当我们已上线的app出现了非常影响用户使用的紧急Bug,通常情况下需要在第一时间线下修复该bug,然后经过一系列测试验证,...
  • AndroidHotFix什么是热修复热修复就是打补丁,当一个app已经上线之后如果出现一个严重的bug,这时再去打个打包发布版本是很费劲的,对用户来说再去下载一个新版本的体验也是不好的,所以就出现的热修复,也就是线打...
  • 一、修复包 Dex 文件准备、 二、Odex 优化、 三、Dex 文件拷贝、 四、 源码资源、
  • 第1章 class文件与dex文件解析本章通过从java最基本的class文件与android最基本的dex文件进行对比,并不借助IDE去生成及执行class与dex文件,通过讲解class与dex的手动生成,执行, 格式对比,让学生明白二者的相同...
  • 于是热修复技术应运而生,热修复技术一般的做法是应用启动的时候,主动去服务端查询是否有补丁包,有就下载下来,并在下一次启动的时候生效,这样就可以快速解决线上的紧急bug。 热修复的优势 无需重新打包...
  • 基于 安卓App热补丁动态修复技术介绍 github上开源了很多热修复的框架,大致有:原理在app打包的时候,阻止相关类被打上CLASS_ISPREVERIFIED标志;将存在bug的类打成一个patch.jar包;通过DexClassLoader从sdcard...
  • 热修复

    2021-03-21 15:23:52
    插件化Android热修复常用热修复解决方案实现原理什么是热修复?怎么进行热修复热修复需要解决的问题插桩式热修复落地怎么执行热修复(使用补丁包)?字节码插桩 Android热修复 常用热修复解决方案实现原理 什么是...
  • 实际上,在java程序中,热修复技术远比Android多的多。最原始的ClassLoader重新加载,还有最时髦的javassist或者asm工具包,甚至我们可以借助JNI、J2V8或者RPC(WebService,JSONRPC,dwr,Thrift)方式来实现功能的修复...
  • Android热修复实现

    2021-06-07 00:59:05
    热修复,即在没有更新apk的情况下,对一些bug打补丁,原理简单粗暴,就是替换,载入相关class之前把原来有bug的类替换掉,具体的实现过程比较抽象,这里不多加讨论。主要说说怎么快速上手。之前有一篇文章说到了自动...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,131
精华内容 9,652
关键字:

java热修复

java 订阅