草庐IT

读Java性能权威指南(第2版)笔记07_即时编译器上

1. 概览1.1. 即时编译器是Java虚拟机的核心1.1.1. just-in-timecompiler,简称JITcompiler1.1.2. 即时编译器会频繁地使用寄存器1.2. 编译型语言1.2.1. 程序是以二进制(编译后的)代码的形式发布的1.2.1.1. 汇编代码是针对特定CPU的1.2.1.2. 兼容的CPU可以执行同一个二进制文件1.2.2. 如C++和Fortran1.3. 解释型语言1.3.1. 同样的程序源代码就可以在任何CPU上运行1.3.2. 如PHP和Perl1.4. 中间地带1.4.1. 编译为一种中间的低级语言1.4.1.1. Java字节码1.4.1.2. 

读Java性能权威指南(第2版)笔记07_即时编译器上

1. 概览1.1. 即时编译器是Java虚拟机的核心1.1.1. just-in-timecompiler,简称JITcompiler1.1.2. 即时编译器会频繁地使用寄存器1.2. 编译型语言1.2.1. 程序是以二进制(编译后的)代码的形式发布的1.2.1.1. 汇编代码是针对特定CPU的1.2.1.2. 兼容的CPU可以执行同一个二进制文件1.2.2. 如C++和Fortran1.3. 解释型语言1.3.1. 同样的程序源代码就可以在任何CPU上运行1.3.2. 如PHP和Perl1.4. 中间地带1.4.1. 编译为一种中间的低级语言1.4.1.1. Java字节码1.4.1.2. 

读Java性能权威指南(第2版)笔记08_即时编译器中

1. 编译阈值1.1. 一旦代码执行到一定次数,就达到了它的编译阈值,编译器就会认为它有足够的信息来编译代码1.2. 在当前的JVM中,优化阈值的意义不大1.2.1. 从JDK7以及更早期遗留下来的1.3. -XX:CompileThreshold=N1.3.1. 当禁用分层编译时有效1.3.2. 默认值是10001.3.3. 降低这个标志的值可以改善使用C2编译器的应用程序的启动时间1.3.3.1. 可能会导致一些方法被编译,而这些方法本来是永远都不会被编译的1.4. 编译器使用的计数器会随着方法和循环的执行增加计数,但是它们也会随着时间的推移而减少1.4.1. 计数器只是方法或循环最近热度

读Java性能权威指南(第2版)笔记08_即时编译器中

1. 编译阈值1.1. 一旦代码执行到一定次数,就达到了它的编译阈值,编译器就会认为它有足够的信息来编译代码1.2. 在当前的JVM中,优化阈值的意义不大1.2.1. 从JDK7以及更早期遗留下来的1.3. -XX:CompileThreshold=N1.3.1. 当禁用分层编译时有效1.3.2. 默认值是10001.3.3. 降低这个标志的值可以改善使用C2编译器的应用程序的启动时间1.3.3.1. 可能会导致一些方法被编译,而这些方法本来是永远都不会被编译的1.4. 编译器使用的计数器会随着方法和循环的执行增加计数,但是它们也会随着时间的推移而减少1.4.1. 计数器只是方法或循环最近热度

读Java性能权威指南(第2版)笔记04_ Java SE API技巧下

1. 异常1.1. 代码应该仅在发生意料之外的事情时抛出异常1.1.1. 防御性编程性能好1.2. 异常的处理成本未必很高1.2.1. 应该只在适当的时候使用1.2.2. 栈越深,处理异常的成本就越高1.3. 对于频繁创建的系统异常,JVM会优化获取栈轨迹的性能开销1.4. 在异常中禁用栈轨迹有时可以提高性能,但会丢失一些关键信息2. 日志2.1. 一直开启GC日志2.2. 基本原则2.2.1. 在日志的数据和日志的级别之间找到平衡2.2.2. 使用细粒度的日志记录器2.2.2.1. 开启过多的日志通常会改变生产环境,使原来的问题无法显现2.2.3. 即使没有开启日志,也很容易在无意间写出具有

读Java性能权威指南(第2版)笔记04_ Java SE API技巧下

1. 异常1.1. 代码应该仅在发生意料之外的事情时抛出异常1.1.1. 防御性编程性能好1.2. 异常的处理成本未必很高1.2.1. 应该只在适当的时候使用1.2.2. 栈越深,处理异常的成本就越高1.3. 对于频繁创建的系统异常,JVM会优化获取栈轨迹的性能开销1.4. 在异常中禁用栈轨迹有时可以提高性能,但会丢失一些关键信息2. 日志2.1. 一直开启GC日志2.2. 基本原则2.2.1. 在日志的数据和日志的级别之间找到平衡2.2.2. 使用细粒度的日志记录器2.2.2.1. 开启过多的日志通常会改变生产环境,使原来的问题无法显现2.2.3. 即使没有开启日志,也很容易在无意间写出具有

读Java性能权威指南(第2版)笔记09_即时编译器下

1. CPU相关代码1.1. AdvancedVectorExtensions1.1.1. AVX1.1.2. 2013年,Intel为Haswell以及之后的芯片引入了AVX21.1.3. 2016年,Intel又引入了AVX-512指令1.1.4. JDK8不支持这些指令1.1.5. JDK11支持1.2. -XX:UseAVX=N1.2.1. 01.2.1.1. 不使用AVX指令1.2.2. 11.2.2.1. 使用IntelAVX1指令(对于SandyBridge和之后的处理器)1.2.3. 21.2.3.1. 使用IntelAVX2指令(对于Haswell和之后的处理器)1.2.4.

读Java性能权威指南(第2版)笔记09_即时编译器下

1. CPU相关代码1.1. AdvancedVectorExtensions1.1.1. AVX1.1.2. 2013年,Intel为Haswell以及之后的芯片引入了AVX21.1.3. 2016年,Intel又引入了AVX-512指令1.1.4. JDK8不支持这些指令1.1.5. JDK11支持1.2. -XX:UseAVX=N1.2.1. 01.2.1.1. 不使用AVX指令1.2.2. 11.2.2.1. 使用IntelAVX1指令(对于SandyBridge和之后的处理器)1.2.3. 21.2.3.1. 使用IntelAVX2指令(对于Haswell和之后的处理器)1.2.4.

读Java性能权威指南(第2版)笔记03_ Java SE API技巧中

1. 缓冲I/O1.1. 对于文件和套接字,压缩和字符串编码的操作,必须适当地对I/O进行缓冲1.1.1. 两个流操作的是字节块(来自缓冲流)而不是一系列的单字节(来自ObjectOutputStream),它们会运行得更好1.2. InputStream.read()1.3. OutputStream.write()1.4. 操作的是单个字符1.5. FileInputStream.read()1.6. FileInputStream.write()1.7. 慢1.8. 二进制数据的文件I/O1.8.1. BufferedInputStream或BufferedOutputStream来包装

读Java性能权威指南(第2版)笔记03_ Java SE API技巧中

1. 缓冲I/O1.1. 对于文件和套接字,压缩和字符串编码的操作,必须适当地对I/O进行缓冲1.1.1. 两个流操作的是字节块(来自缓冲流)而不是一系列的单字节(来自ObjectOutputStream),它们会运行得更好1.2. InputStream.read()1.3. OutputStream.write()1.4. 操作的是单个字符1.5. FileInputStream.read()1.6. FileInputStream.write()1.7. 慢1.8. 二进制数据的文件I/O1.8.1. BufferedInputStream或BufferedOutputStream来包装