Java 试图理解JVM';s的JIT行为

Java 试图理解JVM';s的JIT行为,java,jvm,jit,Java,Jvm,Jit,我正在玩-XX:+printcomilation标志。在一个紧密的循环中运行一个相对复杂的操作大约3天,我已经完成了26K次迭代,这些迭代都是相同的,但我仍然看到JIT的发生: 135245570 11820 3 org.apache.xerces.impl.XMLDTDScannerImpl::setDTDHandler (6 bytes) made zombie 135245571 12195 3 oracle.net.ano.AnoCom

我正在玩-XX:+printcomilation标志。在一个紧密的循环中运行一个相对复杂的操作大约3天,我已经完成了26K次迭代,这些迭代都是相同的,但我仍然看到JIT的发生:

135245570 11820       3       org.apache.xerces.impl.XMLDTDScannerImpl::setDTDHandler (6 bytes)   made zombie
135245571 12195       3       oracle.net.ano.AnoComm::i (11 bytes)
135245592 9715   !   4       org.springframework.jdbc.support.JdbcUtils::closeStatement (41 bytes)   made zombie
135245592 10054   !   3       com.google.common.cache.LocalCache$Segment::get (210 bytes)   made zombie
135245605 12196       3       oracle.jdbc.driver.T4CMAREngineStream::marshalB1Array (14 bytes)
136786126 12197   !   4       net.sf.log4jdbc.sql.jdbcapi.ConnectionSpy::prepareStatement (69 bytes)
136786158 9045   !   3       net.sf.log4jdbc.sql.jdbcapi.ConnectionSpy::prepareStatement (69 bytes)   made not entrant
137012330 12198   !   3       java.net.InetAddress::getAddressesFromNameService (245 bytes)
137012337 12201       3       java.net.URI$Parser::parse (265 bytes)
137012343 12203       3       java.net.URI::access$1002 (7 bytes)
137012344 11499       3       sun.nio.cs.US_ASCII$Decoder::decode (62 bytes)   made zombie
137012347 12202   !   3       java.net.URI$Parser::parseAuthority (256 bytes)
137012350 12199   !   3       java.net.InetAddress::checkLookupTable (99 bytes)
137012352 12200   !   3       java.net.InetAddress::cacheAddresses (52 bytes)
137045611 12204       4       java.util.concurrent.Executors$RunnableAdapter::call (14 bytes)
137045710 9432       3       java.util.concurrent.Executors$RunnableAdapter::call (14 bytes)   made not entrant
137048986 12205       3       oracle.jdbc.driver.T4CMAREngine::marshalKEYVAL (129 bytes)
137077651 12206   !   3       oracle.jdbc.driver.OracleCallableStatementWrapper::registerOutParameter (297 bytes)
137077666 12207   !   3       oracle.jdbc.driver.OracleCallableStatement::registerOutParameter (329 bytes)
138816046 12208       4       oracle.net.ano.AnoComm::a (34 bytes)
138816051 11867       3       oracle.net.ano.AnoComm::a (34 bytes)   made not entrant
138816051 10955       3       java.util.Hashtable$Enumerator::next (27 bytes)   made zombie
138884752 12209       3       java.net.AbstractPlainSocketImpl::finalize (5 bytes)

发生这种情况的原因是什么?

即使代码路径始终相同,并且Hotspot不太可能找到新的热点(这可能会触发jitted块的大规模失效),它仍然可以由于其他原因使它已jitted的一些块失效


这取决于JIT引擎是如何实现的,看看那些
制造的僵尸
制造的非进入者
,很明显,您遇到了一些使JIT生成的代码块无效并触发新编译的特定条件。

即使代码路径始终相同,Hotspot也不太可能找到新的热点(这可能会触发JIT块的大规模无效),由于其他原因,它仍然可以使某些已jit的块无效


这取决于JIT引擎是如何实现的,看看那些
制造的僵尸
制造的非进入者
,你显然遇到了一些特定的条件,这些条件使JIT生成的代码块无效并触发了新的编译。

“相对复杂的操作”和“紧密的循环”这是一个矛盾。如果操作在循环内,则可能是复杂操作或紧密循环。在前一种情况下,可以想象它仍然偶尔采用不同的代码路径。所谓紧循环,我的意思是它只是一遍又一遍地做同样的事情。操作相对复杂(读写多个表),但应该始终采用相同的代码路径。“相对复杂的操作”和“紧密循环”是矛盾的。如果操作在循环内,则可能是复杂操作或紧密循环。在前一种情况下,可以想象它仍然偶尔采用不同的代码路径。所谓紧循环,我的意思是它只是一遍又一遍地做同样的事情。该操作相对复杂(读取和写入多个表),但它应该始终采用相同的代码路径。但什么会使哈希表枚举器下一个方法无效?我运行了大约2周,重新编译速度明显减慢,但仍然一直在发生。但是什么会使哈希表枚举器下一个方法无效呢?我运行了大约2周,重新编译的速度明显减慢,但仍然一直在发生。