[讨论] 关于OopMap

pulsar_lxl 2014-09-04
看了R大的这篇文章http://rednaxelafx.iteye.com/blog/1044951,对OopMap的作用有了了解,但是还是不明白它是怎么生成的,以及它的作用域是多大,是针对每个方法产生一个OopMap,还是针对一个对象,抑或一段代码产生一个OopMap。因为文章里说了针对JIT,会在一个循环外产生OopMap,如果循环中引用了多个对象,那会产生一个OopMapSet么?
请大神指教!
rink1969 2014-09-06
你可以把oopMap简单理解成是调试信息。
在源代码里面每个变量都是有类型的,但是编译之后的代码就只有变量在栈上的位置了。
oopMap就是一个附加的信息,告诉你栈上哪个位置本来是个什么东西。

这个信息是在jit编译时跟机器码一起产生的。因为只有编译器知道源代码跟产生的代码的对应关系。
每个方法可能会有好几个oopMap,就是根据safepoint把一个方法的代码分成几段,每一段代码一个oopMap,作用域自然也仅限于这一段代码。

循环中引用多个对象,肯定会有多个变量,编译后占据栈上的多个位置。那这段代码的oopMap就包含多条记录咯。

pulsar_lxl 2014-09-08
rink1969 写道
你可以把oopMap简单理解成是调试信息。
在源代码里面每个变量都是有类型的,但是编译之后的代码就只有变量在栈上的位置了。
oopMap就是一个附加的信息,告诉你栈上哪个位置本来是个什么东西。

这个信息是在jit编译时跟机器码一起产生的。因为只有编译器知道源代码跟产生的代码的对应关系。
每个方法可能会有好几个oopMap,就是根据safepoint把一个方法的代码分成几段,每一段代码一个oopMap,作用域自然也仅限于这一段代码。

循环中引用多个对象,肯定会有多个变量,编译后占据栈上的多个位置。那这段代码的oopMap就包含多条记录咯。



赞,谢谢指教,我再消化一下
LeafInWind 2014-09-08
一个方法对应一个oopMapSet,这是一个以pc值为key,以oopMap为value的字典。所以会需要多个oopMap,是因为在不同的pc上同一个栈位置上可能存放不同的变量,因此仅仅一个oopMap无法记录所有的信息。或者也可以换句话说,即oopMap是pc dependent。
Global site tag (gtag.js) - Google Analytics