diff --git a/01jvm/jvm/TestMem.java b/01jvm/jvm/TestMem.java index cb915121..05396141 100644 --- a/01jvm/jvm/TestMem.java +++ b/01jvm/jvm/TestMem.java @@ -6,6 +6,8 @@ public static void main(String[] args) { int[][] arr2 = new int[128][2]; int[][][] arr3 = new int[64][2][2]; - System.out.println(); + System.out.println(arr1); + System.out.println(arr2); + System.out.println(arr3); } } diff --git "a/\344\275\234\344\270\232\346\263\250\346\204\217\344\272\213\351\241\271.md" "b/\344\275\234\344\270\232\346\263\250\346\204\217\344\272\213\351\241\271.md" deleted file mode 100644 index 46e0b9aa..00000000 --- "a/\344\275\234\344\270\232\346\263\250\346\204\217\344\272\213\351\241\271.md" +++ /dev/null @@ -1,315 +0,0 @@ -# 作业注意事项 - - -> 课程内容: - -课程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. 认可与表扬认真学习的同学, 尽量给与正面反馈, 加油打气。 -- 2. 对一些问题和不足进行友善的提示, 都是成年人, 大家都要面子。 -- 3. 引导同学们学习各种进阶知识,拓展知识点。 - - -简介: - -``` -铁锚:系统架构师,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资料链接汇总》: -- 秦老师推荐书单: -- 铁锚的翻译仓库: - - - -## 2周 - -认真完成作业和整理笔记 - -- 在finally中关闭输入输出流是一个好习惯; 每次提交认真写提交日志也是一个好习惯。 -- 分辨HTTP1.0与HTTP1.1的区别; -- 可以尝试分析G1中混合模式 mixed GC的威力; 选择哪种垃圾收集器,主要考虑的是业务特征(实时/非实时),跟内存大小关系并不太大。 -- 与外部系统的交互,在允许的情况下,最好是输出详细的交互日志, 包括: [uri,请求参数/body,响应信息,耗时信息]等等。 -- 性能测试时需要排除各种干扰,只改变单个变量然后进行对比,例如: 客户端线程数,并发连接数/用户数,去除随机数的随机性(指定random种子)等等。 -- 编码风格: 建议增加中间变量,增加可读性,可读性和可维护性是构建大型复杂系统的基石。 -- 建议: 适当使用一些通用工具类,例如 apache的commons-io等等,里面的 IOUtils之类的工具很好用。 -- 建议:趁机使用和学习 markdown 文件,做好目录和链接引用,在互联网上很方便,而且可以导出为各种格式。常用工具: Typora 等。 - -- 往期优秀作业链接: -- 作业参考链接: -- 《Java资料链接汇总》: -- 秦老师推荐书单: -- 铁锚的翻译仓库: 【可以找感兴趣的技术文章看看】 - - - - - -## 3周 - - -提示: - -- 梳理一下网关需要执行的操作和处理逻辑,对比一下Nginx是怎么处理的。 -- 使用自己的包名, 来标识自己的作品 -- 通过 .gitignore 文件来忽略某些文件。 -- 性能测试时需要排除各种干扰,只改变单个因素, 然后进行对比,例如: 客户端线程数,并发连接数/用户数等等。 -- 不要用实例变量来存储某些信息,避免多线程环境下的出错,以及多次请求互相污染。 -- 适当增加必要的注释来增加可读性,说明某段代码的作用和实现逻辑,但不要太多或者太少 ^_^ -- 响应头之中也可以加上某些 X-开始的header,方便调试和追踪,更像一个网关 -- 响应消息写入完成后, 记得 flush 和 close。推荐在finally中关闭,避免中间过程抛异常导致资源不关闭,引发内存泄漏, 在高并发场景中造成问题。 -- 可以了解一下 ByteArrayOutputStream,挺好用. -- 注意Java输入流的特征,以及基于buffer的读取和写入方法, 不要写多了, 也不要读漏了. -- 注意区分 HTTP1.0 和 HTTP1.1的差异 -- 所有使用 getBytes 和String相关的方法都需要指定具体的编码, 避免默认语言问题。 - -- 往期优秀作业链接: -- 《Java资料链接汇总》: -- 秦老师推荐书单: -- 铁锚的技术文章翻译: - - - -## 4周 - -笔记整理。 - -提示: -- 请复习创建线程池的方法, 分辨 cached 方式的线程池是先加队列还是先创将cache线程? 提示: core,queue,cache,reject -- 多线程代码中,共享状态的变量需要特殊处理,比如使用 volatile 来强制从内存读取最新值,或者直接使用原子类来保存。 -- 思考各种线程协同方式的本质是什么? -- 想想怎么让线程处于各种不同的状态, 以及怎么获取这些状态信息 -- 线程最重要的属性是哪些? -- 尝试使用反射方式在main方法中将这些方法全部调用起来 -- 往期优秀作业链接: -- 《Java资料链接汇总》: -- 秦老师推荐书单: -- 铁锚的技术文章翻译: - -并发相关的面试题,在【第一课】【预习资料以及环境准备】里面的压缩包之中。 - - - - -## 5周 - - -提示: -- 枚举实际上是可以通过反射往里面加东西的,当然,在编译期间不可见,属于运行时hack修改。 -- 反编译工具可以使用: jd-gui, 或者 jclasslib -- 往期优秀作业链接: -- 《Java资料链接汇总》: -- 秦老师推荐书单: -- 深入系列: InnoDB存储引擎: - - - - -## 6 周 - -提示: -- 建议: 在Table级别使用 utf8mb4 字符集 -- 设计合理的SQL语句和注释,并通过Git形成版本化。 -- 使用BIGINT来存储Long类型的时间戳timeMillis,减少对时区的依赖。 -- 可以根据业务需要, 增加联合索引。 -- 可以结合自己在网上购物的经历, 思考如何设计订单表。 -- 往期优秀作业链接: -- 《Java资料链接汇总》: -- [InnoDB的锁和事务模型](https://github.com/cncounter/translation/blob/master/tiemao_2020/44_innodb-storage-engine/14.7_innodb-locking-transaction-model_CN.md) - - -通过上周的课程学习, 经过本次作业实践, 请思考以下问题: -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资料链接汇总》: -7. 可以参考的作业实现: - - - - -8. 秦老师推荐书单: -9. 铁锚的技术文章翻译: - - - -## 8周 - - -提示: - -- 想想什么情况下适合使用分表,什么情况下适合使用分库,各有什么优缺点? -- 注意分库与分表的表达式, 避免分布不均匀或者导致空表 -- 适当增减注释来说明每一块代码的意图。 -- 《Java资料链接汇总》: -- 秦老师推荐书单: -- 铁锚的技术文章翻译: -- CSDN博客: https://renfufei.blog.csdn.net/ -- 优秀作业参考: - - - - - - - - - - -## 9周 - - -提示: - -- id 可以使用 BIGINT(20), 更加专业一些。 -- 根据实际情况, 可以在某些情况下, 使用 BIGINT 来存储金额,单位则约定为"分", 由程序进行换算, 避免程序层面出现精度丢失。 -- 如果使用BigDecimal计算, 则一定要指定精度和四舍五入规则; 并且与数据库字段的精度对应。 -- 《Java资料链接汇总》: -- 往期优秀作业链接: -- 李睿老师的完整RPC实现: -- 秦老师推荐书单: -- 铁锚的技术文章翻译: - - - - - -## 10周 - - -请思考以下问题: - -- 通过这个作业有哪些收获? -- RPC通信中有哪些需要注意的问题? -- 序列化和反序列化框架有哪些?需要注意什么? -- 往期优秀作业链接: -- 秦老师推荐书单: -- Java资料链接汇总: -- 李睿老师的完整实现: -- 铁锚的技术文章翻译: - - - -## 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. 总结消息队列的优缺点: 异步解耦、削峰填谷、增强并发性能和横向扩展能力... - -- 往期优秀作业链接: -- 《Java资料链接汇总: -- Redis集群入门教程(中文翻译): -- 免费好用的Redis图形界面客户端: Another: https://gitee.com/qishibo/AnotherRedisDesktopManager/releases - - - - -## 13周 - - -请思考以下问题: - -- 生产端如何保证消息的顺序性? -- 消费端如何保证消息的顺序性? -- 如何防止消息的重复消费? -- 如何防止消费失败或者消息丢失? -- 幂等性是怎么回事?如何保证?在哪个层级保证? - -- 往期优秀作业链接: -- 《Java资料链接汇总》: -- 秦老师推荐书单: https://kimmking.github.io/ -- 铁锚的翻译仓库: - - - -## 14周 - - -- 往期优秀作业链接: -- 《Java资料链接汇总: -- 秦老师推荐书单: https://kimmking.github.io/ -- 铁锚的翻译仓库: - - - -## 毕业总结: - -恭喜你完成学业,祝未来的工作和学习旅程越来越顺利! -认真总结,这份坚持和努力值得肯定。 -提示: 很多东西用自己的语言来转述一遍,收获和理解会更深刻。 聚沙成塔的同时,也需要梳理知识体系,形成自己的核心脉络与钢筋铁骨。