03 2023 档案
摘要:1. 针对相同的表进行的连接 1.1. 相同的表的自连接和不同表间的普通连接并没有什么区别,自连接里的“自”这个词也没有太大的意义 1.2. 与多表之间进行的普通连接相比,自连接的性能开销更大 1.2.1. 特别是与非等值连接结合使用的时候 1.2.2. 用于自连接的列推荐使用主键或者在相关列上建立
阅读全文
摘要:1. 三值逻辑 1.1. 真 1.1.1. true 1.2. 假 1.2.1. false 1.3. 不确定 1.3.1. unknown 2. 两种NULL 2.1. 未知”(unknown) 2.1.1. 不知道戴墨镜的人眼睛是什么颜色 2.1.2. 虽然现在不知道,但加上某些条件后就可以知道
阅读全文
摘要:1. 概述 1.1. SQL-92标准里加入的最有用的特性 1.2. 写法 1.2.1. 简单CASE表达式 CASE sex WHEN '1' THEN ’男’ WHEN '2' THEN ’女’ ELSE ’其他’ END 1.2.1.1. 写法简单,但能实现的事情比较有限 1.2.2. 搜索C
阅读全文
摘要:1. 响应式编程 1.1. 使用基于事件的范式处理异步数据流 1.2. 和异步编程提供了相同的性能优势 1.3. 能够扩展程序(特别是扩展I/O)以处理很多连接和数据源 2. 非阻塞I/O 2.1. 有效扩展服务器的基础 2.2. 允许服务器用相对较少的线程处理相对较多的连接 2.2.1. 传统的服
阅读全文
摘要:1. JVM线程优化 1.1. 当空间不足时,可以调整线程使用的内存 1.2. 每个线程都有一个原生栈,操作系统会在这里存储线程的调用栈信息 1.3. 原生栈的大小是1 MB 1.3.1. 32位的Windows JVM原生栈大小是320KB 1.3.2. 在64位的JVM中,通常不会修改这个值 1
阅读全文
摘要:1. 同步 1.1. 代码块对一组变量的访问看上去是串行的:每次只有一个线程可以访问内存 1.1.1. 由synchronized关键字保护的代码块 1.1.2. 用java.util.concurrent.lock.Lock类的实例保护的代码 1.1.3. java.util.concurrent
阅读全文
摘要:1. 线程和硬件 1.1. 给CPU增加超线程并不能使应用程序性能翻倍 2. 线程池 2.1. 任务被提交到一个队列(可能有不止一个队列),然后一定数量的线程会从队列中取出任务并执行它们 2.2. 线程池的大小对获取最佳性能至关重要 2.2.1. 在某些情况下,过大的线程池会对性能造成损害 2.3.
阅读全文
摘要:1. 高品质的代码 1.1. 性能(Performance) 1.1.1. 只执行需要的操作,而且执行迅速 1.1.2. 不会使系统陷入停顿 1.2. 可用性(Availability) 1.2.1. 持续在所需的性能水平上保持可用 1.2.2. Topic1 1.3. 安全性(Security)
阅读全文
摘要:1. 理解可变性 1.1. 理解测试结果如何随时间变化 1.2. 可以通过多次运行测试后取平均值来解决 1.3. 因代码改进而进行的测试叫作回归测试(regression testing) 1.3.1. 原本的代码叫作基线(baseline) 1.3.2. 新的代码叫作样本(specimen) 1.
阅读全文
摘要:1. 应用程序级别代码坏味道 1.1. 布尔盲点 1.1.1. 由于函数使用布尔值而导致的信息缺失 1.1.2. 解决方案是将布尔替换为枚举类型 1.2. 组合爆炸 1.2.1. 不同的代码使用不同的参数组合来执行同一件事情的产物 1.2.2. 解决方案使用泛型 1.3. 人为复杂性 1.3.1.
阅读全文
摘要:1. 测试真实的应用程序 1.1. 应该以实际产品的使用方式进行测试 1.2. 所有的基准测试通常都包括一个预热期,在这期间,JVM可以将代码编译到最佳状态 1.3. 微基准测试(microbenchmark) 1.3.1. 通过测量一小部分代码的性能来确定多种实现中哪个最好 1.3.2. 必须读取
阅读全文
摘要:1. 核心关注点 1.1. 开发软件的原因 2. 切面关注点 2.1. 所有的代码领域都需要处理相关的问题 3. 结构化模式 3.1. 装饰器模式 3.1.1. 可以在现有对象上添加新的功能,而不改变其结构 3.2. 代理模式 3.2.1. 所提供的对象可以替代客户端使用的实际服务对象 4. 使用P
阅读全文
摘要:1. Java飞行记录器 1.1. Java Flight Recorder,JFR 1.1.1. 最初是BEA公司的JRockit JVM的功能 1.1.2. 在JDK 8中,只有Oracle JVM支持JFR 1.1.3. 在JDK 11中,JFR可以在开源JVM中使用 1.2. JFR数据是J
阅读全文
摘要:1. 组织类 1.1. 每一个接口、类、结构体和枚举均应当拥有其自身的独立源文件 1.2. Pascal命名方法命名命名空间 1.3. 测试类定义在独立的程序集 1.3.1. 不同程序集的测试放在不同程序集 1.3.2. 程序集名称的最后附加Tests命名空间 1.4. 公司名称、产品名称和缩写词汇
阅读全文
摘要:1. 性能分析工具 1.1. 必须有足够大的堆来处理数据 1.2. 运行性能分析工具时开启并发GC算法 1.3. 不合时宜的Full GC暂停会导致缓冲区的数据溢出 1.4. 性能分析的一个缺陷就是在应用程序中引入测试会改变其性能 1.5. 在工作时要“附加”到被分析的应用程序上 1.5.1. 通过
阅读全文
摘要:1. 编码原则 1.1. SOLID原则 1.1.1. 单一职责原则(Single Respon-sibility Principle) 1.1.1.1. 类和方法应当仅具备单一职责。所有组合为单一职责的元素应当组合在一起并进行封装。 1.1.2. 开闭原则(Open-Closed Principl
阅读全文
摘要:1. 性能优化是围绕工具展开的 1.1. 最重要的工具大都是Java开发工具包(JDK)自带的 1.2. 查看应用程序性能时,首先应该考察的就是CPU时间 2. 操作系统工具 2.1. Unix系统 2.1.1. sar(System Accounting Report)及其组成工具 2.1.2.
阅读全文
摘要:1. 巨型对象 1.1. humongous object 1.2. 大于等于区域一半大小的对象 1.3. 巨型对象被直接分配在老年代,所以它在新生代回收期间不会被释放 1.4. G1区域的大小是2的幂,最小值是1 MB 1.5. 如果堆的最大值和初始值差别很大,就会有过多的G1区域,这种情况下应该
阅读全文
摘要:1. Survivor空间 1.1. 新生代被划分为两个Survivor空间和一个Eden空间的原因 1.1.1. 刚刚被创建并且还在使用中,所以不能被回收,但它们的寿命并没有长到足以进入老年代 1.1.2. 仍在新生代中的对象有额外的机会被回收,而不是晋升到(并填满)老年代 1.2. 首次新生代回
阅读全文
摘要:1. G1垃圾回收器 1.1. 垃圾优先(garbage first) 1.2. 在堆内离散的区域上进行操作 1.2.1. 默认大约有2048个 1.2.2. 代的区域不需要是连续的 1.2.3. 可能属于老年代 1.2.3.1. 并发后台线程寻找没有被引用的对象时,一些区域会比其他区域有更多的垃圾
阅读全文
摘要:1. 回收 1.1. 找到不使用的对象 1.2. 释放它们的内存 1.3. 压缩堆 1.4. 合在一起称为回收 2. Throughput回收器 2.1. 工作细节比较简单 2.1.1. 可以在同一个GC周期内完成回收 2.1.2. 在单次操作过程中回收新生代或老年代 2.2. Minor GC 2
阅读全文
摘要:1. 元空间(metaspace) 1.1. 当JVM加载类时,它必须记录这些类的某些元数据,这些数据占据的一个单独的堆空间,即元空间 1.2. 元空间里的信息只在编译器和JVM运行时使用,它所保存的数据被称为类元数据(class metadata) 1.2.1. 对于终端用户,元空间是不透明的 1
阅读全文
摘要:1. 调整堆的大小 1.1. 随着堆的大小增加,停顿的持续时间也会增加 1.2. 停顿发生的频率确实会降低,但是停顿的持续时间会拖慢整体性能 1.3. 操作系统进行的交换对JVM是不公开的 1.3.1. 操作系统要将数据从磁盘交换到RAM,这是一个代价高昂的操作 1.4. 首要规则是设定堆的大小永远
阅读全文
摘要:1. GC触发条件 1.1. 当新生代满的时候 1.1.1. Minor GC会被触发 1.2. 当老年代满的时候 1.2.1. Full GC会被触发 1.3. 当堆快要填满时 1.3.1. 并发GC(如果适用)会被触发 2. 强制开启GC 2.1. System.gc()方法 2.1.1. 总是
阅读全文
摘要:1. 垃圾回收器 1.1. 对象可以在被需要时创建,不再使用时由JVM自动回收 1.2. GC是查找不再使用的对象,然后回收这些对象相关内存的过程 1.2.1. 找到不使用的对象、回收其内存、压缩堆内存 1.3. 优化垃圾回收器比跟踪指针引起的bug要容易得多(且耗时更少) 1.4. VM必须定期搜
阅读全文
摘要:1. 对象重用 1.1. 原因 1.1.1. 许多对象的初始化成本很高,权衡了增加的GC时间之后,还是重用对象的效率更高 1.2. 只适用于初始化成本很高且数量较少的一组对象 1.2.1. 被重用的对象会在堆中停留很长时间。如果堆中有大量对象,创建新对象的空间就更少了,因此GC操作会更频繁。 1.3
阅读全文
摘要:1. 减少内存使用 1.1. 减少堆内存的使用 1.1.1. 使用更少的内存意味着堆被填满的频率会降低,需要的GC周期会更少,其效果也可以成倍增强 1.1.2. 更少的新生代回收意味着对象的晋升年龄增加的频率降低 1.1.3. 对象晋升到老年代的可能性也降低了 1.1.4. Full GC周期(或者
阅读全文
摘要:1. 通用规则 1.1. 不要假设问题出在堆空间 1.2. 谨慎地创建对象并尽快丢弃它们 1.3. 使用更少的内存是提高垃圾回收器效率最好的办法 1.3.1. 减少内存使用是一个重要的目标 1.3.2. 和大多数性能优化主题一样,将精力集中于最大化利用现有内存会更有帮助 1.4. 对象重用方式 1.
阅读全文
摘要:1. 术语 1.1. 堆指代Java堆 1.2. 原生内存指代JVM的非堆内存 1.2.1. 包括C堆 1.2.2. 非堆内存就是原生内存 1.2.3. 一些常见的JDK类常常会使用原生内存,请确保正确使用这些类 1.3. 一个应用程序总的内存占用 1.3.1. JVM使用的原生内存和堆内存的总和
阅读全文
摘要:1. CPU相关代码 1.1. Advanced Vector Extensions 1.1.1. AVX 1.1.2. 2013年,Intel为Haswell以及之后的芯片引入了AVX2 1.1.3. 2016年,Intel又引入了AVX-512指令 1.1.4. JDK 8不支持这些指令 1.1
阅读全文
摘要:1. 编译阈值 1.1. 一旦代码执行到一定次数,就达到了它的编译阈值,编译器就会认为它有足够的信息来编译代码 1.2. 在当前的JVM中,优化阈值的意义不大 1.2.1. 从JDK 7以及更早期遗留下来的 1.3. -XX:CompileThreshold=N 1.3.1. 当禁用分层编译时有效
阅读全文
摘要:1. 基本信息 Java 实战(第二版)Modern Java in Action, 2nd Edition [英] 拉乌尔–加布里埃尔·乌尔玛(Raoul-Gabriel Urma),[意] 马里奥·富斯科(Mario Fusco),[英] 艾伦·米克罗夫特(Alan Mycroft) 著,陆明刚
阅读全文
摘要:1. 回头看 日更坚持了59天,精读完《Java8函数式编程》《读Java实战(第二版)》这两本书,《读Java性能权威指南(第2版)》精读进行中。当月码字42413字,略低于上月千字(43690字),考虑到2月只有28天,少1月3天,这么算下来,日均码字数1514字略高于1月1409字,累计码字8
阅读全文
摘要:1. 概览 1.1. 即时编译器是Java虚拟机的核心 1.1.1. just-in-time compiler,简称JIT compiler 1.1.2. 即时编译器会频繁地使用寄存器 1.2. 编译型语言 1.2.1. 程序是以二进制(编译后的)代码的形式发布的 1.2.1.1. 汇编代码是针对
阅读全文
摘要:1. JPA 1.1. 性能直接受底层JDBC驱动性能的影响 1.2. 性能提升是通过改变实体类的字节码来实现的 1.2.1. 在类加载到JAR文件或者由JVM运行之前增强字节码的方法 1.2.1.1. 在编译过程中完成的 1.2.1.2. 在实体类编译完成后,它们会被传递给一个特定实现的后置处理器
阅读全文
摘要:1. 影响数据库应用程序性能最重要的因素 1.1. JDBC驱动 1.1.1. JPA底层使用了JDBC 2. 瘦驱动 2.1. 为了让Java应用程序的内存占用很小 2.2. 依赖数据库服务器来完成更多的处理工作 3. 胖驱动 3.1. 工作从数据库移至Java应用程序 3.2. 进行更多处理、消
阅读全文