【退役之重学Java】总结

带着一把伤心的吉他,我背井离乡
你居然想要成为别人的老婆
只有代码
不伤人心

一、深入理解 JVM 底层原理

  1. 运行时数据区域

JVM 运行时数据区域,分为栈区、堆区、方法区、程序计数器、本地方法栈
栈区存放的是变量的最浅层的值,如果是基本数据类型,存放的就是变量值,如果是引用数据类型,存放的就是其引用
堆区存放的是对象,如果对象有嵌套,那么采用链式存储
方法区里存放的是静态变量,方法字节码,类的结构信息,运行时常量池等

  1. 类加载机制

.java 文件编译产生 .class 文件,类加载器(由JVM 自身管理维护)将 ·.class` 文件加载到方法区中,生成对应的元数据
当代码运行到 new 创建对象时,就使用方法区内的元数据,在堆里创建对象

  1. GC
    1. 堆的分区

young: S1, S2, Edge,
old
2. 具体过程
对象在 Edge 中产生,当 Edge 快满了,就做一次 GC,将 存活的独享放入 S1,当 Edge 又一次满了,将 S1 和 Edge 做一次 GC,这样 S1 和 S2 交替和 Edge 做 GC
将存活六次以上的对象放入 old
当 old 快满了,做一次 full GC(整个 JVM 阻塞)

  1. JMM

每个线程都有自己的工作内存
线程间的变量传递通过主内存完成
工作内存存放的是变量的副本

  1. Synchronized
    Synchronized 是 Java 中用于实现同步的关键字。当一个方法或代码块被 Synchronized 修饰时,它将具有互斥访问的特性,即同一时间之允许一个线程访问该方法或代码块。这可以防止多个线程同时访问共享资源而导致数据不一致或竞态条件的问题。在 Java 中,Synchronized 关键字可以实现方法级别的同步,也可以用于同步代码块。通过 synchronize 关键字,可以确保线程安全性,避免数据竞争和并发问题。
  2. volatile
    volatile 是Java 中的一个关键字,用于修饰变量。当一个变量被声明为volatile 时,表示该变量是易变的,任何对该变量的读写操作都将直接在主内存中进行,二不会被缓存到线程的工作内存中。volatile 关键字可以确保多个线程之间对变量的可见性,即一个线程对 volatile 变量的修改对及其他县城是可见的。baolatile关键字适用于一些特定的场景,如标识位,但不能确保原子性,在多线程编程中,volatile 关键字可以用于确保线程的可见性,但对于符合操作,扔需要结合Synchronized 等机制来保证线程安全性。
  1. AQS
    抽象的队列同步器,是实现锁和其他同步器的重量级基础性框架。加了锁,多线程中就会有阻塞情况,有阻塞就需要排队,AQS 使用 CLH 来实现排队,有个 int 类型的状态标志变量,使用 volatile 修饰,让其多线程可见,使用 CAS 保证其原子性
  2. 线程池
    线程池是一种管理和复用线程的机制,可以提高多线程应用程序的性能和效率。在 Java 中,线程池是通过 java.util.concurrent.Executor 框架来实现的。线程池包含一组预先创建的此案成,这些县城可以重复使用来执行多个任务,而不需要频繁地创建和销毁线程,从而减少了线程创建和销毁的开销。
    Java 中的线程池有多种类型,常见的包括:
  1. Cached Thread Pool:根据需要创建新县城,并在线程空间一段时间后回收,适用于短生命周期的异步任务。
  2. Fixed Thread Pool:固定数量的线程池,适用于需要控制并发线程数量的场景。
  3. Single Thread Pool:只有一个工作线程的线程池,适用于需要按顺序执行任务的场景
  4. Scheduled Thread Pool:用于定期执行或周期性执行任务的线程池

JVM 调优

堆内存设置:通过调整-Xms和-Xmx参数来设置初始堆大小和最大堆大小,避免频繁的堆内存扩展和收缩。

垃圾回收器选择:根据应用程序的特性选择合适的垃圾回收器,如串行回收器、并行回收器、CMS回收器或G1回收器。

永久代大小设置:对于JDK8及更早版本,可以通过-XX:MaxPermSize参数来设置永久代大小,而对于JDK9及更新版本,永久代已被元数据区(Metaspace)取代,可以通过-XX:MaxMetaspaceSize参数来设置元数据区大小。

GC日志:通过启用GC日志(-Xloggc:filename)来监控垃圾回收情况,分析GC行为并进行优化。

调整新生代和老年代比例:通过调整-XX:NewRatio参数来设置新生代和老年代的比例,根据应用程序的内存使用情况进行调优。

并发标记:对于CMS和G1回收器,可以通过-XX:+UseConcMarkSweepGC和-XX:+UseG1GC来启用并发标记,减少停顿时间。

线程栈大小:根据应用程序的需求和线程数量,适当调整线程栈大小,避免栈溢出。

mysql 底层原理

  1. 事务隔离级别
  1. 读未提交

允许事务读取未提交的数据,会有很多问题:脏读,不可重复读,幻读

  1. 读提交

允许事务读取提交的数据,避免了脏读问题,但会有不可重复读,幻读问题

  1. 可重复读

通过快照机制,一定程度上解决了不可重复读和幻读问题,但没有彻底解决,是 mysql 默认的隔离级别

  1. 串行化

解决了不可重复读问题和幻读问题

  1. InnoDB 引擎
  1. 行级锁定
  2. MVCC 多版本并发控制
    ReadView 相当于一套坐标系统,记录当前事务在当前系统状态喜爱,事务所处的位置,以及此时系统中存在的事务,与其他事务在时间轴上的关系,依靠ReadView 机制,保证事务的准确回滚
    若 row_trx_id【在数据表的数据行中】小于 min_trx_id【事务ReadView中】,则此数据早已经存在,并由其他事务提交,则当前事务能读到【时间轴原理】
    如果当前数据的 row_trx_id 大于等于 max_trx_id,则表示在当前事务开启后,过了一段时间,体统中有新的事物开启了,并且新的事物修改了这行数据并提交了事务,所以当前事务肯定读不到。简而言之,row_trx_id 大于 max_trx_id 表示,当前事务开启之后又有一个事务开启了并修改了数据,所以当前事务读不到最新数据,只能沿着版本连往回查找自己能读到的版本数据。
    row_trx_id 在 m_ids 中,表示更新此数据的事务,在本事务创建时就已经存在并且处于未提交状态,既然未提交,那么本事务就无法读取到这个版本的数据
    如果不在m_ids 中,哈哈,那就说明,更改此数据的事务已经提交了,所以是能够读取到的。(读提交事务隔离级别下会出现此情况)
  1. 覆盖索引

覆盖索引是指一个索引包含了查询语句中涉及的所有字段,使得查询可以直接从索引中获取所需的数据,而不必再去访问实际的数据行。这样的索引能够减少数据库的IO操作,提高查询性能。覆盖索引通常用于查询中只涉及索引列的情况,通过避免访问实际数据行,加快查询速度。

  1. SQL 优化

索引优化:合理创建索引可以加快查询速度。确保在经常用于查询条件和连接条件的列上创建索引,避免过多或不必要的索引。

避免使用SELECT:只选择需要的列,避免使用SELECT * 查询所有列,可以减少数据传输和提高查询效率。

优化查询条件:避免在WHERE子句中使用函数或表达式,这会导致索引失效。尽量使用索引列进行条件过滤。

合理使用JOIN:选择合适的JOIN类型,如INNER JOIN、LEFT JOIN、RIGHT JOIN等,避免多表连接时产生笛卡尔积。

分页查询优化:对于大数据量的分页查询,使用合适的分页方式,如LIMIT offset, size或ROWNUM进行分页,避免全表扫描。

避免嵌套查询:尽量避免嵌套查询,可以考虑使用JOIN来替代子查询,提高查询效率。

定期分析执行计划:通过分析SQL执行计划,了解SQL语句的执行情况,优化慢查询,提高查询性能。

缓存查询结果:对于一些静态数据或频繁查询的数据,可以考虑使用缓存技术,减少数据库查询压力。

深入理解 Spring、Spring MVC、MybatisPlus、Spring Boot等开源框架的设计原理和底层架构

Spring框架:Spring框架是一个轻量级的Java开发框架,主要用于企业级应用程序的开发。其设计原理包括控制反转(IoC)和面向切面编程(AOP)。Spring的核心是IoC容器,通过IoC容器管理Java对象的生命周期和依赖关系。Spring还提供了许多模块,如Spring MVC用于构建Web应用程序,Spring JDBC用于数据库访问等。

Spring MVC:Spring MVC是Spring框架中的一个模块,用于构建基于MVC(Model-View-Controller)模式的Web应用程序。它包括前端控制器(DispatcherServlet)、处理器映射器(HandlerMapping)、处理器适配器(HandlerAdapter)等组件,通过这些组件实现请求的分发和处理。

MybatisPlus:MybatisPlus是MyBatis框架的增强工具,简化了MyBatis的使用。它提供了代码生成器、通用Mapper、分页插件等功能,帮助开发人员简化数据库操作和提高开发效率。

Spring Boot:Spring Boot是Spring框架的一个子项目,用于简化Spring应用程序的搭建和部署。Spring Boot提供了自动配置、嵌入式Web服务器、Actuator监控等功能,使得开发人员可以快速构建独立的、生产级别的Spring应用程序。

熟悉 Spring Cloud 微服务架构的设计原理,如服务注册、发现、降级、熔断、限流等

熟悉 Redis 核心数据使用场景

  1. String: 用于缓存 kv 键值对
  2. hash: 用于缓存对象,将对象转换为 json 形式,使用 RestTemplate 进行存储操作
  3. list:
    有序列表,这个可玩性很高,比如,可以通过list 存储一些 列表型的数据结构,蕾西粉丝列表,文章评论之类的东西,比如可以通过 lrange 命令,从某个元素开始读取多少个元素,尅基于 list 实现 分页查询,这是一个很棒的功能,基于 redis 实现简单的高性能分页,可以做类似微博那种下拉不断页的东西,一页一页走。
  4. set:
    无序列表,自动去重,可以做集合操作,查看共同粉丝等
  5. sorted set:
    去重但排序,可以自定义排序规则,比如排行榜。

缓存雪崩:大量数据同时失效,恰好遇上大量请求,导致去请求数据库了
解决方案:随机设置过期时间,避免大量数据同时失效
缓存穿透:某个或某些数据失效,恰好遇上大量请求,导致去请求数据库了
解决方案:使用互斥锁,对相同的请求,保证只有一个线程能访问数据库,其他线程等待结果,从缓存里获取,避免大量请求同时查询数据库

熟悉消息中间件

  1. 为什么要使用 消息中间件
    解耦,异步,削峰
  2. 如何保证高可用
    镜像集群模式
  3. 如何处理消息丢失问题
    生产者设置channel 为 confirm 模式
    MQ设置消息和队列持久化
    消费者手动确认
  4. 异步确认发布
    mq 维护一个 map(消息 ID+内容)
  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值