Skip to content

Latest commit

 

History

History
315 lines (209 loc) · 15.5 KB

作业注意事项.md

File metadata and controls

315 lines (209 loc) · 15.5 KB

作业注意事项

课程内容:

课程1、Java中的多线程与并发编程,某一线公司技术专家任富飞。 Part1:11-22,周一,18:45-19:45,主要内容:

Java多线程原理、各种锁的机制和应用(重量级锁、轻量级锁,可重入锁,偏向锁,公平锁,自旋锁,读写锁,乐观锁等)、四种线程池的原理、类型、配置参数和经验,Spring中线程池的应用,几种常用原子类的原理和使用场景。

Part2:11-26,周五,18:45-19:45,主要内容:AQS原理,三种常用并发工具类(CountdownLatch/Semaphore/CyclicBarrier)使用场景示例,线程安全编程和优化经验。

课程2、JVM的体系发展与优化经验,长亮科技北京平台团队负责人秦金卫。 Part1:11-29,周一,18:45-19:45,主要内容:JVM基础(字节码、内存模型、类加载器),各种不同的GC(串行GC、并行GC、CMS、G1、ZGC)的基本原理、常用参数和分析经验。 Part2:12-03,周五,18:45-19:45,主要内容:常见JVM命令行工具、可视化工具,以及高级工具的使用,通过GC日志、线程堆栈、飞行记录以及可视化分析等方式,实现JVM运行状态的分析和优化,常见的JVM问题排查。

课程3:事务原理与Spring事务机制,京东科技技术专家、Apache Shenyu项目负责人、《分布式事务原理与实战》作者肖宇。 Part1:12-06,周一,18:45-19:45,主要内容:关系数据库的事务机制和隔离级别(读未提交/读已提交/可重复读/串行化),Spring TX事务管理器的功能特性、使用方式。 Part2:12-10,周五,18:45-19:45,主要内容:Spring TX事务管理器的原理设计,相关的API和注解,传播特性,跟其他框架的集成,以及常见问题处理经验。

课程4、网络编程NIO与Netty实践,长亮科技北京平台团队负责人秦金卫。 Part1:12-13,周一,18:45-19:45,主要内容:Java网络编程模型,BIO/NIO/AIO,Reactor/Proactor网络模型,select/epoll机制; Part2:12-17,周五,18:45-19:45,主要内容:Netty的基本原理、常见用法与网络编程优化经验,Channel/EventLoop/Handler/Adapter

批阅原则:

    1. 认可与表扬认真学习的同学, 尽量给与正面反馈, 加油打气。
    1. 对一些问题和不足进行友善的提示, 都是成年人, 大家都要面子。
    1. 引导同学们学习各种进阶知识,拓展知识点。

简介:

铁锚:系统架构师,Java性能调优专家。
CSDN博客专家: https://renfufei.blog.csdn.net/
热爱程序开发和设计; 积极应对各种情境和挑战;
喜欢钻研新技术, 闲暇时喜欢翻译和分析英文文档/技术博客。
技术文章翻译仓库: https://github.com/cncounter/translation/

1周

提示:

  • 尝试自己从头绘制一幅图形,完善后向自己的同事或者朋友介绍,加深自己的印象和理解
  • JDK7及之前的版本是永久代, 对应到JDK8及以后是Meta区, class信息保存着方法区之中。
  • 常量池位于方法区/Meta区之中, Mata区归属于非堆内存(Non-Heap),不是堆外内存,也不是直接内存
  • CCS是开启指针压缩时才有的, 关闭指针压缩则此空间的大小为0
  • 直接内存(Direct)属于堆外内存,不属于非堆
  • 堆外内存可简单划分为(Direct, Native), 本次作业对应的所有内存区域都在JVM进程内部
  • JIT编译后的机器代码缓存到 code cache/非堆之中;
  • -Xmx-Xms 设置的是整个堆内存的大小,不是老年代。
  • 和年轻代(young/nursery)不一样,新生代实际上是 Eden 区, 由 -Xmn 与存活区的比例来控制
  • 栈内存不在堆内存之中,也不属于堆外内存,是一个独立的部分。
  • 注意区分线程栈以及内部的栈帧结构; -Xss 控制单个线程的栈空间最大大小
  • 编码风格: 建议增加中间变量,增加可读性,可读性和可维护性是构建大型复杂系统的基石。
  • 注意关闭输入输出流,最好是谁控制着打开的,就由谁在同一个方法内将其关闭。
  • 在开发中可以打断点调试,查看class加载时的调用栈和调用关系。
  • 作业参考链接: https://github.com/JavaCourse00/JavaCourseCodes/tree/main/01jvm
  • 《Java资料链接汇总》: https://shimo.im/docs/YGjGgTWwgD6V3wkp/
  • 秦老师推荐书单: https://kimmking.github.io/
  • 铁锚的翻译仓库: https://github.com/cncounter/translation/

