vlambda博客
学习文章列表

翻·《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工作区间。


        你可以列举包含编译器指令的文档,当你开始使用命令行开始一个程序时。你也可以用调式命令添加或移除指令从一个已经运行的程序中。


  • 写指令

    

  1.     写一个指令文档

  2.     写一个指令编辑器

  3.     写一个方法模式在指令编辑器中

  4.     写一个内联指令选项

  5.     使用Enable功能防止选项重复


  • 理解指令

    

  1.     默认指令是什么?

  2.     指令是如何应用于代码上的?

  3.     编译控制器和向下兼容


  • 指令文件的命令

    

  1.     编译器指令和命令行

  2.     编译器指令和调试命令

  3.     指令如何在指令栈中排序

    


写指令

    

    本文检查编译器控制选项和准备写指令。


编译器控制选项


    这些选项有编译的说明,选项提供了清晰的方法上下文,需要使用不同的类型,编译器可用的选项也不同。


选项
说明
值类型
默认值
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 值是方式模式类型,详情请看“在编译器指令中写一个方法模型”。

    默认的指令提供编译选项的默认值。详情看“默认的指令是啥”。



写一个指令文档


        个人的编译指令写在一个指令文件里,只有指令文件而是一些个人的指令才能被加到有效指令栈中。


  1. 创建一个以“.json”文件。写指令文件使用JSON子集的格式(???? 啥动词),有一些添加和删减。


  2. 添加以下的语法作为一个能工作的模板:

  3. [     //指令集

          {  //指令块

             //第一个指令

           },

          {   //指令快

              //第二个指令

          }

    ]

    这个模板的组成:

    指令集 :a.一个存指令块的数值,用[]包起来;b.只有一个指令块时方括号可以去掉。

     指令块:a.由大括号包起来;b.包含一个指令;c.一个指令文件可以有任意数的指令块;d.指令块之间用“,”分开;e.最后一个指令块可以不用“,”。

     指令:a.每个指令都要写在指令块里面;b.一个指令文件拥有很多指令块时也拥有多样的指令。

       注释:a.用“//”打头;b."//"只能管一行。


    3.仿照模板,在你的指令文档里添加或移除各个指令块。


    4.在每个指令块里,写一个编译指令。详情看“写一个编译指令”。


    5.如有有必要请重新排序你的指令,在文件里排序指令时意义重大的,越靠近数据的开头优先级越高。更多的详情信息请看“指令在指令栈中排序?” 和“指令器如何使用代码?”