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.
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.
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. 计数器只是方法或循环最近热度
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. 计数器只是方法或循环最近热度
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. 即使没有开启日志,也很容易在无意间写出具有
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. 即使没有开启日志,也很容易在无意间写出具有
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.
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.
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来包装
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来包装