2周

认真完成作业和整理笔记

  • 在finally中关闭输入输出流是一个好习惯; 每次提交认真写提交日志也是一个好习惯。

  • 分辨HTTP1.0与HTTP1.1的区别;

  • 可以尝试分析G1中混合模式 mixed GC的威力; 选择哪种垃圾收集器,主要考虑的是业务特征(实时/非实时),跟内存大小关系并不太大。

  • 与外部系统的交互,在允许的情况下,最好是输出详细的交互日志, 包括: [uri,请求参数/body,响应信息,耗时信息]等等。

  • 性能测试时需要排除各种干扰,只改变单个变量然后进行对比,例如: 客户端线程数,并发连接数/用户数,去除随机数的随机性(指定random种子)等等。

  • 编码风格: 建议增加中间变量,增加可读性,可读性和可维护性是构建大型复杂系统的基石。

  • 建议: 适当使用一些通用工具类,例如 apache的commons-io等等,里面的 IOUtils之类的工具很好用。

  • 建议:趁机使用和学习 markdown 文件,做好目录和链接引用,在互联网上很方便,而且可以导出为各种格式。常用工具: Typora 等。

  • 往期优秀作业链接: https://github.com/lw1243925457/JAVA-000

  • 作业参考链接: https://github.com/JavaCourse00/JavaCourseCodes/tree/main/02nio

  • 《Java资料链接汇总》: https://shimo.im/docs/YGjGgTWwgD6V3wkp/

  • 秦老师推荐书单: https://kimmking.github.io/

  • 铁锚的翻译仓库: https://github.com/cncounter/translation/ 【可以找感兴趣的技术文章看看】

3周

提示:

  • 梳理一下网关需要执行的操作和处理逻辑,对比一下Nginx是怎么处理的。

  • 使用自己的包名, 来标识自己的作品

  • 通过 .gitignore 文件来忽略某些文件。

  • 性能测试时需要排除各种干扰,只改变单个因素, 然后进行对比,例如: 客户端线程数,并发连接数/用户数等等。

  • 不要用实例变量来存储某些信息,避免多线程环境下的出错,以及多次请求互相污染。

  • 适当增加必要的注释来增加可读性,说明某段代码的作用和实现逻辑,但不要太多或者太少 ^_^

  • 响应头之中也可以加上某些 X-开始的header,方便调试和追踪,更像一个网关

  • 响应消息写入完成后, 记得 flush 和 close。推荐在finally中关闭,避免中间过程抛异常导致资源不关闭,引发内存泄漏, 在高并发场景中造成问题。

  • 可以了解一下 ByteArrayOutputStream,挺好用.

  • 注意Java输入流的特征,以及基于buffer的读取和写入方法, 不要写多了, 也不要读漏了.

  • 注意区分 HTTP1.0 和 HTTP1.1的差异

  • 所有使用 getBytes 和String相关的方法都需要指定具体的编码, 避免默认语言问题。

  • 往期优秀作业链接: https://github.com/lw1243925457/JAVA-000

  • 《Java资料链接汇总》: https://shimo.im/docs/YGjGgTWwgD6V3wkp/

  • 秦老师推荐书单: https://kimmking.github.io/

  • 铁锚的技术文章翻译: https://github.com/cncounter/translation/

4周

笔记整理。

