翻·《java虚拟机指南》-开个头
1.java虚拟机技术概述
这个技术文档讲述java虚拟机的实现和Java HotSpot 技术的特征。
自适应编辑器:一个合格的解释器被用于启动应用程序。当一个应用程序启动时,对代码分析以检测性能瓶颈和热点。JavaHotSpot VM 编辑代码的性能关键点来提升性能,但不编辑很少使用的代码(程序的大部分)。Java HotSpot VM 使用适应性的编辑器决定如何使用内联技术优化已编译的代码。
快速内存分配和垃圾收集:Java HotSpot 技术提供给对象快速分配内存的能力,和高效艺术性的垃圾收集器。
线程同步:Java HotSpot 技术提供线程处理能力,它被设计满足大规模的使用,多处理服务器之间共享内存。
在Oracle JRE8和更早之前,JVM的实现方式各不相同,但客户端虚拟机、服务器虚拟机和最基础的虚拟机都支持配置,用作客户端、服务器和嵌入式系统。因为现在大多数系统都是利用服务器虚拟机,在后面版本中只提供VM的实现。
2.编译器控制
编译控制器提供一种通过编译指令选项控制JVM编译的方法,控制等级是运行时管理和特定方法。
一个编译器指令告诉JVM改怎样进行编译,在控制编译过程中提供精度的方法上下文。你能用编译器写一个小巧的JVM编译测试代码运行而不需要从新启动整个JVM,你也可以在编译器上创建一个bug工作区间。
你可以列举包含编译器指令的文档,当你开始使用命令行开始一个程序时。你也可以用调式命令添加或移除指令从一个已经运行的程序中。
写指令
写一个指令文档
写一个指令编辑器
写一个方法模式在指令编辑器中
写一个内联指令选项
使用Enable功能防止选项重复
理解指令
默认指令是什么?
指令是如何应用于代码上的?
编译控制器和向下兼容
指令文件的命令
编译器指令和命令行
编译器指令和调试命令
指令如何在指令栈中排序
写指令
本文检查编译器控制选项和准备写指令。
编译器控制选项
这些选项有编译的说明,选项提供了清晰的方法上下文,需要使用不同的类型,编译器可用的选项也不同。
选项 |
说明 |
值类型 |
默认值 |
Enable |
如果设置成false,将隐藏指令和使它失效。这个选项用于阻止选项重复,详情看“使用Enable选项阻止重复”。 | bool |
true |
Exclude |
从编译中排除方法。 | bool |
false |
BreakAtExecute |
设置一个打断标志,当debug虚拟机进入特殊方法时打断执行。 |
bool |
false |
BreakAtCompile |
设置一个打断标志,当debug虚拟机进入特殊方法时打断编译。 | bool |
false |
Log |
在日志中放一个指定的方法。你必须先设置命令行选项 -XX:+LogCompilation.默认值是false在日志里放置所有编译方法。 | bool |
false |
printAssembly |
通过依赖外部库 disassemble.so打印汇编字节码和原生方法。 |
bool | false |
PrintInlining |
打印内联方法及所在的位置。 |
bool |
false |
PrintNMethods |
在他们生成时打印 nmethods |
bool |
false |
BackgroundCompilation |
做后台任务的编译方法,以解释器模式执行直到后台编译器执行结束,false表示编译器方法执行前台任务。 |
bool |
false |
ReplayInline |
使相同的CIReplay函数与全局选项一致,但在每个方法基础之上。 |
bool |
false |
DumpReplay |
使相同的CIReplay函数与全局选项一致,但在每个方法基础之上。 | bool |
false |
ComplilerDirective sIgnoreCompileCommands |
忽视所有编译指令 |
bool |
false |
DisableIntrinsic |
以方法协调标准禁止使用内联函数 |
ccstr |
没有默认值 |
inline |
以方法协调标准强力或阻止内联方法 | ccstr[] |
没有默认值 |
BlockLayoutByFrequency |
从热路径移动不常执行的分支 | bool |
true |
PrintOptoAssembly |
使用外连库 disassembler.so 打印编译器的汇编代码。这需要JVM的deug模式下。 |
bool |
false |
PrintIntrinsics |
打印被使用内部方法及它的位置。 |
bool |
false |
TraceOptoPipelining |
跟踪管道信息。类似相应的全局选项,但是基于每个方法基础上。为了放慢或加快debug创建。 | bool |
false |
TraceOptoOutput |
跟踪管道信息,类似相应的全局选项.为了放慢或加快debug创建。 | bool |
false |
TraceSpilling |
跟踪多变的溢出 |
bool |
fasle |
Vectorize |
通过向量寄存器执行并行计算 | bool |
false |
VectorizeDebug |
通过向量寄存器执行并行计算,这需要JVM的debug模式。 | intx |
0 |
CloneMapDebug |
允许你检查CloneMap 从矢量化中生成。这需要JVM的debug模式. | bool |
false |
IGVPrintLevel |
编译器图表被打印在Oracle's Hotspot IGV的特殊锚点,值越高粒度越大。 |
intx |
0 |
MaxNodeLimit |
给节点设置最大值在一个单独方法编译期间使用。 | intx |
80000 |
一个ccstr 值是方式模式类型,详情请看“在编译器指令中写一个方法模型”。
默认的指令提供编译选项的默认值。详情看“默认的指令是啥”。
写一个指令文档
个人的编译指令写在一个指令文件里,只有指令文件而是一些个人的指令才能被加到有效指令栈中。
创建一个以“.json”文件。写指令文件使用JSON子集的格式(???? 啥动词),有一些添加和删减。
添加以下的语法作为一个能工作的模板:
[ //指令集
{ //指令块
//第一个指令
},
{ //指令快
//第二个指令
}
]
这个模板的组成:
指令集 :a.一个存指令块的数值,用[]包起来;b.只有一个指令块时方括号可以去掉。
指令块:a.由大括号包起来;b.包含一个指令;c.一个指令文件可以有任意数的指令块;d.指令块之间用“,”分开;e.最后一个指令块可以不用“,”。
指令:a.每个指令都要写在指令块里面;b.一个指令文件拥有很多指令块时也拥有多样的指令。
注释:a.用“//”打头;b."//"只能管一行。
3.仿照模板,在你的指令文档里添加或移除各个指令块。
4.在每个指令块里,写一个编译指令。详情看“写一个编译指令”。
5.如有有必要请重新排序你的指令,在文件里排序指令时意义重大的,越靠近数据的开头优先级越高。更多的详情信息请看“指令在指令栈中排序?” 和“指令器如何使用代码?”