合集-读Java性能权威指南(第2版)
摘要:1. 基本信息 Java性能权威指南(第2版) Java Performance,Second Edition [美]斯科特·奥克斯(Scott Oaks) 人民邮电出版社,2022年4月出版 1.1. 读薄率 书籍总字数516千字,笔记总字数43820字。 读薄率43820÷516000≈8.49
阅读全文
摘要:1. JVM调优标志 1.1. 布尔标志和附带参数的标志 1.2. 布尔标志使用的语法 1.2.1. -XX:+FlagName表示开启 1.2.2. -XX:-FlagName表示关闭 1.3. 附带参数的标志使用的语法 1.3.1. -XX:FlagName=something,表示设置Flag
阅读全文
摘要:1. 压缩字符串 1.1. Java 6 1.2. 实验性 1.3. compressed string 2. 字符串 2.1. Java 8 2.2. 所有都会编码为16位字符数组 3. 紧凑字符串 3.1. Java 11 3.2. compact string 3.3. 8位字节数组 3.3.
阅读全文
摘要:1. 缓冲I/O 1.1. 对于文件和套接字,压缩和字符串编码的操作,必须适当地对I/O进行缓冲 1.1.1. 两个流操作的是字节块(来自缓冲流)而不是一系列的单字节(来自ObjectOutputStream),它们会运行得更好 1.2. InputStream.read() 1.3. Output
阅读全文
摘要:1. 异常 1.1. 代码应该仅在发生意料之外的事情时抛出异常 1.1.1. 防御性编程性能好 1.2. 异常的处理成本未必很高 1.2.1. 应该只在适当的时候使用 1.2.2. 栈越深,处理异常的成本就越高 1.3. 对于频繁创建的系统异常,JVM会优化获取栈轨迹的性能开销 1.4. 在异常中禁
阅读全文
摘要:1. 影响数据库应用程序性能最重要的因素 1.1. JDBC驱动 1.1.1. JPA底层使用了JDBC 2. 瘦驱动 2.1. 为了让Java应用程序的内存占用很小 2.2. 依赖数据库服务器来完成更多的处理工作 3. 胖驱动 3.1. 工作从数据库移至Java应用程序 3.2. 进行更多处理、消
阅读全文
摘要:1. JPA 1.1. 性能直接受底层JDBC驱动性能的影响 1.2. 性能提升是通过改变实体类的字节码来实现的 1.2.1. 在类加载到JAR文件或者由JVM运行之前增强字节码的方法 1.2.1.1. 在编译过程中完成的 1.2.1.2. 在实体类编译完成后,它们会被传递给一个特定实现的后置处理器
阅读全文
摘要: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. 编译阈值 1.1. 一旦代码执行到一定次数,就达到了它的编译阈值,编译器就会认为它有足够的信息来编译代码 1.2. 在当前的JVM中,优化阈值的意义不大 1.2.1. 从JDK 7以及更早期遗留下来的 1.3. -XX:CompileThreshold=N 1.3.1. 当禁用分层编译时有效
阅读全文
摘要: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. 堆指代Java堆 1.2. 原生内存指代JVM的非堆内存 1.2.1. 包括C堆 1.2.2. 非堆内存就是原生内存 1.2.3. 一些常见的JDK类常常会使用原生内存,请确保正确使用这些类 1.3. 一个应用程序总的内存占用 1.3.1. JVM使用的原生内存和堆内存的总和
阅读全文
摘要:1. 通用规则 1.1. 不要假设问题出在堆空间 1.2. 谨慎地创建对象并尽快丢弃它们 1.3. 使用更少的内存是提高垃圾回收器效率最好的办法 1.3.1. 减少内存使用是一个重要的目标 1.3.2. 和大多数性能优化主题一样,将精力集中于最大化利用现有内存会更有帮助 1.4. 对象重用方式 1.
阅读全文
摘要:1. 减少内存使用 1.1. 减少堆内存的使用 1.1.1. 使用更少的内存意味着堆被填满的频率会降低,需要的GC周期会更少,其效果也可以成倍增强 1.1.2. 更少的新生代回收意味着对象的晋升年龄增加的频率降低 1.1.3. 对象晋升到老年代的可能性也降低了 1.1.4. Full GC周期(或者
阅读全文
摘要:1. 对象重用 1.1. 原因 1.1.1. 许多对象的初始化成本很高,权衡了增加的GC时间之后,还是重用对象的效率更高 1.2. 只适用于初始化成本很高且数量较少的一组对象 1.2.1. 被重用的对象会在堆中停留很长时间。如果堆中有大量对象,创建新对象的空间就更少了,因此GC操作会更频繁。 1.3
阅读全文
摘要:1. 垃圾回收器 1.1. 对象可以在被需要时创建,不再使用时由JVM自动回收 1.2. GC是查找不再使用的对象,然后回收这些对象相关内存的过程 1.2.1. 找到不使用的对象、回收其内存、压缩堆内存 1.3. 优化垃圾回收器比跟踪指针引起的bug要容易得多(且耗时更少) 1.4. VM必须定期搜
阅读全文
摘要: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. 随着堆的大小增加,停顿的持续时间也会增加 1.2. 停顿发生的频率确实会降低,但是停顿的持续时间会拖慢整体性能 1.3. 操作系统进行的交换对JVM是不公开的 1.3.1. 操作系统要将数据从磁盘交换到RAM,这是一个代价高昂的操作 1.4. 首要规则是设定堆的大小永远
阅读全文
摘要:1. 元空间(metaspace) 1.1. 当JVM加载类时,它必须记录这些类的某些元数据,这些数据占据的一个单独的堆空间,即元空间 1.2. 元空间里的信息只在编译器和JVM运行时使用,它所保存的数据被称为类元数据(class metadata) 1.2.1. 对于终端用户,元空间是不透明的 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. G1垃圾回收器 1.1. 垃圾优先(garbage first) 1.2. 在堆内离散的区域上进行操作 1.2.1. 默认大约有2048个 1.2.2. 代的区域不需要是连续的 1.2.3. 可能属于老年代 1.2.3.1. 并发后台线程寻找没有被引用的对象时,一些区域会比其他区域有更多的垃圾
阅读全文