提示:

  • 请复习创建线程池的方法, 分辨 cached 方式的线程池是先加队列还是先创将cache线程? 提示: core,queue,cache,reject
  • 多线程代码中,共享状态的变量需要特殊处理,比如使用 volatile 来强制从内存读取最新值,或者直接使用原子类来保存。
  • 思考各种线程协同方式的本质是什么?
  • 想想怎么让线程处于各种不同的状态, 以及怎么获取这些状态信息
  • 线程最重要的属性是哪些?
  • 尝试使用反射方式在main方法中将这些方法全部调用起来
  • 往期优秀作业链接: https://github.com/lw1243925457/JAVA-000
  • 《Java资料链接汇总》: https://shimo.im/docs/YGjGgTWwgD6V3wkp/
  • 秦老师推荐书单: https://kimmking.github.io/
  • 铁锚的技术文章翻译: https://github.com/cncounter/translation/

并发相关的面试题,在【第一课】【预习资料以及环境准备】里面的压缩包之中。

5周

提示:

6 周

提示:

通过上周的课程学习, 经过本次作业实践, 请思考以下问题:

  1. MySQL数据库中, int(2) 和 int(10) 有什么区别?
  2. 订单表中的【创建时间】字段采用以下类型, 各自的优缺点是什么?
  • A、 datetime
  • B、 timestamp
  • C、 bigint
  • D、 int
  • E、 varchar

7周

提示: 0. 想一想限制数据库TPS的瓶颈点有哪些? 分析整个请求执行链路上的各个环节, 并尝试解决各种环节下的瓶颈。

  1. 可以使用aop来做动态切换,根据sql类型来做数据源切换不能很好支持强制走主库查询的情况
  2. 注解时考虑使用数据源名称,而不是master-slave;应用内可能有多个数据库组(比如账号数据一套主从,订单数据一套主从)
  3. 考虑多个从库的情况
  4. 注解加到mapper(dao层),而不是service层;具体实现可以考虑各种情景确定是否采用注解赋予的建议。
  5. aop可以看下AbstractPointcutAdvisor
  6. 《Java资料链接汇总》: https://shimo.im/docs/YGjGgTWwgD6V3wkp/
  7. 可以参考的作业实现:
  1. 秦老师推荐书单: https://kimmking.github.io/
  2. 铁锚的技术文章翻译: https://github.com/cncounter/translation/

8周

提示:

9周

提示:

10周

请思考以下问题:

11周

提示:

  1. 锁的实现需要考虑加锁时的失败自动重试机制以及自动过期
  2. 正常释放锁时要判断lock值是否一致,最好是通过 lua 脚本来保证操作的原子性。
  3. 推荐使用 redisson,封装的 api 简单易用。
  4. 分布式减库存操作需要加锁,而且需要在库存上加锁,不能使用 userId 等
  5. 推荐阅读 《Redis 操作手册; 基于Redis 5版本,微信读书可以免费阅读
  6. 往期优秀作业链接: https://github.com/lw1243925457/JAVA-000
  7. 《Java资料链接汇总: https://shimo.im/docs/YGjGgTWwgD6V3wkp/
  8. 秦老师推荐书单: https://kimmking.github.io/
  9. Redis集群入门简介[系列文章]: https://github.com/cncounter/translation/tree/master/tiemao_2021/31_redis_cluster
  10. 免费好用的Redis图形界面客户端: Another: https://gitee.com/qishibo/AnotherRedisDesktopManager/releases

12周

锻炼动手能力, 加油!

提示:

  1. 尝试分析一下本地缓存与分布式缓存的适用场景。
  2. 尝试分析缓存数据的特征: 变化频率, 数据量, 不一致的容忍时间, 网络带宽占用压力,延迟以及并发请求数...
  3. 总结消息队列的优缺点: 异步解耦、削峰填谷、增强并发性能和横向扩展能力...

13周

请思考以下问题:

14周

毕业总结:

恭喜你完成学业,祝未来的工作和学习旅程越来越顺利! 认真总结,这份坚持和努力值得肯定。 提示: 很多东西用自己的语言来转述一遍,收获和理解会更深刻。 聚沙成塔的同时,也需要梳理知识体系,形成自己的核心脉络与钢筋铁骨。